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

Compare commits

..

607 Commits

Author SHA1 Message Date
Taloth Saldono 97c3863efb Temporary mock data while services isn't updated with new endpoint. 2017-05-13 00:19:34 +02:00
Taloth Saldono 7b4cb4145d Ability to blacklist and rename indexer urls via services. 2017-05-13 00:19:34 +02:00
Taloth Saldono 766520b851 Renamed DownloadClientStatus to DownloadClientInfo to avoid conflict. 2017-05-13 00:16:53 +02:00
Taloth Saldono 14144bd4d9 Renamed IndexerStatus.IndexerId to ProviderId. 2017-05-13 00:16:53 +02:00
Taloth Saldono 7b0e40d5d0 Replaced Url with BaseUrl in most indexers. 2017-05-13 00:16:53 +02:00
Taloth Saldono 2dbf095fd5 Fixed: Regression in Quality fallback by extension. 2017-05-13 00:13:12 +02:00
Taloth Saldono 2a86f8c241 Fixed: UI Series lookup autocomplete with diacritics.
Closes #1915
2017-05-11 20:37:07 +02:00
Taloth Saldono c184e7ddcc Fixed: Multiple Scene Mapping exception even when the mappings pointed to the same tvdbid.
Closes #1917
2017-05-11 06:32:09 +02:00
Taloth Saldono 95c81f8905 Fixed exception in MountCheck if RootDirectory cannot be found. 2017-05-10 23:08:17 +02:00
Mark McDowall db15949704 Fixed: Better error message when searching for episode without an absolute episode number 2017-05-09 20:00:21 -07:00
Mark McDowall a63248401e Fixed: Width in Kodi Metadata 2017-05-09 20:00:21 -07:00
Kyse 1b32411219 New: Health Check warning if series folder is mounted with 'ro' option on linux
Closes #1867
2017-05-09 21:07:24 +02:00
Taloth Saldono cd7368512d Fixed Scene Mapping error message. 2017-05-09 17:26:45 +02:00
Taloth Saldono a5bc4a8f11 Added ability to filter scene mappings by regex via services. 2017-05-06 14:05:49 +02:00
Drew Freyling 2ae41a3404 remove redundant IE meta tag as we use http header instead 2017-05-05 22:26:28 -07:00
Drew Freyling 312136a57c use cleancss for minification 2017-05-05 22:26:10 -07:00
Mark McDowall 53e51af9c7 Fixed: Don't import the same file again
Closes #929
2017-05-02 22:52:59 -07:00
Mark McDowall f852ca91c0 Clean up GrabbedReleaseQualityFixture 2017-05-02 22:52:11 -07:00
Mark McDowall 413dd51db1 Fix unit test 2017-05-02 22:06:18 -07:00
Mark McDowall 9d93fc1092 New: Prevent automatic import if file quality differs from grabbed release quality 2017-05-02 18:44:42 -07:00
Lloyd Sparkes 0bbb82c67f Update SocksWebProxy to fix #1641 2017-04-29 17:11:55 +02:00
Mark McDowall cd8ae0d036 Added test to validate season pack being grabbed when only one episode is monitored
Closes #1862
2017-04-28 17:37:29 -07:00
Taloth Saldono d726a7acb2 Fixed: Sonarr UI Authentication cookie should be placed on path (UrlBase) instead of domain alone.
fixes #1874
2017-04-27 23:33:04 +02:00
Mark McDowall c94636e2b3 Placeholders for language profile migrations 2017-04-26 11:45:07 -07:00
Taloth Saldono 3749f3e2e5 Fixed missing icon preventing detailed explanation validation errors explanations from appearing. 2017-04-25 19:16:43 +02:00
Taloth Saldono 1f93bec055 Updated Transmission tests. 2017-04-24 21:53:40 +02:00
Taloth Saldono a003a89b14 Fixed: Sonarr not importing torrents in Vuze if the torrent already finished seeding and was stopped. 2017-04-24 21:08:50 +02:00
Taloth Saldono 35fca89dad Fixed: Incorrect imports with Vuze when torrent contains a single file.
fixes #1805
2017-04-23 17:24:07 +02:00
Mark McDowall e97e13e897 Fixed: Smarter application update completed message
Closes #1864
2017-04-21 10:52:31 -07:00
Taloth Saldono f8d5f1fc94 Added -Scrambled to the ReleaseGroup cleanup list. 2017-04-14 20:47:17 +02:00
Taloth Saldono 46a1ff3e2d Tweaked parser to handle S01.Ep01.
closes #1849
2017-04-14 20:44:14 +02:00
Mark McDowall f36d5dc881 Moving and Removing of downloads in usenet clients
Fixed: Moving items triggered via post-processing scripts
Fixed: Removing failed downloads fromusenet clients
2017-04-12 17:41:22 -07:00
Taloth Saldono f8b8fcfb8d Fixed: Handling of priority setting when queueing is disabled in qBittorrent.
fixes #1841
2017-04-12 20:49:28 +02:00
Taloth Saldono de7f68570e Fixed: Regression causing nzbToMedia imports to be copied instead of moved. 2017-04-12 20:49:28 +02:00
Taloth Saldono fa006d85fd New: Check whether an existing episode file was deleted before grabbing an upgrade, to avoid timing issues in combination with Ignore Deleted Episodes. 2017-04-12 20:46:36 +02:00
Mark McDowall 413ce1d9a7 Fixed: Double periods in extra file names after rename 2017-04-11 20:32:34 -07:00
Mark McDowall 41f769790d Fix issue adding a series when TitleSlug for another series is null
Fixed: Adding a series when an existing series is has a null slug
Closes #1840
2017-04-11 17:57:29 -07:00
Taloth Saldono b63bcd16a7 Fixed: Sample check has too little margin for 2 min anime with 1 minute files. Lowered to 15 sec. 2017-04-10 17:46:08 +02:00
Mark McDowall b485bdaeec Fixed: Unable to execute custom scripts if IMDB ID is null
Fixes #1825
2017-04-08 08:20:57 -07:00
Taloth Saldono b70d167911 Apply Cleanse to Exception Data as well. 2017-04-08 12:38:39 +02:00
Taloth Saldono 924fe80997 Fixed RssParser test. 2017-04-07 22:36:39 +02:00
Taloth Saldono cd450a44bf Should not empty install folder, MirrorFolder will take care of it. 2017-04-07 22:09:49 +02:00
Taloth Saldono 35741b9cae Added a few more files to ignore during file copy. 2017-04-07 22:07:42 +02:00
Taloth Saldono c9d1807670 Sentry should use CleanseLogMessage. 2017-04-07 20:42:39 +02:00
Taloth Saldono 94886e767b Fixed: UnsupportedFeedException should log error for each item 2017-04-07 19:32:12 +02:00
Taloth Saldono e4c3418987 Fixed: Failing Newznab capabilities request should trigger automatic indexer backoff logic. 2017-04-07 19:10:08 +02:00
Taloth Saldono 5613ab05e0 Fixed: Sabnzbd/NzbGet not processing history items properly after last update. 2017-03-31 18:56:45 +02:00
Taloth Saldono 372442af2c fixed broken tests. 2017-03-30 23:20:49 +02:00
Taloth Saldono 28c45f941b Cleanup of commented out code. 2017-03-30 22:28:00 +02:00
Marcelo Castagna ea1616586f Fixed: Import from torrent Download Station should move since DS maintains an internal copy for seeding. 2017-03-30 22:26:11 +02:00
Mark McDowall e48600da42 New: TvMaze and IMDB IDs added to custom script environment variables 2017-03-29 18:22:14 -07:00
Mark McDowall 5d9d2e684e New: Paths for deleted files when upgrading an existing file 2017-03-29 13:22:37 -07:00
Mark McDowall 2e392e0f5e New: Additional variables for custom script on grab events 2017-03-29 13:12:37 -07: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
Taloth Saldono f7e3d9b4c2 Fixed: DownloadStation regression in queue detection. 2017-02-23 08:58:50 +01:00
Taloth Saldono 6d9a952bd1 Fixed: DownloadStation proxy failing if non-bt/nzb downloads exist. 2017-02-22 19:10:39 +01:00
margaale 3501e33722 turn task type enum into string 2017-02-22 14:10:12 -03:00
margaale fa89d33900 Fix for key not found, returning a generic error instead 2017-02-22 14:10:12 -03:00
Mark McDowall 0af48fb2e8 Fixed: NZBGet delete:scan treated as failure
Fixes #1394
2017-02-22 00:31:51 -08:00
Mark McDowall 7e9f0d0522 Updated analytics help text 2017-02-21 11:18:29 -08:00
Taloth Saldono 1f8bd8e1e9 Fixed typo in DL station hint text. 2017-02-21 18:19:55 +01:00
Taloth Saldono 2855090005 Fixed: Removed Womble indexer. 2017-02-21 17:03:10 +01:00
Taloth Saldono 060b9f6fd1 Fixed: Updated BTN api url. 2017-02-21 16:40:20 +01:00
margaale 9304547c95 Test if the OutputPath specified by TvDirectory/TvCategory exists. 2017-02-21 16:40:16 +01:00
margaale c56c83e169 New: Added support for nzb downloads in Synology Download Station. 2017-02-20 18:57:11 +01:00
Mark McDowall c6fa883662 Fixed: Saving nyaa settings
Fixes #1687
2017-02-16 09:19:28 -08:00
Mark McDowall 4043d07ab1 Verify LimeTorrents parsing 2017-02-15 22:30:03 -08:00
Mark McDowall 8af3348e7f Fixed: Slow loading root folders caused them to never appear 2017-02-15 22:30:03 -08:00
Taloth Saldono 49d0d4c357 Renamed DownloadStation implementation to TorrentDownloadStation. 2017-02-15 21:32:25 +01:00
Taloth Saldono 47b1157b96 Fixed: Permanently removed kickass rss/api implementation. 2017-02-15 21:32:21 +01:00
Taloth Saldono adc79f0eba Added more sensible error for BTN html response. 2017-02-15 20:40:32 +01:00
Taloth Saldono 6b117427f8 Fixed double question mark in log. 2017-02-15 20:40:32 +01:00
Mark McDowall 7884dd9a39 New: Added omgwtfnzbs Newznab prefix 2017-02-13 22:46:26 -08:00
Marcelo Castagna 45d8b1e2ad Fixed: Delete data when removing torrent from Download Station
fixes #1676
2017-02-13 20:17:52 +01:00
Marcelo Castagna cf306f4aba Throw exception with error message return by diskstation (#1672) 2017-02-12 20:20:16 +01:00
Mark McDowall d7aa23388e New: Update Media info for Windows/macOS to 0.7.92.1 2017-02-11 16:29:49 -08:00
margaale 82a99b7f80 New: Added support for Synology Download Station as torrent client. 2017-02-11 21:06:23 +01:00
Taloth Saldono 2f6d9e191e Fixed: Ignore .nfs* files during copy actions since those files are special NFS files that should never be touched.
fixes #1552
2017-02-09 19:33:28 +01:00
Taloth Saldono 0782a15979 Remove backslashes from BTN release titles.
fixes #1075
2017-02-09 19:33:28 +01:00
vertigo235 ddd119a4eb New: Add paused option for NZBGet
Closes #346
2017-02-08 20:36:39 -08:00
Taloth Saldono d4788b4cae Added tests for edge-case.
closes #1147
2017-02-08 22:10:30 +01:00
Taloth Saldono 812999423b Fixed: Don't try to show diskspace usage non-existing drives.
fixes #1639
2017-02-07 23:06:14 +01:00
Taloth Saldono 657730f4d2 Fixed: /var/lib/docker no longer shows up in DiskSpace. Caused warnings if the user used docker with zfs storage driver.
fixes #1663
2017-02-07 22:44:31 +01:00
Taloth Saldono 0255eb3aca Fixed: Increased timeout when waiting for rtorrent to finish adding torrent.
fixes #1665
2017-02-07 22:36:47 +01:00
Mark McDowall fc15daa37e New: Improve parsing of audio channels from MediaInfo output 2017-02-04 22:04:12 -08:00
Mark McDowall 10264a5bfb New: Ensure folders are sorted alphabetically when importing
Closes #294
2017-02-04 22:04:12 -08:00
Mark McDowall ef044f1ff5 Update README.md 2017-01-27 20:56:07 -08:00
Mark McDowall ef03e9e9a7 Fixed: Proper port validation for download clients and connections
Closes #1642
2017-01-26 22:35:16 -08:00
Mark McDowall 3bd7c09acf Strip 2160p from titles before parsing 2017-01-23 23:53:15 -08:00
Keivan Beigi fbd2f8dea4 Fixed: Growl download notification title 2017-01-22 13:07:21 -08:00
Keivan Beigi 15e07f72d4 Better Runtime names 2017-01-20 20:54:04 -08:00
Keivan Beigi f25bfe9d28 don't log migrations during regular DB tests 2017-01-20 20:33:10 -08:00
Keivan Beigi d5e720c404 include os name, runtime name in version tag for sentry 2017-01-20 20:16:34 -08:00
Keivan Beigi c9a8ebc2e6 Create anonymous hash to detect issue duplication 2017-01-20 20:15:49 -08:00
Mark McDowall 5e7e816c03 AsOsAgnostic paths for root folder tests 2017-01-20 09:02:36 -08:00
vertigo235 f56076a135 Fixed: Pushover silent priority 2017-01-19 23:51:58 -08:00
Mark McDowall 54dd527f01 Exclude .grab and Plex Version folders 2017-01-19 01:38:37 -08:00
Mark McDowall c6eb19c04d Exclude .grab and Plex Version folders
New: Ignore .grab folder (Plex DVR)
New: Ignore Plex Versions folder (Media Optimizer)
Closes #1610
2017-01-18 20:15:32 -08:00
Mitchell Cash 38b65ba27d Cleanup README (#1622) 2017-01-18 12:31:20 -08:00
Keivan Beigi a2a49ce934 Revert "New: Upgraded SQLite binares for macOS"
This reverts commit 8d91f18823.
2017-01-18 10:04:36 -08:00
Keivan Beigi 047d5a4388 Revert "New: Upgraded SQLite binaries for Windows (3.16.0)"
This reverts commit 111e401a2c.
2017-01-18 10:04:26 -08:00
Keivan Beigi aae69ff49a Revert "Upgraded System.Data.SQLite to 1.0.104.0"
This reverts commit 01e2f4e7e5.
2017-01-18 10:04:07 -08:00
Sander Ploegsma da451cfe03 Option to convert ical feed items to all-day events 2017-01-17 22:36:48 +01:00
Keivan Beigi 01e2f4e7e5 Upgraded System.Data.SQLite to 1.0.104.0 2017-01-17 11:47:46 -08:00
Keivan Beigi 8aacc61c50 New: Switched nyaa.se to HTTPS 2017-01-17 11:47:46 -08:00
Keivan Beigi 111e401a2c New: Upgraded SQLite binaries for Windows (3.16.0) 2017-01-17 11:47:45 -08:00
Keivan 8d91f18823 New: Upgraded SQLite binares for macOS
Upgraded from 3.8.1 to 3.9.1
2017-01-17 11:47:45 -08:00
Keivan Beigi cea6469ab8 Use nameof 2017-01-17 11:47:06 -08:00
Mark McDowall ced7a7dce2 New: Prefer anime batch releases over single episode releases 2017-01-14 12:28:22 -08:00
Mitchell Cash 20a2cfe260 Use DOGnzb name as the default rather than the URL 2017-01-14 08:45:29 -08:00
Drew Freyling 5b0a285b84 New: Reduced image file sizes 2017-01-12 13:10:19 -08:00
Mark McDowall 68ea8a551c Fixed: Parsing of SABnzbd develop version 2017-01-12 00:38:56 -08:00
Keivan Beigi 2e36d35815 Added app.manifest to indicate proper windows 10 support 2017-01-06 16:02:57 -08:00
Keivan Beigi ed2e4d0f1d Sentry will now back-off if it's API key is revoked. 2017-01-06 11:55:54 -08:00
Keivan Beigi 0bdc137093 Smaller sentry payload, send machine name as user name 2017-01-05 17:43:24 -08:00
Keivan Beigi cd7e208efa Revert "Use line number instead of message for sentry fingerprint"
This reverts commit 5f339c0a92.

# Conflicts:
#	src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs
2017-01-05 17:43:24 -08:00
Keivan Beigi 73840dcacc The great logger.Error cleanup! 2017-01-05 17:43:24 -08:00
Keivan Beigi e45d4f60a4 Moved Fatal logging to use nlog patterns 2017-01-05 17:43:24 -08:00
Keivan Beigi 782efcfaf1 Added a one hour debounce of reporting the same errors to sentry 2017-01-05 17:43:24 -08:00
Keivan Beigi 76a7d4f866 Use line number instead of message for sentry fingerprint 2017-01-05 17:43:24 -08:00
Keivan Beigi d61976251e Apparently RemoveTarget doesn't do what you expect it to do. 2017-01-05 10:46:16 -08:00
Keivan Beigi 2487e8ed49 Don't report errors that don't have exceptions 2017-01-05 10:25:50 -08:00
Keivan Beigi 54bc642476 Fixed: OS Version detection shouldn't break user agents. Fixes #1611 2017-01-05 10:25:05 -08:00
Keivan Beigi 6577b0a721 Don't include null in sentry fingerprint if even has no exception 2017-01-04 23:28:51 -08:00
Keivan Beigi bcd67dee5e Added fingerprint to sentry events to allow better grouping 2017-01-04 20:01:43 -08:00
Keivan Beigi e6705db743 Added platform version error handling 2017-01-04 19:15:47 -08:00
Keivan Beigi dd7fdd8ace Disable Sentry Reporting based on analytics flag 2017-01-04 17:56:29 -08:00
Keivan Beigi a1f112e62f Added branch name to Assembly Info 2017-01-04 14:20:13 -08:00
Keivan Beigi 053c730799 Added Sentry error reporting 2017-01-04 14:19:53 -08:00
Keivan Beigi 61579cfb7e Consider /buildAgent/ to be a none production startup path 2017-01-04 14:19:50 -08:00
Keivan Beigi 92d706a10d Updated bindingRedirect for Newtonsoft.Json 2017-01-04 14:18:38 -08:00
Keivan Beigi 6ae5829439 Removed duplicated code from ContainerBuilders 2017-01-04 14:18:37 -08:00
Keivan Beigi 8252a2a60f RIP 2017-01-04 00:19:32 -08:00
Keivan Beigi 009dc14805 Added Windows Server detection logic 2017-01-03 18:56:28 -08:00
Keivan Beigi e0ff25d5be New: switched nyaa to HTTPS 2017-01-03 18:37:46 -08:00
Keivan Beigi ad7d571b24 New: Better platform detection specifically for Non-Windows Systems 2017-01-03 18:37:23 -08:00
Keivan Beigi 598b5322b7 Fixed linux build 2017-01-03 18:31:48 -08:00
Keivan Beigi 76505bdaa1 Added Rider dir to git ignore. 2017-01-03 18:30:21 -08:00
Keivan Beigi d64d35361c Revert "Upgraded Moq" (Mono compatibility)
This reverts commit 3140d5d4b0.
2017-01-03 10:25:01 -08:00
Mark McDowall d5ef451bb4 Fixed: Parsing of 2017x123 episode format 2017-01-02 11:46:25 -08:00
Keivan Beigi 3140d5d4b0 Upgraded Moq 2016-12-28 22:41:48 -08:00
Keivan Beigi fdb5ccdae1 Updated Newtonsoft.Json from 6.0.6 to 9.0.1 2016-12-28 22:41:47 -08:00
Keivan Beigi a2ce435239 Upgraded Nlog, NCrunch 2016-12-28 22:41:46 -08:00
Keivan Beigi a34e69b35b Notification API Cleanup 2016-12-27 23:52:20 -08:00
Keivan 03b83ed226 Rename Metadata Dir to fix build in *nix 2016-12-24 12:13:16 -08:00
Keivan eafe79450e Rename Metadata Dir Step 1 2016-12-24 12:13:15 -08:00
Keivan f286dba40a Rename QBittorent Dir to fix building in *nix 2016-12-24 12:13:14 -08:00
Keivan 448f579723 Rename QBittorent Dir Step 1 2016-12-24 12:13:13 -08:00
Keivan Beigi 1562081235 Upgraded MediaInfo from 0.7.74 to 0.7.91 2016-12-23 13:51:01 -08:00
Keivan Beigi 0214c8e0f0 Removed unused using statements 2016-12-23 13:45:24 -08:00
Keivan Beigi f16dd069b5 Upgraded DDay.iCal to Ical.Net 2016-12-21 20:38:37 -08:00
Keivan Beigi aba613acd1 Because it's 2016! 2016-12-21 20:38:37 -08:00
Keivan Beigi 2e36538dcd Environment variables sometimes lie! 2016-12-21 20:38:35 -08:00
Keivan Beigi c42e4d682c more kosher regex group names. 2016-12-21 20:38:35 -08:00
Keivan Beigi 327536b684 Added NoOp Performance Counter Manager 2016-12-21 20:38:35 -08:00
Mark McDowall 7dbacf105d Fixed: Parsing of some anime releases that use Episode after the title 2016-12-21 18:08:02 -08:00
margaale 8d776abb48 Fixed: Handle download clients sending invalid content-type header.
DownloadStation incorrectly surrounds charset with double-quotes. whereas the http standard specifies they must be without quotes.

fixes #1586
2016-12-20 20:54:44 +01:00
Mark McDowall 7f8093de92 Fixed: Use Category from qBittorrent when set instead of Label 2016-12-13 23:32:46 -08:00
Mark McDowall c1de7f26d1 Added test for 4 digit season number and series title with year 2016-12-13 23:32:46 -08:00
Mark McDowall 4a82d30d3d Fixed: Parsing of mini episodes that contain the year in the title 2016-12-13 23:32:46 -08:00
Keivan Beigi da52e60f36 Upgraded Nlog/RestSharp/Selenium 2016-12-12 11:17:15 -08:00
Keivan Beigi cf58e52f40 Upgraded Nancy!!!! 2016-12-12 11:17:15 -08:00
Keivan Beigi 2a7ae96906 upgraded nbuilder/automoq 2016-12-12 11:17:15 -08:00
Keivan Beigi 053f6fcaeb Upgrade fluentmigrator 2016-12-12 11:17:15 -08:00
Keivan Beigi 0c75d0bb03 Upgraded nunit/fluentassertion 2016-12-12 11:17:15 -08:00
Thijs Tijsma 0c9b5dc97e Added Visual Studio folder (.vs) to the ignore file. 2016-12-11 15:33:48 -08:00
Mark McDowall c99e92e6af New: Validate PMS version before performing a library update 2016-12-08 10:23:53 -08:00
Mark McDowall 3f64c01d5b Fixed: Partial library updates for Plex Media Server 1.3 2016-12-07 12:58:23 -08:00
Mark McDowall f022dae1fa Fixed: Partial library updates for Plex Media Server 1.3 2016-12-06 17:05:00 -08:00
Mark McDowall 52ad8cf37f Fixed: Error handling of valid, empty responses from Plex Media Server 2016-12-06 09:11:50 -08:00
Mark McDowall 3d20fd8f96 Fixed: Error handling of valid, empty responses from Plex Media Server 2016-12-05 09:34:17 -08:00
Lloyd Sparkes cf662291d5 Fixed: Lingering Socks5 Proxy sockets when proxy is using dynamic ips 2016-12-04 16:43:18 +01:00
Mark McDowall 43d85bf59d Fixed: Parsing of some Plex server responses before 1.3 2016-12-02 10:39:12 -08:00
ARTbird309 4a149c356b New: Telegram notifications
Closes #1355
2016-11-30 19:08:29 -08:00
Chris Allen 740fc9154f Shorten 'MPEG-2 Video' to 'MPEG2'. 2016-11-30 17:54:22 -08:00
Mark McDowall 0a657302f7 New: Support for Plex Media Server 1.3.0's new JSON responses 2016-11-23 16:38:57 -08:00
Mark McDowall 7b09b259a8 Fixed: Don't delete extra files after unlinking an episode file that still exists on disk 2016-11-23 16:38:40 -08:00
Taloth Saldono b093be3f4e Added additional gdiplus check. 2016-11-05 22:26:30 +01:00
Mark McDowall 3c8b263694 Update CONTRIBUTING.md 2016-11-02 16:56:54 -07:00
Mark McDowall 43c5d03f9a Fix GetAncestorFolders tests under mono 2016-11-02 15:08:39 -07:00
Taloth Saldono 9fbe06ad68 New: Added support to override Copy vs Move import logic for DownloadedEpisodesScan API and Manual Import UI. 2016-11-02 20:28:45 +01:00
Mark McDowall db899a9bb8 New: Move subtitles/other extra files to Sonarr's Recycle Bin instead of permanently deleting 2016-11-02 11:12:24 -07:00
Mark McDowall d3890bd712 New: Health check warning for macOS when running from App Translocation folder 2016-11-02 11:12:24 -07:00
Mark McDowall 1a61796092 Fixed: mono 4.4.2 won't trigger mono version error 2016-11-02 11:12:24 -07:00
Taloth Saldono 1251e294cd Saving settings failed if value was null. 2016-11-02 00:02:14 +01:00
Taloth Saldono 0411b82e65 Fixed: Mount handling logic of net namespaces as seen on QNAP.
fixes #1483
2016-11-01 22:53:53 +01:00
Taloth Saldono 9519f3137c Compile error when fixing FileBrowser not displaying drive letters on Windows. 2016-11-01 20:30:58 +01:00
Taloth Saldono f8d97cac7d Fixed: FileBrowser not displaying drive letters on Windows.
fixes #1535
2016-11-01 20:22:12 +01:00
Mark McDowall f2ecbe776b Added and fixed qBittorent tests 2016-10-28 13:28:21 -07:00
Mark McDowall 1ac442d0e6 Removed unused disk provider 2016-10-28 13:14:18 -07:00
Mark McDowall 5f2aeb0cea Fixed: Failing database migration of metadata files without extensions 2016-10-28 13:04:22 -07:00
Mark McDowall 2ece05cd1e Fixed: Email connection test reporting success incorrectly
Fixes #1524
2016-10-28 11:02:36 -07:00
Casey Bodley 25a3f83ebc New: Remove completed torrents from qBittorrent
Fixes #1316
2016-10-27 20:07:42 -07:00
Mark McDowall cdce65a922 Added TODO to remove ToPP SABnzbd status 2016-10-27 18:02:38 -07:00
Mark McDowall 8f73a51522 Fixed: Handling of some really long qBittorrent ETAs 2016-10-27 17:57:18 -07:00
Mark McDowall bc438a6a63 Fixed: Handle SABnzbd Propagating status 2016-10-26 21:09:53 -07:00
Mark McDowall 4167ffe11a Capture exit code of nunit to avoid using failed tests as exit code 2016-10-25 14:00:27 -07:00
Mark McDowall 6fb1aa85d0 Fixed: Parsing of some poorly named standard episode release names
Closes #1522
2016-10-25 10:16:05 -07:00
Mark McDowall eb8ef6c337 Fixed: login page being returned instead of unauthorized response 2016-10-24 20:41:19 -07:00
Mark McDowall c076f1ddb1 Update omgwtfnzbs URL
Closes #1520
2016-10-24 18:49:58 -07:00
karaambaa eeff79b288 Added Sonarr-icon to Boxcar notification
Now there is a small Sonarr icon next to the Boxcar message.
2016-10-20 09:36:00 -07:00
Mark McDowall 697a62da0a Fixed typo 2016-10-18 13:53:25 -07:00
Mark McDowall f1a289cc74 Re-added accidentally removed anime parsing Regex 2016-10-18 13:52:15 -07:00
Mark McDowall c39a26d9e0 Fixed: Parsing of multiple absolute episode number releases 2016-10-17 17:51:55 -07:00
Taloth Saldono f2ccf94835 Fixed: Updated IPTorrents url validation to changed format.
fixes: #1493
2016-10-10 23:32:03 +02:00
Taloth Saldono 19d625c6c5 Fixed: Changed Quality Parser to avoid matching tags in the Episode title instead of the Quality tags. 2016-10-10 23:32:01 +02:00
Taloth Saldono cd3b6000a0 Tweaked Nyaa Request Generator to avoid offset=1. 2016-10-10 23:31:58 +02:00
Mark McDowall ff33f15bac Fixed: Import episodes in season packs in numerical order
Closes #1485
2016-10-04 10:20:48 -07:00
Mark McDowall 50a0e9514e Fixed: Default redirect URL for forms auth will use URL Base if configured 2016-10-01 15:40:04 -07:00
Taloth Saldono 7ef1ca8a00 Fixed: Tweaked ratelimit logic for rarbg api. 2016-09-29 21:42:08 +02:00
Mark McDowall e0d1e08f94 Upgraded mono version check (3.10 minimum and 4.4.x)
New: Health warning if mono version is less than 3.10
New: Health error if running mono 4.4.x
2016-09-26 18:47:33 -07:00
Taloth Saldono 9fae76015a Fixed: Calendar api again includes series images. (Nzb360)
fixes #1473
2016-09-24 23:08:31 +02:00
Taloth Saldono 17bf438cad New: uTorrent differential api support to handle larger lists of torrents without hogging the api.
Fixes #1109
2016-09-24 23:07:08 +02:00
Chris Heath c0b0567c23 Join: Device ID entry and better error handling
New: Optionally limit Join notifications to specific devices
Fixes #1455
2016-09-23 16:13:46 -07:00
Taloth Saldono edc1e0b8d1 Fixed: Filter qbittorrent torrent list on newer versions.
fixes #1470
ref #1347
2016-09-23 21:42:52 +02:00
kaso17 cd79b42f5f add downloadvolumefactor and uploadvolumefactor torznab attributes (#1464)
Using the attributes it's possible to signal states like freeleech/neutral leech/double upload
2016-09-23 21:08:50 +02:00
Taloth Saldono dc82e66dde Clarified min/max size rejection message by including the episode runtime. 2016-09-23 20:51:37 +02:00
Taloth Saldono b034d0c1b3 Fixed: Cleanup unused Tags during housekeeping. 2016-09-23 20:51:36 +02:00
Taloth Saldono 36a3e86882 New: Added filter by tag to iCal feed.
closes  #1430
2016-09-23 20:51:34 +02:00
Mark McDowall e76fb8c90b Fixed: Issue loading settings on some systems 2016-09-20 22:08:04 -07:00
Mark McDowall e6288148ad Fixed: Suppress warning log messages when unable to parse non-video files 2016-09-20 22:08:04 -07:00
Mark McDowall bf8d68a873 Fixed: Version check for SABnzbd develop 2016-09-20 22:08:04 -07:00
Taloth Saldono 080e2e9eff New: Added query parameter to ical feed to list premiers only.
fixes #1463
fixes #1442
2016-09-21 00:28:36 +02:00
Taloth Saldono e3310e590c Fixed: prevents autofill on new password fields in settings. 2016-09-20 22:06:33 +02:00
Taloth Saldono a0b4d3a38d Removed conflicting criteria from IsProduction check. 2016-09-20 21:30:46 +02:00
Taloth Saldono a72b856fb8 Fixed: Added config validation to ensure NzbGet KeepHistory isn't set to 0. 2016-09-20 21:30:17 +02:00
Mark McDowall 522ef9d8d5 Don't append the extension when using ParsePath 2016-09-19 21:33:18 -07:00
Mark McDowall a486bff40b Fixed: Migrations using old SQLite versions (Prior to 3.7.15)
Closes #1466
2016-09-19 16:10:40 -07:00
Mark McDowall 0de1f3f17a Fixed: Ignore extrafanart subfolder when scanning for extra files 2016-09-18 22:24:32 -07:00
Mark McDowall 755fdce227 Fixed: Generating metadata files after importing episode files 2016-09-18 22:19:08 -07:00
Mark McDowall cd8659e684 Fixed: Store metadata file extensions 2016-09-18 11:30:22 -07:00
Mark McDowall a621f0d49b Fixed: Prevent duplicate parsing of extra files 2016-09-18 11:04:56 -07:00
Mark McDowall 2e96c4e798 New: Parse existing subtitles and extra files
Towards #459
2016-09-17 01:27:15 -07:00
Taloth Saldono 816cf608fc Fixed: Added fallback and log errors when Tls1.2 clashes with https certificate with obsolete md5 hash. 2016-09-13 22:57:07 +02:00
Taloth Saldono 713e109bc9 Fixed api blacklist, history, wanted/missing and wanted/cutoff requiring sortKey, now defaulting to an appropriate value (airDateUtc/date desc for most).
fixes #1452
2016-09-10 23:05:34 +02:00
Taloth Saldono 4bf3ef45b0 Fixed: Auto-Updater rollback logic tries to restore unchanged files. 2016-09-10 12:56:27 +02:00
Taloth Saldono 09530b238f Fixed: Removed requirement to disable sabnzbd pre-check for sab version 1.1.0 onward. 2016-09-07 19:58:18 +02:00
Taloth Saldono 5414dadffc Fixed stupid error. 2016-09-03 12:57:30 +02:00
Mark McDowall 5482fa3ae0 New: Support for TLS 1.1 and 1.2 connections when only .net 4.5 is installed. 2016-09-03 12:11:06 +02:00
Taloth Saldono 6e8480d7cb Added additional categories to NZBFinder preset. 2016-09-03 11:57:10 +02:00
Ashley Broughton 7c7cfc0b7d Changed exit statement to "Press enter to exit..." to match use of ReadLine() (#1425) 2016-09-03 11:53:56 +02:00
Taloth Saldono 4e051bfde2 Merge branch 'pr/n1446_Awarua-' into develop 2016-09-03 11:48:39 +02:00
Taloth Saldono 356e14ac5b Cleanup 2016-09-03 11:48:23 +02:00
Taloth Saldono 97d0ddb6e9 Fixed: Sabnzbd 1.1.0 rc4 queue api changed time format. 2016-09-03 11:42:40 +02:00
Björn Dahlgren 17f6841426 Fixed: Updated HDBits api to api changes.
Closes #1448
2016-09-03 11:18:19 +02:00
Dion Woolley a6a7732cd5 Fixed issue #1445 where sabnzbd has changed the time format reported for downloads 2016-09-03 13:13:55 +12:00
Mark McDowall aa37b65842 Fixed tests for EpisodeFileMovingService 2016-09-02 12:26:04 -07:00
Mark McDowall 6ac9e5ec18 Don't blow if driveFormat is null when looking up DriveType
Closes #1444
2016-08-30 22:23:49 -07:00
Mark McDowall 2d54ca5d47 New: Ability to include unmonitored episodes in the iCAL feed
Closes #1442
2016-08-29 21:28:45 -07:00
Mark McDowall 422371d118 Fixed: Episode import when the series folder had a trailing slash and folder was not on disk 2016-08-29 21:22:25 -07:00
Mark McDowall 77574ec555 Fixed: Parsing absolute episode numbers preceeded by Episode
Closes #1441
2016-08-29 11:59:50 -07:00
Mark McDowall 3b385e8738 Fixed: Parsing of a multi-episode anime formats 2016-08-25 21:46:22 -07:00
Taloth Saldono 7f6101a6bc Better Captcha message. 2016-08-20 19:37:47 +02:00
Mark McDowall 28f6777f9a Fixed media info test 2016-08-16 21:12:18 -07:00
Chris Allen e7275af073 VideoBitDepth and AudioChannels in Filename examples 2016-08-16 16:48:28 -07:00
Mark McDowall 5fcd65ef57 Fixed: MediaInfo.AudioChannels for some eac3 and mp3 files 2016-08-16 16:46:27 -07:00
Taloth Saldono 222ed1eb4b Changed startup loglevel to avoid incorrect sonarr.debug/trace log entry. 2016-08-16 22:10:03 +02:00
Taloth Saldono 4486317888 Fixed: Manual Import failing to parse series title from certain nested folders. 2016-08-14 21:05:35 +02:00
Taloth Saldono 206ff12b71 Added .editorconfig 2016-08-13 22:22:24 +02:00
Taloth Saldono 73fb216e6f New: Added CAPTCHA support to Rarbg. 2016-08-13 22:10:42 +02:00
Mark McDowall e9eab0ae48 Audio codec E-AC-3 will be EAC3 in filenames 2016-08-13 11:40:12 -07:00
Christopher Heath 626d94d435 New: Join notifications
Closes #1197
2016-08-13 11:37:55 -07:00
Mark McDowall e4adc1d3a1 Fixed: Include afpfs mount points in free space checks
Fixes #1399
2016-08-13 11:27:58 -07:00
Mark McDowall c3f9a0336c Move platform files to proper folders 2016-08-11 20:30:46 -07:00
Mark McDowall 04ca1e4569 Always include decimal place for AudioChannels 2016-08-11 18:06:03 -07:00
Mark McDowall 459715b9b4 Fixed UpdateMediaInfoService tests 2016-08-11 16:20:40 -07:00
Mark McDowall db4b0de5e2 New: MediaInfo VideoBitDepth and AudioChannels 2016-08-11 15:56:35 -07:00
Taloth Saldono 914f799f9d New: Added support to save .magnet to blackhole directory.
fixes #1406
2016-08-05 23:10:15 +02:00
Taloth Saldono e2272dcca3 Reject m2ts (bluray) raw releases from BTN as well. 2016-08-05 22:18:33 +02:00
Taloth Saldono 2b1c97ffa4 Fixed: AnimoTosho RSS feed size parsing.
Also added handling for multiple enclosure elements.

ref #1384
2016-08-04 19:36:13 +02:00
Taloth Saldono b80d6c74ad Api errors now log statuscode too. 2016-07-31 23:40:07 +02:00
Taloth Saldono 6f2dd5d2fa Improved Quality lookup. 2016-07-31 14:43:08 +02:00
Mark McDowall 1218dd255f Fixed: Allow series to be added unmonitored through the API
Closes #1404
2016-07-27 12:08:49 -07:00
Mark McDowall 5bf9b069fc Fixed: Slack Icon is optional 2016-07-27 11:31:51 -07:00
Mark McDowall 2ab9bb4fce Fixed: Incorrect matching of date in title
Closes #1401
2016-07-26 22:31:03 -07:00
Taloth Saldono 87d00abdf1 Adjusted Gzip stream to reduce response times. 2016-07-24 01:00:48 +02:00
Taloth Saldono 19aded7a15 Order the pipeline registration process. 2016-07-24 01:00:44 +02:00
Taloth Saldono a2536deef0 Fixed: Significantly improved api performance. 2016-07-24 01:00:41 +02:00
Taloth Saldono ff6737314f Added additional index to episodes table to speed up certain queries. 2016-07-24 01:00:39 +02:00
Taloth Saldono 4fc150f77b Reset srcset on failed load. 2016-07-24 01:00:37 +02:00
Taloth Saldono 90b5947a19 Fixed Deluge and BTN cleanse password logic. 2016-07-24 01:00:36 +02:00
Taloth Saldono c7d445d1c1 New: Added raw DVD check for BTN to prevent those pesky VIDEO_TS downloads.
fixes #r1377
2016-07-24 01:00:34 +02:00
Taloth Saldono c4a3bc3d2f Fixed cookie tests with expired dates. 2016-07-22 00:34:18 +02:00
Taloth Saldono 8966e5a403 Removed fanzub tests and disabled kickass tests. 2016-07-22 00:03:35 +02:00
Taloth Saldono bc94a7f921 Fixed: Forcibly disable kat when using the wrong domain. 2016-07-21 23:29:13 +02:00
Taloth Saldono f3cbc2bdd2 Fixed: Calendar arrows on Edge browser. 2016-07-21 19:29:09 +02:00
Taloth Saldono f681d43601 Fixed: XEM series with only alternate season titles. 2016-07-21 19:28:42 +02:00
Mark McDowall b232cc3081 Fixed: Delete all history for series when series is removed from Sonarr 2016-07-20 15:53:49 -07:00
Mark McDowall 857d661ff1 Fixed: Recreate log database if migration fails
Fixes: #1050
2016-07-19 18:57:36 -07:00
Mark McDowall 8255fb0b28 GHI and PR Templates 2016-07-07 12:44:32 -07:00
Mark McDowall ab63c3e83d Fixed: Parsing series title during manual import 2016-07-03 23:32:25 -07:00
Mark McDowall c1f59a55c6 Fixed: Kodi metadata AC3 audio codec
Closes #1344
2016-07-02 00:22:58 -07:00
Mark McDowall c8474701a0 Fixed: Parsing Plex Media Server version 1.0 2016-07-02 00:19:31 -07:00
Mark McDowall c206b83318 Fixed spelling mistake 2016-07-01 23:37:27 -07:00
Mark McDowall a8b9a47f5f Emby metadata name changes 2016-07-01 23:29:32 -07:00
vintage81 3e9a159466 Fixed: Adding label to torrents in qBittorrent v3.3.5
Fixes #1347
2016-06-29 18:48:18 -07:00
Mark McDowall ba817557ba Fixed: More results in season searches when KAT 2016-06-29 18:13:31 -07:00
Fossil 30ed3a4a80 Updated NZBFinder URL 2016-06-25 23:39:21 -07:00
Taloth Saldono 006dc9202b Fixed: Tweaked sample detection for short episodes. 2016-06-25 22:50:16 +02:00
Mark McDowall c2a2746ccf Fixed: Roksbox metadata generation when series certification is not available 2016-06-20 01:07:35 -07:00
Taloth Saldono 2fa0729158 Fixed series filter 'missing' since percentOfEpisodes isn't always set. 2016-06-19 00:28:01 +02:00
Taloth Saldono b3eee50892 Fixed relative path issue in Metadata handling. 2016-06-18 23:15:02 +02:00
Mark McDowall f1c007c5fe Include full grab/import message for Slack notifications 2016-06-18 10:57:18 -07:00
Mark McDowall 7c8a8f8e55 AsOsAgnostic 2016-06-16 00:45:33 -07:00
aaraujo666 a3ade09964 New: Missing episodes series filter 2016-06-16 00:00:36 -07:00
Mark McDowall 8e429239a8 Fixed: Metadata files incorrectly stored in database 2016-06-15 23:53:23 -07:00
Taloth Saldono 4783803b6b New: Part One/Two/Three/.. parser support for mini series. 2016-06-15 21:25:08 +02:00
Taloth Saldono b320a23bf8 Added better log message when indexer reached daily grab limit. 2016-06-14 23:15:41 +02:00
Taloth Saldono 32a347bdd2 Updated WEB regex. 2016-06-14 23:13:50 +02:00
Björn Dahlgren a0b0f6162f New: Kodi metadata Stream Details
Closes #1286
2016-06-14 00:39:22 -07:00
Martin Hartvig 6c287f118f New: Slack notifications
Closes #1002
2016-06-13 23:35:25 -07:00
Mark McDowall 8213f020ff Removed 6box 2016-06-13 22:08:22 -07:00
Mark McDowall d984dd41d6 Fixed: Parsing WEB releases that use spaces instead of periods
Closes #1339
2016-06-13 22:08:22 -07:00
Peter Tutervai fea5db3e4b Re-enabled calling synoindex after renaming
Fixed: On Rename connections to synoindex
2016-06-13 22:07:47 -07:00
Taloth Saldono c38973cce4 Fixed tests. 2016-06-11 00:53:55 +02:00
Taloth Saldono 958153be55 Fixed: Reduced spurious cpu usage on mono while idle. 2016-06-11 00:25:59 +02:00
Taloth Saldono d4bab775df Updated NLog to 4.3.4. 2016-06-11 00:24:07 +02:00
Mark McDowall ecf67e609e Fix regex for expanded series + episode number (S01 - E01) 2016-06-06 10:15:21 -07:00
Mark McDowall 449b15331a Fixed Hadouken tests 2016-06-03 20:46:32 -07:00
Mark McDowall f0437d1f22 Fixed: Ignore more folder names when browsing file system 2016-06-03 19:12:33 -07:00
Mark McDowall 902d6929c0 New: Hadouken torrent client support 2016-06-03 19:09:44 -07:00
phrusher d81e03fcc0 Updated to support Hadouken v5.1 and above
Fixes indentation issues

Removes AuthenticationType

Corrects FieldDefinitions
2016-06-02 19:24:13 -07:00
Viktor Elofsson abf8c684e7 Basic Hadouken v5 implementation. 2016-06-02 19:24:13 -07:00
Mark McDowall 7476d692aa New: EpisodeTitles for Custom Scripts
Closes #1263
2016-06-02 19:16:35 -07:00
Mark McDowall c25bea6470 Fixed: Parsing separated season and episode numbers (S01 - E01)
Closes #1320
2016-06-02 19:07:15 -07:00
Mark McDowall b9d67ae421 Better logger name for QualityParser 2016-06-02 10:04:41 -07:00
Mark McDowall ff3fc8de2e Replace octal characters from mounts in /proc/mounts
Fixed: Replace octal characters in mount points
Closes #1295
2016-06-01 21:24:41 -07:00
Mark McDowall e4e3770e54 Log message makes sense now 2016-05-24 18:40:07 -07:00
Taloth Saldono 498a86f850 Fixed Search tests. 2016-05-22 16:45:41 +02:00
Taloth Saldono f0ae908892 Merge remote-tracking branch 'upstream/search-delays' into develop 2016-05-22 15:57:49 +02:00
Taloth Saldono 54c17de849 New: Http/Socks proxy support.
fixes #732
2016-05-22 15:57:38 +02:00
Mark McDowall 12a1865d4d Service now depends on HTTP Service (http) 2016-05-21 23:31:39 -07:00
Taloth Saldono 9ea753011b Added round-robin over httpbin.org hosts for httpclient tests. 2016-05-21 23:02:02 +02:00
Taloth Saldono 4c39594a57 Final cleanup on proxy support. 2016-05-21 22:59:26 +02:00
Mark McDowall 67ff871cf6 FolderWritableValidator
Fixed: Information in UI when attempting to add a root folder that is not writable
Fixes #1280
2016-05-21 01:39:39 -07:00
Mark McDowall ea0982ecae Fixed: Error messages when config file is empty or contains invalid characters
Closes #1104
2016-05-21 00:22:12 -07:00
Mark McDowall 4f5d79b189 Fixed: Perform health check after download clients or indexers are removed
Closes #1304
2016-05-20 23:29:29 -07:00
Mark McDowall aec3ed16d0 Use wildcards when searching for single episodes on BTN
Fixed: Double episode searching on BTN
Closes #1305
2016-05-20 23:02:22 -07:00
Mark McDowall 2e90ea9c19 Fixed: Prefix Twitter notifications (Grabbed/Imported) 2016-05-19 18:54:49 -07:00
Igal Tabachnik a6b1a1fc0d New: Vuze torrent client support 2016-05-16 21:00:27 -07:00
Mark McDowall fd42ddec1b Fixed: Respect delays when searching after a failed DownloadRelease
Closes #1292
2016-05-12 21:02:57 -07:00
Taloth Saldono 229986033c Added logging of Sonarr API calls. 2016-05-11 21:13:31 +02:00
Taloth Saldono c249ad5dbe Using a tiered fallback is safer in case there is another data-loss and ids get reset. 2016-05-11 19:06:35 +02:00
Mark McDowall e2d6d374ab Update HttpAccept.Rss to include application/xml 2016-05-10 15:18:27 -07:00
Taloth Saldono d3adb7ac40 Fixed: HDBits release age incorrect.
fixes #1272
2016-05-10 22:19:51 +02:00
Taloth Saldono 0f1afd416b Fixed: Adjusted BTN Recent Feed (RssSync) to better use their api db indexes. 2016-05-10 21:43:34 +02:00
Mark McDowall 2f3bc61af7 Nice try uTorrent, you're not Deluge
Fixed: uTorrent error message identity crisis
2016-05-02 10:38:59 -07:00
Lloyd Sparkes 2b11ad4585 Proxy BypassList tests
Lightly refactored and updated documentation to make it easier for users
2016-05-02 11:24:51 +01:00
Lloyd Sparkes c82b90aca8 Fix tests failing due to lack of constructor less classes, after refactoring 2016-05-01 12:47:19 +01:00
Lloyd Sparkes 5fae8e7762 Updating SocksWebProxy to fix issues with POST Requests 2016-05-01 11:51:30 +01:00
Mark McDowall 319b4f13b7 Fixed: Refreshing series that have duplicate season information 2016-04-30 11:02:40 -07:00
Mark McDowall 54fda3d648 Fixed: Updating Emby Library
Closes #1267
2016-04-28 23:42:53 -07:00
Mark McDowall 2f6fded7c3 Fixed: An issue preventing access to settings due to extraneous data in the database 2016-04-27 16:18:11 -07:00
Mark McDowall 7934003b5e Fixed: Rare error when removing pending items that have been rejected 2016-04-27 16:16:43 -07:00
Taloth Saldono b479064abd Moved Proxy types around and refactored/renamed a few things. 2016-04-25 21:53:26 +02:00
Taloth Saldono 9e7927acec Create HttpProxySettingsProvider and fixed related issues. 2016-04-25 20:22:52 +02:00
Lloyd Sparkes f807e44a39 Force to IPv4 2016-04-24 17:01:01 +01:00
Lloyd Sparkes d68abc746c Bug Fixes 2016-04-24 16:56:31 +01:00
Mark McDowall 8773d38ddd Fixed: Plex Meda Server authentication 2016-04-23 13:28:07 -07:00
Lloyd Sparkes 6fdbb2b659 Fix merging issues & API changes - that conflict resolution did not detect 2016-04-23 11:06:10 +01:00
Lloyd Sparkes bfe134ee54 Proxy Support for Sonarr #732
Switch to use Port #0 which just uses the next free port
Non Functional - Code Cleanup
Tabs -> Spaces,
Opps Deleted too much
Refactoring & Code Cleanup & Move Config to DB
remove unneeded line
Clean Up Spaces
Code Review Points on the UI
FIx extra space
Clean Up unrequired changes
Add a HealthCheck.
Extra Check in ProxyCheck. Correctly deal with Socks Authentication
Remove SubModule
Add in Nuget + Tweak ProxyCheck
Code Review Points
Missed Review Point
Add Subnet Filtering, Add ProxyBypass for local addresses. UI updated for property changes.
Fix typo, and copy&paste error
Tweak URL to hit
2016-04-23 10:58:02 +01:00
Taloth Saldono f16f097b3e Fixed: Sabnzbd 1.0.1 added two new status values.
fixes #1259
2016-04-23 11:40:49 +02:00
Mark McDowall 7284ef50eb Fixed: Manual Import not scrolling after using file browser
Closes #745
2016-04-17 16:07:08 -07:00
Mark McDowall e9248e284e Return decisions when catching exceptions during decision making
Fixed: Manual Import not showing files that failed to process
Closes #1131
2016-04-17 14:17:46 -07:00
Sam Holmes aff6af1806 Update package.json license expression (#1242) 2016-04-13 08:08:20 -07:00
Taloth Saldono c0c35a0eba Updated NzbGet tests. 2016-04-09 20:45:11 +02:00
Taloth Saldono 072ca459bd Fixed: NzbGet DUPE/COPY status should be considered failure.
fixes #919
closes #693
closes #505
2016-04-09 20:28:37 +02:00
Taloth Saldono 0865306064 Fixed: Adding Nzb with {{password}} in name to NzbGet failed. 2016-04-09 20:13:58 +02:00
Taloth Saldono ac14444d34 Removed redundant logging. 2016-04-09 18:05:33 +02:00
Mark McDowall 8a6d1ef373 Release scoring 2016-04-08 13:25:50 -07:00
Mark McDowall dc694b0f34 Don't throw after catching the exception during TearDown 2016-04-08 10:16:29 -07:00
Mark McDowall 76f8cc81da Fixed: Don't force testing when updating connections, indexers or download clients 2016-04-07 17:40:52 -07:00
Mark McDowall 14f737bd60 Fixed: Set permissions on series metadata images when they are created
Closes #871
2016-04-07 17:37:16 -07:00
Mark McDowall 5942ddf9f1 Implement mono logic to not set owner/group with chown
New: Allow Owner or Group to be left blank to not set it when changing owner (mono only)
Closes #1220
2016-04-07 15:52:12 -07:00
Mark McDowall ab7b427241 Fixed: Default display time for Kodi notifications 2016-04-07 15:52:12 -07:00
Taloth Saldono 15120270b4 Disabled unreliable lookup test. 2016-04-07 00:07:49 +02:00
Taloth Saldono cc0406653a Readded logging Download Client responses. 2016-04-06 22:53:14 +02:00
Taloth Saldono 9f34127565 Better error handling in the Deluge ConnectDaemon code. 2016-04-06 22:07:25 +02:00
Taloth Saldono 71ecc96c70 Refactored IntegrationTests to work with Nunit3 VS adapter. 2016-04-06 22:06:40 +02:00
Taloth Saldono 2fa3873503 Give a couple of timing-based tests a bit more breathing room. 2016-04-06 21:35:00 +02:00
Taloth Saldono 96b7bd3b2b Merge branch 'http-uri-combine-path' into develop 2016-04-06 21:34:20 +02:00
Taloth Saldono e1ea17cabf Fixed: uTorrent api proxy would fail on specific Win10 configurations. (The Phoenix Rises)
Moved token queryparam to start since uTorrent requires it.
Fixed handling response missing an expected Set-Cookie header.
Force Cache-Control: no-cache for uTorrent.
Added Connection: KeepAlive to fix inexplicable uTorrent api failure.
2016-04-05 23:49:28 +02:00
Taloth Saldono 3a162be265 CombinePath now simple, uri resolve done via operator and CombineRelativePath. 2016-04-05 23:42:10 +02:00
Mark McDowall 502298aab9 Cleanup HttpUri.PathCombine 2016-04-03 18:47:43 -07:00
Mark McDowall edea488dbe Upgrade to NUnit3 2016-04-01 19:19:32 -07:00
vawen 2fabe2d198 New: Prevent grabbing season packs if full season hasn't aired yet
Closes #743
2016-03-29 19:44:33 -07:00
Mark McDowall f2c8156c00 ParsingService.GetEpisodes will use TVDB season number when available 2016-03-28 19:32:58 -07:00
Mark McDowall 942be364dc Treat XEM aliases as SceneSeasonNumber
Fixed: Aliases used incorrectly when TVDB season number matched the seaon number of the alias
Closes #1140
2016-03-28 19:32:25 -07:00
Keivan Beigi 44e09e2220 build.sh uses msbuild 14 2016-03-28 11:45:06 -07:00
Keivan Beigi 0fcd20ec4a use npm-cache if installed 2016-03-28 11:37:29 -07:00
Taloth Saldono 4c5707bba8 Fixed: Newznab/Torznab used wrong query if tvrageid was unknown in combination with a specific indexer capability profile. 2016-03-28 20:15:31 +02:00
Taloth Saldono 947f494e72 Fixed: Release Group detection didn't handle RLSGRP_English properly.
fixes #1198
2016-03-26 21:42:51 +01:00
Taloth Saldono 3f74a87b45 Fixed: Removed TrollHD from the RawHD detection regex since they now also release other sources.
fixes #1193
2016-03-26 20:45:52 +01:00
Taloth Saldono da0bdc5750 New: Added RERIP as REPACK (Proper). 2016-03-26 20:41:27 +01:00
Taloth Saldono 3ea59cd91b Don't set ACL if already set. 2016-03-26 19:31:12 +01:00
Taloth Saldono 9b42dc7082 Reconfigure Logging early in the process to set the correct log level. 2016-03-26 19:31:11 +01:00
Taloth Saldono 8b1c022244 Updated NLog to 4.3.0-rc1. 2016-03-26 19:31:09 +01:00
Mark McDowall e5cb8bb0bd Fixed: Some releases with date and season/episode numbers with multiple episodes on a single day
Closes #1192
2016-03-25 19:13:24 -07:00
Mark McDowall d37343bb7d Fixed: Prevent root folders from being added under the startup folder 2016-03-25 19:03:28 -07:00
Nathan 9c91f11cdc New: Safari Pinned tab icon
Closes #1122
2016-03-24 15:47:08 -07:00
Mark McDowall 444fcf5ae5 Fixed: Use new rTorrent commands when resolving magnets
Closes #1199
2016-03-24 14:35:36 -07:00
Mark McDowall 31f8e0a47a New: Windows Phone theme 2016-03-24 12:25:51 -07:00
Mark McDowall 1e0fcc877b New: Mobile Chrome theme (Android 5.0+) 2016-03-24 12:25:51 -07:00
Björn Dahlgren 1293bab868 Run gulp using npm Simplifies usage of gulp and makes sure everyone is using same version 2016-03-24 10:43:54 -07:00
GΛVĪN 9de92d18e1 Updated OS X startup script to work with macports mono 2016-03-23 22:56:45 -07:00
Mark McDowall 5a877cbd62 Fixed: RSS Sync failing due to one broken indexer 2016-03-23 19:04:35 -07:00
Taloth Saldono 99aa25bf83 New: Light green background color in Season Pass for seasons with all episodes downloaded. 2016-03-22 23:09:38 +01:00
Iain Nicol 5f66c15b91 Fixed: Allow underscore when validating hostnames
This is particularly useful on FreeNAS.  It uses underscores in the hostnames when creating plugin jails.
2016-03-22 20:06:41 +00:00
Mark McDowall af220c7f7b ItemViewContainer didn't exist sometimes for root folders
Fixed: Error displaying existing root folders in some cases
Closes #1170
2016-03-21 15:02:09 -07:00
Mark McDowall 59e71a4cd9 Include series type for CustomScript 2016-03-19 19:35:02 -07:00
Mark McDowall 6b1a4c4198 Always validate settings when testing thingies
Fixed: Validation skipped when saving connections
2016-03-18 15:42:19 -07:00
Mark McDowall 1072c5247c On grab for custom scripts
New: On Grab handling for Custom Scripts
2016-03-17 18:40:58 -07:00
Taloth Saldono 6508e920fe New: Added (fairly strict) regex for the new scene WEB quality = WEB-DL. 2016-03-17 21:03:01 +01:00
Taloth Saldono 1154e0eeb3 Add WebException handlers to prevent them reaching the UI. 2016-03-17 20:53:11 +01:00
Taloth Saldono 2d96914bfa Send Http auth without waiting for challenge. 2016-03-17 20:15:53 +01:00
Taloth Saldono 70494c3674 Adding magnet to qbit should use FormData not QueryParam. 2016-03-17 19:49:05 +01:00
Taloth Saldono d68ad98176 Fixed: UsenetBlackhole not importing since latest develop. 2016-03-17 08:01:07 +01:00
Taloth Saldono eb70a6419c Fixed: Not uploading nzbs to Nzbget on linux since previous develop. 2016-03-17 07:53:23 +01:00
Taloth Saldono 22aa759abc Fixed: Rarbg indexer broken on develop. 2016-03-17 07:32:45 +01:00
Taloth Saldono 19b8fb6d8b Merge branch 'blackhole-delay' into develop 2016-03-15 21:47:18 +01:00
Taloth Saldono d4bc835b1c New: Delaying Blackhole imports while they're still being updated. 2016-03-15 21:46:40 +01:00
Taloth Saldono b99d82cccc Ensure auto-generated mocks are also registered in the test container. 2016-03-15 21:46:39 +01:00
Taloth Saldono 25d481d5d9 Migrated all Download client proxies from RestSharp to HttpClient. 2016-03-11 20:36:03 +01:00
Taloth Saldono 23871503a2 Replaced Uri with HttpUri. 2016-03-11 20:36:01 +01:00
Taloth Saldono 7c54fa70d7 Added support for FormData (AddFormParameter and AddFormUpload), which automatically gets converted to multipart/form-data or application/x-www-form-urlencoded. 2016-03-11 20:35:59 +01:00
Taloth Saldono 2ffbbb0e71 Refactored HttpRequest and HttpRequestBuilder, moving most of the logic to the HttpRequestBuilder.
Added ContentSummary to be able to describe the ContentData in a human readable form. (Useful for JsonRpc and FormData).
2016-03-11 20:35:58 +01:00
Taloth Saldono 7818f0c59b Fixed: Don't purge xem scene mapping cache when new series gets added. 2016-03-11 17:31:06 +01:00
Taloth Saldono 03e2adc332 Sort episodes in calendar by ep nr if airdate is the same. 2016-03-11 16:54:41 +01:00
Taloth Saldono e6ab4196de Revert "Fixed: Sort episodes on the api by episode number when they air at the same time."
This reverts commit 9ffc0ec521.
2016-03-11 16:53:22 +01:00
Mark McDowall f2784d3ec2 New: Trakt links on series details 2016-03-10 20:48:24 -08:00
Mark McDowall ef3d508b31 Fixed: Anime season search won't search for missing episodes 2016-03-10 20:24:07 -08:00
Taloth Saldono 9ffc0ec521 Fixed: Sort episodes on the api by episode number when they air at the same time. 2016-03-06 00:43:04 +01:00
Mark McDowall b598add64e Updated FluentValidation 2016-03-04 00:39:17 -08:00
Mark McDowall 47446515d1 Update CONTRIBUTING.md 2016-03-02 10:03:37 -08:00
Taloth Saldono e5de7fb8cf Fixed: Don't trigger SceneMapping update and Housekeeping right on the startup event. 2016-03-01 23:50:09 +01:00
Taloth Saldono 55e870f295 Added version to logged exceptions. 2016-03-01 22:05:34 +01:00
Taloth Saldono 1485c83ab6 Don't hammer thexem, kthxbai. 2016-03-01 22:05:23 +01:00
Mark McDowall e8d1623e96 Default Plex Media Server "Update Library" to true 2016-02-25 19:19:31 -08:00
Taloth Saldono 3bc6bf9e99 Don't die in MonoTorrent if nodes is an empty string. 2016-02-25 21:40:55 +01:00
Taloth Saldono 949d8bf49b Fixed: Warn if user has movie/date sorting enabled in Sabnzbd for the Sonarr category. 2016-02-25 20:39:42 +01:00
Taloth Saldono c29e49da95 Clarified error message in MatchesFolderSpecification. 2016-02-25 19:44:29 +01:00
Taloth Saldono 79c565911c New: Changed the default of 'Use Hardlinks instead of Copy' to true. Most ppl seem to want that anyway. 2016-02-25 19:19:02 +01:00
Taloth Saldono bb9a0371c5 Added TorrentRss test for ExtraTorrents, no other changes. 2016-02-25 19:18:46 +01:00
Taloth Saldono e945231ab3 Fixed: Newznab should reject a Torznab feed. 2016-02-21 11:37:01 +01:00
Mark McDowall c1298d162e Womble's has size parsing now 2016-02-18 18:39:23 -08:00
Taloth Saldono f005edfcf0 Don't use Sonarr as ReleaseGroup if the pattern contains an advanced prefix/suffix. 2016-02-18 23:32:38 +01:00
Taloth Saldono 59c68ec6cc Write debug/trace log files separately to prevent trace from quickly rolling over debug. 2016-02-18 23:32:37 +01:00
Taloth Saldono a5077b0b1b Replaced <removed> with (removed) for the log cleanser so it doesn't mess with forums. 2016-02-18 23:32:36 +01:00
Mark McDowall a22c0499d5 Couple more anime version test cases 2016-02-17 23:06:44 -08:00
Mark McDowall c38608e3cf Fixed Protocol returned for release/push endpoint 2016-02-17 20:26:37 -08:00
Taloth Saldono 3b57194d47 Fixed: Parses size in Wombles Description field so min/maxsize checks works on Wombles feed. 2016-02-17 23:22:22 +01:00
Taloth Saldono 21c901eab4 fixed failing torznab test 2016-02-17 21:52:55 +01:00
Taloth Saldono 9ad8311dd6 New: Use PageSize reported by newznab/torznab caps instead of hardcoded 100.
ref Jackett/Jackett#27
2016-02-17 21:23:27 +01:00
Taloth Saldono df84028c90 Added DrunkenSlug and SimplyNZBs as Newznab presets. 2016-02-17 21:23:26 +01:00
Mark McDowall 7cb1e91ba1 Handle 1.1x version from Sabnzbd 2016-02-16 23:49:13 -08:00
Mark McDowall 974a7276c3 New: Explicitly enforce SABnzbd minimum version of 0.7.0 2016-02-16 22:40:12 -08:00
Mark McDowall f0ca2bc11e Fixed: Don't collapse episode titles when episode titles contain Part x only 2016-02-16 21:28:32 -08:00
Mark McDowall cb43888496 Fixed: Use Protocol over DownloadProtocol for ReleasePushModule
DownloadProtocol is still supported for backwards compatibility
2016-02-16 20:21:20 -08:00
Taloth Saldono 34d5fb1aa0 Fiddled with the Back to the Top button a bit so it's better visible on the white background, also only on widescreen now. 2016-02-15 22:56:10 +01:00
Taloth Saldono 72f0085ef7 Fixed: DownloadedEpisodesScan API command couldn't be used to process individual files. 2016-02-15 21:55:53 +01:00
Taloth Saldono f25f5abced Cleaned up 2160p changes and added migration and tests.
Also reserved the quality ids for WEBRip etc.
2016-02-14 00:08:42 +01:00
Björn Dahlgren 94323f79e7 New: Added support for UltraHD (2160p) quality 2016-02-14 00:08:15 +01:00
Taloth Saldono bdb1076100 Updated db migration testing framework so we only run migrations up to the one we're testing.
fixes #902
2016-02-13 23:21:32 +01:00
Mark McDowall 8818e39c63 Fixed: Daily + Standard with 3 digit episode numbers
Closes #1145
2016-02-11 18:46:32 -08:00
Taloth Saldono 6a90035a4c Updated NLog to v4.2.3. 2016-02-11 22:15:12 +01:00
Taloth Saldono e01b2ef25c Fixed some compile warnings. 2016-02-11 22:11:53 +01:00
Taloth Saldono 91d91bc673 Fixed: Sample files of daily episodes should also be deleted after import. 2016-02-11 21:27:41 +01:00
Taloth Saldono 1c92ea58da Fixed: Replaced mono symlink resolve logic to better handle errors. 2016-02-11 21:12:42 +01:00
Taloth Saldono bd6a38173e Add another nn preset. 2016-02-11 20:11:59 +01:00
Mark McDowall 5d05a85411 Delete the subfolder not the parent folder 2016-02-11 00:54:52 -08:00
Mark McDowall 1a5eafd2b1 New: Remove empty subfolders after renaming FileSetLastWriteTime
Closes #490
2016-02-11 00:38:44 -08:00
Mark McDowall 1603b06431 New: Prefer regular episodes over specials when absolute numbers conflict
Closes #676
2016-02-11 00:09:29 -08:00
Mark McDowall 2396af4589 New: Pushover Silent and Emergency priorities
Closes #878
2016-02-10 23:43:40 -08:00
Taloth Saldono 262b8daec1 Revert "Fixed regression, mono should resolve symlinks while trying to find out the available/total space."
This reverts commit d33efe59fc.
2016-02-11 01:52:47 +01:00
Taloth Saldono d33efe59fc Fixed regression, mono should resolve symlinks while trying to find out the available/total space. 2016-02-11 01:14:16 +01:00
Taloth Saldono 5550565d6a Fixed: Manual Import didn't revert to parent folder when trying to parse series leading to issues with obfuscated releases. 2016-02-10 00:15:01 +01:00
Taloth Saldono 68540cb479 Certain log messages didn't include the exception. 2016-02-07 00:23:13 +01:00
Taloth Saldono 4038fa6907 Ignore -Obfuscated while parsing. 2016-02-06 10:43:56 +01:00
Taloth Saldono f96f997506 Fixed: Handling xml responses containing invalid html entities.
fixes #1123
2016-02-05 20:08:54 +01:00
Taloth Saldono 4e84d1a17c Fixed: Throw more specific error when there's an issue with the curl root certificate bundle. 2016-02-02 22:11:39 +01:00
Taloth Saldono 97cdb6a4a5 Fixed: ZFS and other mounts now listed in the System page.
Will now also automatically revert to a fully transactional move/copy if the move is in our out of a cifs mount. (assuming the cifs mount can be detected)
2016-02-02 22:11:37 +01:00
Mark McDowall f5b3d70641 Merge pull request #1112 from cturra/nzbplanet-api
updating nzbplanet.net api url to reflect recent change
2016-01-30 23:33:06 -08:00
cturra db66d3da9e updating nzbplanet.net api url to reflect recent change 2016-01-30 21:27:18 -08:00
Taloth Saldono c20e0667d4 Added additional tier to search for daily series type on BTN to find faux-daily series with SxxExx groups instead of date groups.
fixes #1111
2016-01-30 21:16:45 +01:00
Mark McDowall 4771b1c1b2 New: Parsing of XofY mini series format
Closes #1091
2016-01-30 11:16:59 -08:00
Mark McDowall 8e07a39ec0 Merge pull request #1095 from ta264/fix-build-sh
xbuild doesn't support /m parameter
2016-01-28 14:52:19 -08:00
Mark McDowall 9895b5bc1d Merge pull request #1100 from IvanBrazza/develop
Pushbullet: Source device support
2016-01-28 14:49:47 -08:00
Mark McDowall e89a1bc0fb Fixed: Delete confirmation message for Restriction
Closes #1102
2016-01-28 14:04:10 -08:00
Ivan Brazza 9b0654c7f2 New: Setting Pushbullet source device 2016-01-28 21:33:11 +00:00
Mark McDowall 56da824e98 AutoComplete and file browser will show files when appropriate
Fixed: File browser for Custom Script shows files
Closes #1084
2016-01-27 19:24:41 -08:00
ta264 f84b7904e6 Fix: xbuild doesn't support /m parameter 2016-01-27 14:11:29 +00:00
Mark McDowall 9f523bb167 New: Prevent automatic update if UI folder is not writable 2016-01-24 19:22:07 -08:00
Taloth Saldono f38d5de946 Fixed: Regression in parser incorrectly parsing S2015Exx.2015-01-01 notation.
fixes #1080
2016-01-21 22:43:48 +01:00
Taloth Saldono de379b2e47 Do or do not, there is no try. 2016-01-21 21:10:22 +01:00
Taloth Saldono 64e90f35c8 Ensure rTorrent download is started even if the user doesn't have schedule=...,start_tied= in their rtorrent.rc. 2016-01-21 08:40:10 +01:00
Taloth Saldono bbfe8c27c6 Fixed: Misleading error message when Kickass/Torrent Rss indexer returned invalid xml.
fixes #1058
2016-01-20 21:58:23 +01:00
Taloth Saldono 2f50074123 Fixed: Incorrect api error when calling /api/episode without seriesId queryparam.
fixes #1070
2016-01-20 21:58:02 +01:00
Taloth Saldono 5cfaed7b26 Fixed: Added support for Sabnzbd 0.8 history category queryparam.
fixes #1077
2016-01-20 21:57:40 +01:00
Taloth Saldono 0d19f645e8 Fixed: Don't apply indexer backoff on DNS and connection issues.
Fixes #751
2016-01-20 21:57:39 +01:00
Taloth Saldono 45d4371328 Fixed: Additional log cleanse Regex to keep even more sensitive information out of the logs.
fixes #1051
2016-01-20 21:57:10 +01:00
Taloth Saldono 889933cb41 New: Set full Download Directory in Transmission instead of just a Category.
fixes #744
2016-01-20 21:26:59 +01:00
Taloth Saldono 958b294152 Updated URL rewriter to handle torcache Referer weirdness. 2016-01-20 21:26:58 +01:00
Taloth Saldono cf25097cd1 Fixed: Magnet downloads weren't being started on RTorrent. 2016-01-20 21:26:57 +01:00
Taloth Saldono 902e0dd5d6 Updated SharpZipLib to include patches made since the last official release. 2016-01-20 21:16:02 +01:00
Keivan Beigi d943551a7f fixed build.sh 2016-01-16 16:39:45 -08:00
Keivan Beigi 46304b8a71 use build config to exclude xml doc rather than deleting them later 2016-01-16 16:36:40 -08:00
Keivan Beigi 6e2fc186ca added nuget.exe to tools 2016-01-16 16:19:28 -08:00
Keivan Beigi 845689401d removed msbuild integerated nuget restore 2016-01-16 16:17:36 -08:00
Keivan Beigi 4fb9cc5e8d cleanup app.manifest for Service helpers, upgraded compat to windows 8.1 2016-01-16 15:52:00 -08:00
Keivan Beigi 487581a01a apparently new compilers alraedy embed the app.manifest into the app, no need for mt.exe anymore 2016-01-16 15:51:26 -08:00
Keivan Beigi 2bc771d91e Merge pull request #1066 from pra85/2016
Update year range to 2016
2016-01-16 00:37:43 -08:00
Keivan Beigi 8bd7969328 cleanup 2016-01-16 00:36:43 -08:00
Keivan Beigi 5876ab487c fixed gulp build 2016-01-15 22:13:00 -08:00
Keivan Beigi 9c14ca0f39 Replaced build.ps1 with warning 2016-01-15 22:06:33 -08:00
Keivan Beigi 81ca352b2f smarted mdb generation 2016-01-15 21:50:09 -08:00
Keivan Beigi 0edfed5b95 upgraded pdb2mdb.exe to mono 4.2 Stable (4.2.1.102) 2016-01-15 21:50:09 -08:00
Prayag Verma 0ff053415c Update year range to 2016 2016-01-16 09:40:24 +05:30
Mark McDowall a0ee607ae6 Remove double slash in NZBVortex add URL 2016-01-15 09:04:18 -08:00
Keivan Beigi 2723e2a7b8 faster test packaging in build.sh 2016-01-15 00:27:59 -08:00
Keivan Beigi 6e105ce2c6 upgraded nuget packages 2016-01-14 23:07:39 -08:00
Keivan Beigi 9fc7fceda4 updated npm packages 2016-01-14 18:56:14 -08:00
Mark McDowall 2b72c0e328 Fixed: Manual Import Series selection
Closes #996
2016-01-09 13:16:34 -08:00
Mark McDowall 536aa350f0 Merge pull request #960 from Sonarr/nzb-vortex
NZBVortex Download Client
2016-01-07 15:53:57 -08:00
Mark McDowall 7c382c0e0c NZBVortex Download Client
New: NZBVortex Download Client
Closes #360
2016-01-07 15:50:52 -08:00
Mark McDowall dda0d3259f Fixed broken test 2016-01-07 15:49:51 -08:00
Mark McDowall a96718f7b3 Fixed Twitter notifications
New: Twitter notifications now require a Twitter (see settings for details)

Closes #1049
2016-01-06 22:32:12 -08:00
Mark McDowall 7ca67fe57a New: Special searching on RARBG 2016-01-05 23:07:49 -08:00
Mark McDowall 8373024f9d Fixed: Parsing of queued specials from download client queue 2016-01-05 22:56:34 -08:00
Mark McDowall b62ef0c40c Fixed: Use folder quality when better than file quality (regression)
Closes #1022
2016-01-04 23:12:14 -08:00
Mark McDowall 376481eda5 Merge pull request #981 from Sonarr/ical-parameters
iCal parameters
2016-01-02 10:31:12 -08:00
Mark McDowall 800fa42982 Selectable range for iCal
New: Support for pastDays and fututeDays query parameters on iCal requests
Closes #974
2016-01-02 10:21:06 -08:00
Taloth Saldono 4e728c3a02 Increased timeout for Deluge to prevent timeout errors when posting large torrent files. 2015-12-30 22:50:17 +01:00
Taloth Saldono 663d254ced Fixed Ospath incorrectly detecting arbitrary colon as windows path. 2015-12-30 21:01:29 +01:00
vawen 8753c232c7 Fix: Paths with colons prevent Sonarr from communicating with Transmission
Issue #954
2015-12-29 13:25:36 +01:00
Taloth Saldono 221f3ef08c Safety net to handle MaxSize=0. Some users still have 0 = unlimited in their db and migration failed for them. 2015-12-28 20:24:24 +01:00
Taloth Saldono b59175a87c Fixed: Indexer sites returning date as Retry-After header.
fixes #994
2015-12-28 20:24:23 +01:00
Taloth Saldono 37c621dcdb Fixed: Health Check produced warning if Sonarr binaries folder was not writable even when the external script update mechanism was selected.
fixes #964
2015-12-28 20:24:22 +01:00
Taloth Saldono eaf3228bb7 Fixed Regex mistake in CleanLogMessage. 2015-12-28 20:24:21 +01:00
Jake Pusateri c8debbf470 New: Better resolution posters on retina screens. 2015-12-28 11:12:12 -08:00
Mark McDowall 8dcd8d17b5 Fixed: Username must not be null or empty when logging in 2015-12-27 00:59:28 -08:00
Mark McDowall cfe121c777 Don't return series as subtype for /api/episode
Fixed: Sped up loading episodes from server
2015-12-27 00:45:20 -08:00
Mark McDowall b4f83d8a4e New: Media file extension .webm 2015-12-25 18:35:42 -08:00
Mark McDowall 9039d7e694 Fixed: Show a better error message when no episodes are parsed in a release 2015-12-25 18:32:03 -08:00
Taloth Saldono 7a25717da6 Fixed donate button. 2015-12-24 19:51:36 +01:00
Taloth Saldono 7e1c444c02 Fixed: Curl Fallback should ignore invalid cookies. 2015-12-24 19:30:16 +01:00
Mark McDowall dc3f7c9bda Fixed: Improved parsing for single digit multi-episode titles
Closes #965
2015-12-20 00:11:41 -08:00
Mark McDowall de754169fb Fixed: RSS Sync Interval validation 2015-12-19 18:02:38 -08:00
Mark McDowall 2d3c3bbb0c Changed torrent blackhole message 2015-12-19 17:49:54 -08:00
Mark McDowall 15cefe4a43 New: Option to Hardlink or Copy instead of move for Torrent Blackhole
Closes #1011
2015-12-19 17:18:22 -08:00
Mark McDowall 95da301975 A few UI Fixes
Closes #1009
Closes #1010
2015-12-18 23:41:30 -08:00
Mark McDowall e03906b294 Fixed: Hardlink/Copy files from QBittorrent 2015-12-17 22:16:38 -08:00
Mark McDowall 7921dd3f96 Fixed: Removed Titans of TV tracker
Closes #992
2015-12-17 00:46:02 -08:00
Mark McDowall 9f066f7a6b New: Newznab preset for Usenet Crawler 2015-12-17 00:24:51 -08:00
Mark McDowall 81d131e732 Merge pull request #779 from cbodley/qbittorrent
Download client for qBittorrent
2015-12-15 23:10:20 -08:00
Casey Bodley 0552b56b71 qbittorrent: client plugin based heavily on uTorrent
supports a minimum qBittorrent version of 3.2.4, and uses labels for
v3.3.0 and later

Signed-off-by: Casey Bodley <cbodley@gmail.com>
2015-12-14 00:20:14 -05:00
1442 changed files with 33893 additions and 21661 deletions
+25
View File
@@ -0,0 +1,25 @@
# This file is for unifying the coding style for different editors and IDEs
# editorconfig.org
root = true
[*.{cs,html,js,hbs}]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4
[*.less]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
# They have troubles with TABS. Use 2 spaces
[{package.json,.travis.yml}]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
+5
View File
@@ -0,0 +1,5 @@
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)
+14
View File
@@ -0,0 +1,14 @@
#### Database Migration
YES | NO
#### Description
A few sentences describing the overall goals of the pull request's commits.
#### Todos
- [ ] Tests
- [ ] Documentation
#### Issues Fixed or Closed by this PR
*
+7
View File
@@ -10,6 +10,7 @@ src/**/[Oo]bj/
*.suo *.suo
*.user *.user
*.sln.docstates *.sln.docstates
.vs/
# Build results # Build results
*_i.c *_i.c
@@ -41,6 +42,9 @@ src/**/[Oo]bj/
_ReSharper* _ReSharper*
_dotCover* _dotCover*
# DevExpress CodeRush
src/.cr/
# NCrunch # NCrunch
*.ncrunch* *.ncrunch*
.*crunch*.local.xml .*crunch*.local.xml
@@ -128,3 +132,6 @@ output/*
._* ._*
_start _start
_temp_*/**/*
src/.idea/
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="JavaScriptLibraryMappings"> <component name="JavaScriptLibraryMappings">
<file url="file://$PROJECT_DIR$" libraries="{Sonarr node_modules}" /> <includedPredefinedLibrary name="ECMAScript 6" />
</component> </component>
</project> </project>
+6 -4
View File
@@ -1,6 +1,6 @@
# How to Contribute # # How to Contribute #
We're always looking for people to help make Sonarr even better, there are a number of ways to contribute. To get started, <a href="http://www.clahub.com/agreements/NzbDrone/NzbDrone">sign the Contributor License Agreement</a>. We're always looking for people to help make Sonarr even better, there are a number of ways to contribute.
## Documentation ## ## 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 the better.
@@ -8,8 +8,8 @@ Setup guides, FAQ, the more information we have on the wiki the better.
## Development ## ## Development ##
### Tools required ### ### Tools required ###
- Visual Studio 2013 - Visual Studio 2015
- HTML/Javascript editor of choice (Sublime Text/Webstorm/etc) - HTML/Javascript editor of choice (Sublime Text/Webstorm/Atom/etc)
- npm (node package manager) - npm (node package manager)
- git - git
@@ -18,7 +18,9 @@ Setup guides, FAQ, the more information we have on the wiki the better.
1. Fork Sonarr 1. Fork Sonarr
2. Clone (develop branch) *you may need pull in submodules separately if you client doesn't clone them automatically (CurlSharp)* 2. Clone (develop branch) *you may need pull in submodules separately if you client doesn't clone them automatically (CurlSharp)*
3. Run `npm install` 3. Run `npm install`
4. Run `gulp watch` - Used to compile the UI components and copy them (leave this window open) 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 5. Compile in Visual Studio
### Contributing Code ### ### Contributing Code ###
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 55 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 707 B

After

Width:  |  Height:  |  Size: 490 B

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 15 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 21 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

+52
View File
@@ -0,0 +1,52 @@
# Sonarr
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.
## 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*
* 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
* Full integration with SABnzbd and NZBGet
* Full integration with Kodi, Plex (notification, library update, metadata)
* Full support for specials and multi-episode releases
* And a beautiful UI
## Configuring Development Environment:
### Requirements
* Visual Studio 2015 (https://www.visualstudio.com/vs/)
* [Git](https://git-scm.com/downloads)
* [NodeJS](https://nodejs.org/en/download/)
### Setup
* 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.
*Please note gulp must be running at all times while you are working with Sonarr client source files.*
### Development
* Open `NzbDrone.sln` in Visual Studio
* Make sure `NzbDrone.Console` is set as the startup project
### 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/)
+1 -267
View File
@@ -1,267 +1 @@
$msBuild = 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe' Write-Warning "DEPRECATED -- Please use build.sh instead."
$outputFolder = '.\_output'
$outputFolderMono = '.\_output_mono'
$outputFolderOsx = '.\_output_osx'
$outputFolderOsxApp = '.\_output_osx_app'
$testPackageFolder = '.\_tests\'
$testSearchPattern = '*.Test\bin\x86\Release'
$sourceFolder = '.\src'
$updateFolder = $outputFolder + '\NzbDrone.Update'
$updateFolderMono = $outputFolderMono + '\NzbDrone.Update'
Function Build()
{
Write-Host "##teamcity[progressStart 'Build']"
$clean = $msbuild + " src\nzbdrone.sln /t:Clean /m"
$build = $msbuild + " src\nzbdrone.sln /p:Configuration=Release /p:Platform=x86 /t:Build /m"
if(Test-Path $outputFolder)
{
Remove-Item -Recurse -Force $outputFolder -ErrorAction Continue
}
Invoke-Expression $clean
CheckExitCode
Invoke-Expression $build
CheckExitCode
CleanFolder $outputFolder
AddJsonNet
Write-Host "Removing Mono.Posix.dll"
Remove-Item "$outputFolder\Mono.Posix.dll"
Get-ChildItem $outputFolder -File -Filter "*.dylib" -Recurse | foreach ($_) {Remove-Item $_.Fullname}
Write-Host "##teamcity[progressFinish 'Build']"
}
Function CleanFolder($path, $keepConfigFiles)
{
Write-Host Removing XMLDoc files
get-childitem $path -File -Filter *.xml -Recurse | foreach ($_) {
$filename = $_.FullName
$exeFilename = $filename -replace "xml", "exe"
$dllFilename = $filename -replace "xml", "dll"
if (Test-Path $exeFilename) {
remove-item $_.fullname
}
if (Test-Path $dllFilename) {
remove-item $_.fullname
}
}
get-childitem $path -File -Filter *.transform -Recurse | foreach ($_) {remove-item $_.fullname}
if($keepConfigFiles -ne $true)
{
get-childitem $path -File -Filter *.dll.config -Recurse | foreach ($_) {remove-item $_.fullname}
}
Write-Host Removing FluentValidation.Resources files
get-childitem $path -File -Filter FluentValidation.resources.dll -recurse | foreach ($_) {remove-item $_.fullname}
get-childitem $path -File -Filter app.config -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing .less files
get-childitem $path -File -Filter *.less -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing vshost files
get-childitem $path -File -Filter *.vshost.exe -Recurse | foreach ($_) {remove-item $_.fullname}
if(Test-Path $$path\NuGet)
{
Write-Host Removing NuGet
Remove-Item -Recurse -Force "$path\NuGet"
}
Write-Host Removing Empty folders
while (Get-ChildItem $path -recurse | where {!@(Get-ChildItem -force $_.fullname)} | Test-Path)
{
Get-ChildItem $path -Directory -recurse | where {!@(Get-ChildItem -force $_.fullname)} | Remove-Item
}
}
Function PackageMono()
{
Write-Host "##teamcity[progressStart 'Creating Mono Package']"
if(Test-Path $outputFolderMono)
{
Remove-Item -Recurse -Force $outputFolderMono -ErrorAction Continue
}
Copy-Item $outputFolder $outputFolderMono -recurse
Write-Host Creating MDBs
get-childitem $outputFolderMono -File -Include @("*.exe", "*.dll") -Exclude @("MediaInfo.dll", "sqlite3.dll") -Recurse | foreach ($_) {
Write-Host "Creating .mdb for $_"
& "tools\pdb2mdb\pdb2mdb.exe" $_.fullname
}
Write-Host Removing PDBs
get-childitem $outputFolderMono -File -Filter *.pdb -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing Service helpers
get-childitem $outputFolderMono -File -Filter ServiceUninstall.* -Recurse | foreach ($_) {remove-item $_.fullname}
get-childitem $outputFolderMono -File -Filter ServiceInstall.* -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing native windows binaries Sqlite, MediaInfo
get-childitem $outputFolderMono -File -Filter sqlite3.* -Recurse | foreach ($_) {remove-item $_.fullname}
get-childitem $outputFolderMono -File -Filter MediaInfo.* -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host "Adding NzbDrone.Core.dll.config (for dllmap)"
Copy-Item "$sourceFolder\NzbDrone.Core\NzbDrone.Core.dll.config" $outputFolderMono
Write-Host "Adding CurlSharp.dll.config (for dllmap)"
Copy-Item "$sourceFolder\NzbDrone.Common\CurlSharp.dll.config" $outputFolderMono
Write-Host Renaming NzbDrone.Console.exe to NzbDrone.exe
Get-ChildItem $outputFolderMono -File -Filter "NzbDrone.exe*" -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing NzbDrone.Windows
get-childitem $outputFolderMono -File -Filter NzbDrone.Windows.* -Recurse | foreach ($_) {remove-item $_.fullname}
Get-ChildItem $outputFolderMono -File -Filter "NzbDrone.Console.exe*" -Recurse | foreach ($_) {
$newName = $_.fullname -Replace ".Console",""
Rename-Item $_.fullname $newName
}
Write-Host Adding NzbDrone.Mono to UpdatePackage
Copy-Item $outputFolderMono\* $updateFolderMono -Filter NzbDrone.Mono.*
Write-Host "##teamcity[progressFinish 'Creating Mono Package']"
}
Function PackageOsx()
{
Write-Host "##teamcity[progressStart 'Creating OS X Package']"
if(Test-Path $outputFolderOsx)
{
Remove-Item -Recurse -Force $outputFolderOsx -ErrorAction Continue
}
Copy-Item $outputFolderMono $outputFolderOsx -recurse
Write-Host "Adding sqlite dylibs"
Copy-Item "$sourceFolder\Libraries\sqlite\*.dylib" "$outputFolderOsx"
Write-Host "Adding MediaInfo dylib"
Copy-Item "$sourceFolder\Libraries\MediaInfo\*.dylib" "$outputFolderOsx"
Write-Host "Adding Startup script"
Copy-Item .\osx\Sonarr "$outputFolderOsx"
Write-Host "##teamcity[progressFinish 'Creating OS X Package']"
}
Function PackageOsxApp()
{
Write-Host "##teamcity[progressStart 'Creating OS X App Package']"
if(Test-Path $outputFolderOsxApp)
{
Remove-Item -Recurse -Force $outputFolderOsxApp -ErrorAction Continue
}
Copy-Item .\osx\Sonarr.app $outputFolderOsxApp\Sonarr.app -recurse
Copy-Item $outputFolderOsx $outputFolderOsxApp\Sonarr.app\Contents\MacOS -recurse
Write-Host "##teamcity[progressFinish 'Creating OS X App Package']"
}
Function AddJsonNet()
{
get-childitem $outputFolder -File -Filter Newtonsoft.Json.* -Recurse | foreach ($_) {remove-item $_.fullname}
Copy-Item .\src\packages\Newtonsoft.Json.*.*\lib\net35\*.dll -Destination $outputFolder
Copy-Item .\src\packages\Newtonsoft.Json.*.*\lib\net35\*.dll -Destination $outputFolder\NzbDrone.Update
}
Function PackageTests()
{
Write-Host Packaging Tests
Write-Host "##teamcity[progressStart 'Creating Test Package']"
if(Test-Path $testPackageFolder)
{
Remove-Item -Recurse -Force $testPackageFolder -ErrorAction Continue
}
Get-ChildItem -Recurse -Directory | Where-Object {$_.FullName -like $testSearchPattern} | foreach($_){
Copy-Item -Recurse ($_.FullName + "\*") $testPackageFolder -ErrorAction Ignore
}
.\src\.nuget\NuGet.exe install NUnit.Runners -Version 2.6.1 -Output $testPackageFolder
Copy-Item $outputFolder\*.dll -Destination $testPackageFolder -Force
Copy-Item $outputFolder\*.pdb -Destination $testPackageFolder -Force
Copy-Item .\*.sh -Destination $testPackageFolder -Force
Write-Host Creating MDBs for tests
get-childitem $testPackageFolder -File -Include @("*.exe", "*.dll") -Exclude @("MediaInfo.dll", "sqlite3.dll") -Recurse | foreach ($_) {
Write-Host "Creating .mdb for $_"
& "tools\pdb2mdb\pdb2mdb.exe" $_.fullname
}
get-childitem $testPackageFolder -File -Filter *log.config | foreach ($_) {remove-item $_.fullname}
CleanFolder $testPackageFolder $true
Write-Host "Adding NzbDrone.Core.dll.config (for dllmap)"
Copy-Item "$sourceFolder\NzbDrone.Core\NzbDrone.Core.dll.config" -Destination $testPackageFolder -Force
Write-Host "Copying CurlSharp libraries"
Copy-Item $sourceFolder\ExternalModules\CurlSharp\libs\i386\* $testPackageFolder
Write-Host "##teamcity[progressFinish 'Creating Test Package']"
}
Function RunGulp()
{
Write-Host "##teamcity[progressStart 'Running Gulp']"
Invoke-Expression 'npm install'
CheckExitCode
Invoke-Expression 'gulp build' -ErrorAction Continue -Verbose
CheckExitCode
Invoke-Expression 'gulp build --phantom' -ErrorAction Continue -Verbose
CheckExitCode
Write-Host "##teamcity[progressFinish 'Running Gulp']"
}
Function CheckExitCode()
{
if ($lastexitcode -ne 0)
{
Write-Host $errorMessage
exit 1
}
}
Function CleanupWindowsPackage()
{
Write-Host Removing NzbDrone.Mono
get-childitem $outputFolder -File -Filter NzbDrone.Mono.* -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Adding NzbDrone.Windows to UpdatePackage
Copy-Item $outputFolder\* $updateFolder -Filter NzbDrone.Windows.*
}
Build
RunGulp
PackageMono
PackageOsx
PackageOsxApp
PackageTests
CleanupWindowsPackage
+35 -30
View File
@@ -1,15 +1,17 @@
#! /bin/bash #! /bin/bash
msBuild='/c/Windows/Microsoft.NET/Framework64/v4.0.30319/' msBuild='/c/Program Files (x86)/MSBuild/14.0/Bin'
outputFolder='./_output' outputFolder='./_output'
outputFolderMono='./_output_mono' outputFolderMono='./_output_mono'
outputFolderOsx='./_output_osx' outputFolderOsx='./_output_osx'
outputFolderOsxApp='./_output_osx_app' outputFolderOsxApp='./_output_osx_app'
testPackageFolder='./_tests/' testPackageFolder='./_tests/'
testSearchPattern='*.Test/bin/x86/Release/*' testSearchPattern='*.Test/bin/x86/Release'
sourceFolder='./src' sourceFolder='./src'
slnFile=$sourceFolder/NzbDrone.sln
updateFolder=$outputFolder/NzbDrone.Update updateFolder=$outputFolder/NzbDrone.Update
updateFolderMono=$outputFolderMono/NzbDrone.Update updateFolderMono=$outputFolderMono/NzbDrone.Update
nuget='tools/nuget/nuget.exe';
CheckExitCode() CheckExitCode()
{ {
"$@" "$@"
@@ -26,14 +28,6 @@ CleanFolder()
local path=$1 local path=$1
local keepConfigFiles=$2 local keepConfigFiles=$2
echo "Removing XMLDoc files"
local xmlfiles=( $(find $path -name "*.xml") )
for filename in "${xmlfiles[@]}"
do
if [ -e ${filename%.xml}.dll ] || [ -e ${filename%.xml}.exe ] ; then
rm $filename
fi
done
find $path -name "*.transform" -exec rm "{}" \; find $path -name "*.transform" -exec rm "{}" \;
@@ -51,10 +45,8 @@ CleanFolder()
echo "Removing vshost files" echo "Removing vshost files"
find $path -name "*.vshost.exe" -exec rm "{}" \; find $path -name "*.vshost.exe" -exec rm "{}" \;
if [ -d $path/NuGet ] ; then echo "Removing dylib files"
echo "Removing NuGet" find $path -name "*.dylib" -exec rm "{}" \;
rm -rf $path/NuGet
fi
echo "Removing Empty folders" echo "Removing Empty folders"
find $path -depth -empty -type d -exec rm -r "{}" \; find $path -depth -empty -type d -exec rm -r "{}" \;
@@ -72,15 +64,17 @@ AddJsonNet()
BuildWithMSBuild() BuildWithMSBuild()
{ {
export PATH=$msBuild:$PATH export PATH=$msBuild:$PATH
CheckExitCode MSBuild.exe $sourceFolder/NzbDrone.sln //t:Clean //m CheckExitCode MSBuild.exe $slnFile //t:Clean //m
CheckExitCode MSBuild.exe $sourceFolder/NzbDrone.sln //p:Configuration=Release //p:Platform=x86 //t:Build //m $nuget restore $slnFile
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb
} }
BuildWithXbuild() BuildWithXbuild()
{ {
export MONO_IOMAP=case export MONO_IOMAP=case
CheckExitCode xbuild /t:Clean $sourceFolder/NzbDrone.sln CheckExitCode xbuild /t:Clean $slnFile
CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build $sourceFolder/NzbDrone.sln mono $nuget restore $slnFile
CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile
} }
Build() Build()
@@ -94,9 +88,9 @@ Build()
else else
BuildWithXbuild BuildWithXbuild
fi fi
CleanFolder $outputFolder false CleanFolder $outputFolder false
AddJsonNet AddJsonNet
echo "Removing Mono.Posix.dll" echo "Removing Mono.Posix.dll"
@@ -107,19 +101,29 @@ Build()
RunGulp() RunGulp()
{ {
echo "##teamcity[progressStart 'Running Gulp']" echo "##teamcity[progressStart 'npm install']"
npm-cache install npm || CheckExitCode npm install
echo "##teamcity[progressFinish 'npm install']"
CheckExitCode npm install echo "##teamcity[progressStart 'Running gulp']"
CheckExitCode gulp build CheckExitCode npm run build
echo "##teamcity[progressFinish 'Running gulp']"
echo "##teamcity[progressFinish 'Running Gulp']"
} }
CreateMdbs() CreateMdbs()
{ {
local path=$1 local path=$1
if [ $runtime = "dotnet" ] ; then if [ $runtime = "dotnet" ] ; then
find $path \( -name "*.exe" -o -name "*.dll" \) -not -name "MediaInfo.dll" -not -name "sqlite3.dll" -exec tools/pdb2mdb/pdb2mdb.exe "{}" \; 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 fi
} }
@@ -160,6 +164,8 @@ PackageMono()
echo "Adding NzbDrone.Mono to UpdatePackage" echo "Adding NzbDrone.Mono to UpdatePackage"
cp $outputFolderMono/NzbDrone.Mono.* $updateFolderMono cp $outputFolderMono/NzbDrone.Mono.* $updateFolderMono
echo "##teamcity[progressFinish 'Creating Mono Package']"
} }
PackageOsx() PackageOsx()
@@ -199,13 +205,12 @@ PackageTests()
rm -rf $testPackageFolder rm -rf $testPackageFolder
mkdir $testPackageFolder mkdir $testPackageFolder
find . -maxdepth 6 -path $testSearchPattern -exec cp -r "{}" $testPackageFolder \; find $sourceFolder -path $testSearchPattern -exec cp -r -u -T "{}" $testPackageFolder \;
if [ $runtime = "dotnet" ] ; then if [ $runtime = "dotnet" ] ; then
$sourceFolder/.nuget/NuGet.exe install NUnit.Runners -Version 2.6.1 -Output $testPackageFolder $nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
cp $outputFolder/*.pdb $testPackageFolder
else else
mono $sourceFolder/.nuget/NuGet.exe install NUnit.Runners -Version 2.6.1 -Output $testPackageFolder mono $nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
fi fi
cp $outputFolder/*.dll $testPackageFolder cp $outputFolder/*.dll $testPackageFolder
+1 -1
View File
@@ -3,7 +3,7 @@ Upstream-Name: nzbdrone
Source: https://github.com/Sonarr/Sonarr Source: https://github.com/Sonarr/Sonarr
Files: * Files: *
Copyright: 2010-2014 Sonarr <hello@sonarr.tv> Copyright: 2010-2016 Sonarr <hello@sonarr.tv>
License: GPL-3.0+ License: GPL-3.0+
+4 -12
View File
@@ -5,9 +5,8 @@ var postcss = require('gulp-postcss');
var sourcemaps = require('gulp-sourcemaps'); var sourcemaps = require('gulp-sourcemaps');
var autoprefixer = require('autoprefixer-core'); var autoprefixer = require('autoprefixer-core');
var livereload = require('gulp-livereload'); var livereload = require('gulp-livereload');
var cleancss = require('gulp-clean-css');
var print = require('gulp-print'); var print = require('gulp-print');
var phantom = require('./phantom');
var paths = require('./paths'); var paths = require('./paths');
var errorHandler = require('./errorHandler'); var errorHandler = require('./errorHandler');
@@ -29,25 +28,18 @@ gulp.task('less', function() {
paths.src.root + 'System/Info/info.less' paths.src.root + 'System/Info/info.less'
]; ];
if (phantom) {
src = [
paths.src.content + 'Bootstrap/bootstrap.less',
paths.src.content + 'Vendor/vendor.less',
paths.src.content + 'sonarr.less'
];
}
return gulp.src(src) return gulp.src(src)
.pipe(print()) .pipe(print())
.pipe(sourcemaps.init()) .pipe(sourcemaps.init())
.pipe(less({ .pipe(less({
dumpLineNumbers : 'false', dumpLineNumbers : 'false',
compress : true, compress : false,
yuicompress : true, yuicompress : false,
ieCompat : true, ieCompat : true,
strictImports : true strictImports : true
})) }))
.pipe(postcss([ autoprefixer({ browsers: ['last 2 versions'] }) ])) .pipe(postcss([ autoprefixer({ browsers: ['last 2 versions'] }) ]))
.pipe(cleancss())
.on('error', errorHandler.onError) .on('error', errorHandler.onError)
.pipe(sourcemaps.write(paths.dest.content)) .pipe(sourcemaps.write(paths.dest.content))
.pipe(gulp.dest(paths.dest.content)) .pipe(gulp.dest(paths.dest.content))
-24
View File
@@ -1,5 +1,3 @@
var phantom = require('./phantom');
var paths = { var paths = {
src : { src : {
root : './src/UI/', root : './src/UI/',
@@ -20,26 +18,4 @@ var paths = {
} }
}; };
if (phantom) {
paths = {
src : {
root : './UI.Phantom/',
templates : './UI.Phantom/**/*.hbs',
html : './UI.Phantom/*.html',
partials : './UI.Phantom/**/*Partial.hbs',
scripts : './UI.Phantom/**/*.js',
less : ['./UI.Phantom/**/*.less'],
content : './UI.Phantom/Content/',
images : './UI.Phantom/Content/Images/**/*',
exclude : {
libs : '!./UI.Phantom/JsLibraries/**'
}
},
dest : {
root : './_output/UI.Phantom/',
content : './_output/UI.Phantom/Content/'
}
};
}
module.exports = paths; module.exports = paths;
-14
View File
@@ -1,14 +0,0 @@
// Switch to phantom.
// Example:
// gulp --phantom
var phantom = false;
process.argv.forEach(function(val, index, array) {
if (val === '--phantom') {
phantom = true;
}
});
console.log('Phantom:', phantom);
module.exports = phantom;
-8
View File
@@ -1,8 +0,0 @@
EXCLUDE="-exclude:Windows -include:IntegrationTest"
TESTDIR="."
NUNIT="$TESTDIR/NUnit.Runners.2.6.1/tools/nunit-console-x86.exe"
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Api.Result.xml $TESTDIR/NzbDrone.Api.Test.dll
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Core.Result.xml $TESTDIR/NzbDrone.Core.Test.dll
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Integration.Result.xml $TESTDIR/NzbDrone.Integration.Test.dll
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Common.Result.xml $TESTDIR/NzbDrone.Common.Test.dll
+23 -6
View File
@@ -1,17 +1,31 @@
#!/bin/sh #!/bin/sh
#get the bundle's MacOS directory full path #get the bundle's MacOS directory full path
DIR=$(cd "$(dirname "$0")"; pwd) DIR=$(cd "$(dirname "$0")"; pwd)
#change these values to match your app #change these values to match your app
EXE_PATH="$DIR/NzbDrone.exe" EXE_PATH="$DIR/NzbDrone.exe"
APPNAME="Sonarr" APPNAME="Sonarr"
#set up environment #set up environment
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current if [[ -x '/opt/local/bin/mono' ]]; then
export DYLD_FALLBACK_LIBRARY_PATH="$DIR:$MONO_FRAMEWORK_PATH/lib:/lib:/usr/lib" export PATH="/opt/local/bin:$PATH"
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH" fi
export DYLD_FALLBACK_LIBRARY_PATH="$DIR"
if [ -e /Library/Frameworks/Mono.framework ]; then
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$MONO_FRAMEWORK_PATH/lib"
fi
if [[ -f '/opt/local/lib/libsqlite3.0.dylib' ]]; then
export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH"
fi
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$HOME/lib:/usr/local/lib:/lib:/usr/lib"
#mono version check #mono version check
REQUIRED_MAJOR=3 REQUIRED_MAJOR=3
REQUIRED_MINOR=10 REQUIRED_MINOR=10
@@ -21,6 +35,9 @@ VERSION_MSG="$APPNAME requires Mono Runtime Environment(MRE) $REQUIRED_MAJOR.$RE
DOWNLOAD_URL="http://www.mono-project.com/download/#download-mac" DOWNLOAD_URL="http://www.mono-project.com/download/#download-mac"
MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )" MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )"
# if [[ -o DEBUG ]]; then osascript -e "display dialog \"MONO_VERSION: $MONO_VERSION\""; fi
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)" MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)" MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
if [ -z "$MONO_VERSION" ] \ if [ -z "$MONO_VERSION" ] \
+4 -2
View File
@@ -4,14 +4,15 @@
"description": "Sonarr", "description": "Sonarr",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {
"preinstall": "" "build": "gulp build",
"start": "gulp watch"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/Sonarr/Sonarr.git" "url": "git://github.com/Sonarr/Sonarr.git"
}, },
"author": "", "author": "",
"license": "BSD", "license": "GPL-3.0",
"gitHead": "9ff7aa1bf7fe38c4c5bdb92f56c8ad556916ed67", "gitHead": "9ff7aa1bf7fe38c4c5bdb92f56c8ad556916ed67",
"readmeFilename": "readme.md", "readmeFilename": "readme.md",
"dependencies": { "dependencies": {
@@ -19,6 +20,7 @@
"del": "1.2.0", "del": "1.2.0",
"gulp": "3.9.0", "gulp": "3.9.0",
"gulp-cached": "1.1.0", "gulp-cached": "1.1.0",
"gulp-clean-css": "^3.0.4",
"gulp-concat": "2.6.0", "gulp-concat": "2.6.0",
"gulp-declare": "0.3.0", "gulp-declare": "0.3.0",
"gulp-handlebars": "3.0.1", "gulp-handlebars": "3.0.1",
-55
View File
@@ -1,55 +0,0 @@
# Sonarr #
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.
## Major Features Include: ##
* Support for major platforms: Windows, Linux, OSX, 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*
* 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
* Full integration with SABNzbd and NzbGet
* Full integration with XBMC, Plex (notification, library update, metadata)
* Full support for specials and multi-episode releases
* And a beautiful UI
## Configuring Development Environment: ##
### Requirements ###
- Visual Studio 2015 [Free Community Edition](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx)
- [Git](http://git-scm.com/downloads)
- [NodeJS](http://nodejs.org/download/)
- [Gulp](http://gulpjs.com)
### Setup ###
- 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`
- install gulp `npm install gulp -g`
- start gulp to monitor your dev environment for any changes that need post processing using `gulp watch` command.
*Please note gulp must be running at all times while you are working with Sonarr client source files.*
### Development ###
- Open `NzbDrone.sln` in Visual Studio
- Make sure `NzbDrone.Console` is set as the startup project
### License ###
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
Copyright 2010-2015
### 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/)
-17
View File
@@ -1,17 +0,0 @@
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="A branch name is #requires required")]
[string]$branch,
[Parameter(Mandatory=$true, Position=1, HelpMessage="A version is required")]
[string]$version
)
if ($branch -eq "<default>")
{
$branch = "teamcity";
}
Write-Host $branch;
Write-Host $version;
Write-Host "NzbDrone.$branch.$version.zip";
Rename-Item "nzbdrone.zip" "NzbDrone.$branch.$version.zip"
+2
View File
@@ -75,6 +75,8 @@
<xs:enumeration value="seedtype" /> <!-- TBD, which criteria must be met. was going for 'ratio,seedtime,both' but afaik it's always 'either' --> <xs:enumeration value="seedtype" /> <!-- TBD, which criteria must be met. was going for 'ratio,seedtime,both' but afaik it's always 'either' -->
<xs:enumeration value="minimumratio" /> <xs:enumeration value="minimumratio" />
<xs:enumeration value="minimumseedtime" /> <xs:enumeration value="minimumseedtime" />
<xs:enumeration value="downloadvolumefactor" /> <!-- factor for the download volume, in most cases it should be set to 1, if a torrent is set to freeleech set it to 0, if only 50% is counted set it to 0.5 -->
<xs:enumeration value="uploadvolumefactor" /> <!-- factor for the upload volume, in most cases it should be set to 1, if a torrent is set to neutral leech (upload is not counted) set it to 0, if it's set to double upload set it to 2 -->
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:element name="attr"> <xs:element name="attr">
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
</configuration>
Binary file not shown.
-136
View File
@@ -1,136 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>
<!-- Enable the restore command to run before builds -->
<RestorePackages Condition=" '$(RestorePackages)' == '' ">false</RestorePackages>
<!-- Property that enables building a package from a project -->
<BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>
<!-- Determines if package restore consent is required to restore packages -->
<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>
<!-- Download NuGet.exe if it does not already exist -->
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageSources)' == '' ">
<!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
<!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
<!--
<PackageSource Include="https://www.nuget.org/api/v2/" />
<PackageSource Include="https://my-nuget-source/nuget/" />
-->
</ItemGroup>
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
<!-- Windows specific commands -->
<NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
<PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
</PropertyGroup>
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
<!-- We need to launch nuget.exe with the mono command if we're not on windows -->
<NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
<PackagesConfig>packages.config</PackagesConfig>
</PropertyGroup>
<PropertyGroup>
<!-- NuGet command -->
<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\NuGet.exe</NuGetExePath>
<PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>
<NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
<NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>
<PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>
<RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
<NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch>
<PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir>
<PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir>
<!-- Commands -->
<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>
<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>
<!-- We need to ensure packages are restored prior to assembly resolve -->
<BuildDependsOn Condition="$(RestorePackages) == 'true'">
RestorePackages;
$(BuildDependsOn);
</BuildDependsOn>
<!-- Make the build depend on restore packages -->
<BuildDependsOn Condition="$(BuildPackage) == 'true'">
$(BuildDependsOn);
BuildPackage;
</BuildDependsOn>
</PropertyGroup>
<Target Name="CheckPrerequisites">
<!-- Raise an error if we're unable to locate nuget.exe -->
<Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
<!--
Take advantage of MsBuild's build dependency tracking to make sure that we only ever download nuget.exe once.
This effectively acts as a lock that makes sure that the download operation will only happen once and all
parallel builds will have to wait for it to complete.
-->
<MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" />
</Target>
<Target Name="_DownloadNuGet">
<DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" />
</Target>
<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
<Exec Command="$(RestoreCommand)"
Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />
<Exec Command="$(RestoreCommand)"
LogStandardErrorAsError="true"
Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
</Target>
<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
<Exec Command="$(BuildCommand)"
Condition=" '$(OS)' != 'Windows_NT' " />
<Exec Command="$(BuildCommand)"
LogStandardErrorAsError="true"
Condition=" '$(OS)' == 'Windows_NT' " />
</Target>
<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<OutputFilename ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Core" />
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Using Namespace="System.Net" />
<Using Namespace="Microsoft.Build.Framework" />
<Using Namespace="Microsoft.Build.Utilities" />
<Code Type="Fragment" Language="cs">
<![CDATA[
try {
OutputFilename = Path.GetFullPath(OutputFilename);
Log.LogMessage("Downloading latest version of NuGet.exe...");
WebClient webClient = new WebClient();
webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename);
return true;
}
catch (Exception ex) {
Log.LogErrorFromException(ex);
return false;
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
Binary file not shown.
@@ -1,9 +0,0 @@
<?xml version ="1.0"?>
<!-- This allows mt.exe to run on machines with the CLR v4 installed but not 1.1 or 2.0 -->
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>
<supportedRuntime version="v1.1.4322"/>
</startup>
</configuration>
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -296,7 +296,7 @@ namespace LogentriesCore
WriteDebugMessages("HostName parameter is not defined - trying to get it from System.Environment.MachineName"); WriteDebugMessages("HostName parameter is not defined - trying to get it from System.Environment.MachineName");
m_HostName = "HostName=" + System.Environment.MachineName + " "; m_HostName = "HostName=" + System.Environment.MachineName + " ";
} }
catch (InvalidOperationException ex) catch (InvalidOperationException)
{ {
// Cannot get host name automatically, so assume that HostName is not used // Cannot get host name automatically, so assume that HostName is not used
// and log message is sent without it. // and log message is sent without it.
-7
View File
@@ -73,13 +73,6 @@
<PostBuildEvent> <PostBuildEvent>
</PostBuildEvent> </PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
@@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
+3 -9
View File
@@ -51,8 +51,8 @@
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="NLog"> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.2.1.0\lib\net40\NLog.dll</HintPath> <HintPath>..\packages\NLog.4.4.3\lib\net40\NLog.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
@@ -79,19 +79,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="fastJSON\license.txt" /> <None Include="fastJSON\license.txt" />
<None Include="packages.config" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent> <PostBuildEvent>
</PostBuildEvent> </PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
@@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
+7 -6
View File
@@ -24,6 +24,7 @@ namespace LogentriesNLog.fastJSON
SerializeNullValues = false; SerializeNullValues = false;
UseOptimizedDatasetSchema = false; UseOptimizedDatasetSchema = false;
UsingGlobalTypes = false; UsingGlobalTypes = false;
UseUTCDateTime = true;
} }
public bool UseOptimizedDatasetSchema = true; public bool UseOptimizedDatasetSchema = true;
public bool UseFastGuid = true; public bool UseFastGuid = true;
@@ -39,7 +40,7 @@ namespace LogentriesNLog.fastJSON
return ToJSON(obj, UseSerializerExtension, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); return ToJSON(obj, UseSerializerExtension, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues);
} }
public string ToJSON(object obj, public string ToJSON(object obj,
bool enableSerializerExtensions, bool enableSerializerExtensions,
bool enableFastGuid, bool enableFastGuid,
@@ -49,13 +50,13 @@ namespace LogentriesNLog.fastJSON
return new JSONSerializer(enableOptimizedDatasetSchema, enableFastGuid, enableSerializerExtensions, serializeNullValues, IndentOutput).ConvertToJSON(obj); return new JSONSerializer(enableOptimizedDatasetSchema, enableFastGuid, enableSerializerExtensions, serializeNullValues, IndentOutput).ConvertToJSON(obj);
} }
public T ToObject<T>(string json) public T ToObject<T>(string json)
{ {
return (T)ToObject(json, typeof(T)); return (T)ToObject(json, typeof(T));
} }
public object ToObject(string json, Type type) public object ToObject(string json, Type type)
{ {
var ht = new JsonParser(json).Decode() as Dictionary<string, object>; var ht = new JsonParser(json).Decode() as Dictionary<string, object>;
@@ -320,7 +321,7 @@ namespace LogentriesNLog.fastJSON
} }
} }
_getterscache.Add(type, getters); _getterscache.Add(type, getters);
return getters; return getters;
} }
@@ -448,7 +449,7 @@ namespace LogentriesNLog.fastJSON
#if !SILVERLIGHT #if !SILVERLIGHT
else if (pi.isDictionary || pi.isHashtable) else if (pi.isDictionary || pi.isHashtable)
oset = CreateDictionary((ArrayList)v, pi.pt, pi.GenericTypes, globaltypes); oset = CreateDictionary((ArrayList)v, pi.pt, pi.GenericTypes, globaltypes);
#else #else
else if (pi.isDictionary) else if (pi.isDictionary)
oset = CreateDictionary((List<object>)v, pi.pt, pi.GenericTypes, globaltypes); oset = CreateDictionary((List<object>)v, pi.pt, pi.GenericTypes, globaltypes);
#endif #endif
@@ -817,4 +818,4 @@ namespace LogentriesNLog.fastJSON
} }
#endif #endif
} }
} }
@@ -170,6 +170,8 @@ namespace LogentriesNLog.fastJSON
_output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo)); _output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo));
_output.Append(":"); _output.Append(":");
_output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo)); _output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo));
_output.Append(".");
_output.Append(dt.Millisecond.ToString("000", NumberFormatInfo.InvariantInfo));
if (JSON.Instance.UseUTCDateTime) if (JSON.Instance.UseUTCDateTime)
_output.Append("Z"); _output.Append("Z");
+2 -2
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="NLog" version="2.1.0" targetFramework="net40" /> <package id="NLog" version="4.4.3" targetFramework="net40" />
</packages> </packages>
+2 -1
View File
@@ -198,7 +198,8 @@ namespace Marr.Data.Mapping
{ {
return AutoMapPropertiesWhere(m => return AutoMapPropertiesWhere(m =>
m.MemberType == MemberTypes.Property && m.MemberType == MemberTypes.Property &&
!DataHelper.IsSimpleType((m as PropertyInfo).PropertyType)); !DataHelper.IsSimpleType((m as PropertyInfo).PropertyType) &&
!MapRepository.Instance.TypeConverters.ContainsKey((m as PropertyInfo).PropertyType));
} }
/// <summary> /// <summary>
-1
View File
@@ -144,7 +144,6 @@
<PreBuildEvent> <PreBuildEvent>
</PreBuildEvent> </PreBuildEvent>
</PropertyGroup> </PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
@@ -1,9 +1,6 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information.
using System; using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading; using System.Threading;
namespace Microsoft.AspNet.SignalR.Infrastructure namespace Microsoft.AspNet.SignalR.Infrastructure
@@ -4,7 +4,7 @@ using System.Diagnostics;
namespace Microsoft.AspNet.SignalR.Infrastructure namespace Microsoft.AspNet.SignalR.Infrastructure
{ {
internal class NoOpPerformanceCounter : IPerformanceCounter public class NoOpPerformanceCounter : IPerformanceCounter
{ {
public string CounterName public string CounterName
{ {
@@ -43,9 +43,9 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net40\Newtonsoft.Json.dll</HintPath>
<HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\net40\Newtonsoft.Json.dll</HintPath> <Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
@@ -276,10 +276,9 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
</Target> </Target>
--> -->
</Project> </Project>
@@ -6,7 +6,6 @@ using System.Diagnostics;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Configuration; using Microsoft.AspNet.SignalR.Configuration;
using Microsoft.AspNet.SignalR.Hosting; using Microsoft.AspNet.SignalR.Hosting;
@@ -1,13 +1,9 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information.
using System; using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Infrastructure; using Microsoft.AspNet.SignalR.Infrastructure;
@@ -3,7 +3,6 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Hosting; using Microsoft.AspNet.SignalR.Hosting;
using Microsoft.AspNet.SignalR.Infrastructure; using Microsoft.AspNet.SignalR.Infrastructure;
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Newtonsoft.Json" version="6.0.6" targetFramework="net40" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net40" />
</packages> </packages>
@@ -102,7 +102,6 @@
</ItemGroup> </ItemGroup>
<Import Project="..\Common\Microsoft.AspNet.SignalR.targets" /> <Import Project="..\Common\Microsoft.AspNet.SignalR.targets" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
@@ -110,4 +109,4 @@
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
@@ -5,13 +5,10 @@ using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Security.Principal; using System.Security.Principal;
using System.Threading; using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Owin.Infrastructure; using Microsoft.AspNet.SignalR.Owin.Infrastructure;
using Microsoft.AspNet.SignalR.Hosting;
namespace Microsoft.AspNet.SignalR.Owin namespace Microsoft.AspNet.SignalR.Owin
{ {
using WebSocketFunc = Func<IDictionary<string, object>, Task>;
public partial class ServerRequest : public partial class ServerRequest :
#if NET45 #if NET45
IWebSocketRequest IWebSocketRequest
+2 -1
View File
@@ -774,7 +774,8 @@ namespace MonoTorrent
break; break;
case ("nodes"): case ("nodes"):
this.nodes = (BEncodedList)keypair.Value; if (keypair.Value.ToString().Length != 0)
this.nodes = (BEncodedList)keypair.Value;
break; break;
case ("comment.utf-8"): case ("comment.utf-8"):
@@ -1,168 +0,0 @@
using System;
using System.Collections.Generic;
using FizzWare.NBuilder;
using FluentAssertions;
using Marr.Data;
using NUnit.Framework;
using NzbDrone.Api.Commands;
using NzbDrone.Api.Config;
using NzbDrone.Api.Episodes;
using NzbDrone.Api.History;
using NzbDrone.Api.Indexers;
using NzbDrone.Api.Logs;
using NzbDrone.Api.Mapping;
using NzbDrone.Api.Profiles;
using NzbDrone.Api.RootFolders;
using NzbDrone.Api.Series;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Instrumentation;
using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Organizer;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Profiles;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.RootFolders;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Update.Commands;
using NzbDrone.Test.Common;
using System.Linq;
namespace NzbDrone.Api.Test.MappingTests
{
[TestFixture]
public class ResourceMappingFixture : TestBase
{
[TestCase(typeof(Core.Tv.Series), typeof(SeriesResource))]
[TestCase(typeof(Episode), typeof(EpisodeResource))]
[TestCase(typeof(RootFolder), typeof(RootFolderResource))]
[TestCase(typeof(NamingConfig), typeof(NamingConfigResource))]
// [TestCase(typeof(IndexerDefinition), typeof(IndexerResource))] //TODO: Ignoring because we don't have a good way to ignore properties with value injector
[TestCase(typeof(ReleaseInfo), typeof(ReleaseResource))]
[TestCase(typeof(ParsedEpisodeInfo), typeof(ReleaseResource))]
[TestCase(typeof(DownloadDecision), typeof(ReleaseResource))]
[TestCase(typeof(Core.History.History), typeof(HistoryResource))]
[TestCase(typeof(Profile), typeof(ProfileResource))]
[TestCase(typeof(ProfileQualityItem), typeof(ProfileQualityItemResource))]
[TestCase(typeof(Log), typeof(LogResource))]
[TestCase(typeof(Command), typeof(CommandResource))]
public void matching_fields(Type modelType, Type resourceType)
{
MappingValidation.ValidateMapping(modelType, resourceType);
}
[Test]
public void should_map_lazy_loaded_values_should_not_be_inject_if_not_loaded()
{
var modelWithLazy = new ModelWithLazy()
{
Guid = new TestLazyLoaded<Guid>()
};
modelWithLazy.InjectTo<ModelWithNoLazy>().Guid.Should().BeEmpty();
modelWithLazy.Guid.IsLoaded.Should().BeFalse();
}
[Test]
public void should_map_lay_loaded_values_should_be_inject_if_loaded()
{
var guid = Guid.NewGuid();
var modelWithLazy = new ModelWithLazy()
{
Guid = new LazyLoaded<Guid>(guid)
};
modelWithLazy.InjectTo<ModelWithNoLazy>().Guid.Should().Be(guid);
modelWithLazy.Guid.IsLoaded.Should().BeTrue();
}
[Test]
public void should_be_able_to_map_lists()
{
var modelList = Builder<TestModel>.CreateListOfSize(10).Build();
var resourceList = modelList.InjectTo<List<TestResource>>();
resourceList.Should().HaveSameCount(modelList);
}
[Test]
public void should_map_wrapped_models()
{
var modelList = Builder<TestModel>.CreateListOfSize(10).Build().ToList();
var wrapper = new TestModelWrapper
{
TestlList = modelList
};
wrapper.InjectTo<TestResourceWrapper>();
}
[Test]
public void should_map_profile()
{
var profileResource = new ProfileResource
{
Cutoff = Quality.WEBDL1080p,
Items = new List<ProfileQualityItemResource> { new ProfileQualityItemResource { Quality = Quality.WEBDL1080p, Allowed = true } }
};
profileResource.InjectTo<Profile>();
}
[Test]
public void should_map_tracked_command()
{
var commandResource = new CommandModel { Body = new ApplicationUpdateCommand() };
commandResource.InjectTo<CommandResource>();
}
}
public class ModelWithLazy
{
public LazyLoaded<Guid> Guid { get; set; }
}
public class ModelWithNoLazy
{
public Guid Guid { get; set; }
}
public class TestLazyLoaded<T> : LazyLoaded<T>
{
public override void Prepare(Func<IDataMapper> dataMapperFactory, object parent)
{
throw new InvalidOperationException();
}
}
public class TestModelWrapper
{
public List<TestModel> TestlList { get; set; }
}
public class TestResourceWrapper
{
public List<TestResource> TestList { get; set; }
}
public class TestModel
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}
public class TestResource
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}
}
+12 -16
View File
@@ -38,17 +38,21 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="FluentAssertions, Version=3.4.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FizzWare.NBuilder, Version=4.0.0.115, Culture=neutral, PublicKeyToken=5651b03e12e42c12, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.3.4.0\lib\net40\FluentAssertions.dll</HintPath> <HintPath>..\packages\NBuilder.4.0.0\lib\net40\FizzWare.NBuilder.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="FluentAssertions.Core, Version=3.4.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions, Version=4.19.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.3.4.0\lib\net40\FluentAssertions.Core.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.19.0\lib\net40\FluentAssertions.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="nunit.framework, Version=2.6.3.13283, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL"> <Reference Include="FluentAssertions.Core, Version=4.19.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <HintPath>..\packages\FluentAssertions.4.19.0\lib\net40\FluentAssertions.Core.dll</HintPath>
<HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath> </Reference>
<Reference Include="Moq, Version=4.2.1510.2205, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=3.6.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.6.0\lib\net40\nunit.framework.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
@@ -57,19 +61,12 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="FizzWare.NBuilder">
<HintPath>..\packages\NBuilder.3.0.1.1\lib\FizzWare.NBuilder.dll</HintPath>
</Reference>
<Reference Include="Moq"> <Reference Include="Moq">
<HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath> <HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath>
</Reference> </Reference>
<Reference Include="Omu.ValueInjecter">
<HintPath>..\packages\ValueInjecter.2.3.3\lib\net35\Omu.ValueInjecter.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="ClientSchemaTests\SchemaBuilderFixture.cs" /> <Compile Include="ClientSchemaTests\SchemaBuilderFixture.cs" />
<Compile Include="MappingTests\ResourceMappingFixture.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -104,7 +101,6 @@
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
+4 -5
View File
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="FluentAssertions" version="3.4.0" targetFramework="net40" /> <package id="FluentAssertions" version="4.19.0" targetFramework="net40" />
<package id="Moq" version="4.0.10827" /> <package id="Moq" version="4.0.10827" />
<package id="NBuilder" version="3.0.1.1" targetFramework="net40" /> <package id="NBuilder" version="4.0.0" targetFramework="net40" />
<package id="NUnit" version="2.6.3" targetFramework="net40" /> <package id="NUnit" version="3.6.0" targetFramework="net40" />
<package id="ValueInjecter" version="2.3.3" targetFramework="net40" /> </packages>
</packages>
@@ -3,6 +3,7 @@ using Nancy;
using Nancy.Authentication.Forms; using Nancy.Authentication.Forms;
using Nancy.Extensions; using Nancy.Extensions;
using Nancy.ModelBinding; using Nancy.ModelBinding;
using NzbDrone.Common.EnsureThat;
using NzbDrone.Core.Authentication; using NzbDrone.Core.Authentication;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
@@ -23,6 +24,11 @@ namespace NzbDrone.Api.Authentication
private Response Login(LoginResource resource) private Response Login(LoginResource resource)
{ {
Ensure.That(resource.Username, () => resource.Username).IsNotNullOrWhiteSpace();
// TODO: A null or empty password should not be allowed, uncomment in v3
//Ensure.That(resource.Password, () => resource.Password).IsNotNullOrWhiteSpace();
var user = _userService.FindUser(resource.Username, resource.Password); var user = _userService.FindUser(resource.Username, resource.Password);
if (user == null) if (user == null)
@@ -37,7 +43,7 @@ namespace NzbDrone.Api.Authentication
expiry = DateTime.UtcNow.AddDays(7); expiry = DateTime.UtcNow.AddDays(7);
} }
return this.LoginAndRedirect(user.Identifier, expiry); return this.LoginAndRedirect(user.Identifier, expiry, _configFileProvider.UrlBase + "/");
} }
private Response Logout() private Response Logout()
@@ -27,16 +27,18 @@ namespace NzbDrone.Api.Authentication
_configFileProvider = configFileProvider; _configFileProvider = configFileProvider;
} }
public int Order => 10;
public void Register(IPipelines pipelines) public void Register(IPipelines pipelines)
{ {
if (_configFileProvider.AuthenticationMethod == AuthenticationType.Forms) if (_configFileProvider.AuthenticationMethod == AuthenticationType.Forms)
{ {
RegisterFormsAuth(pipelines); RegisterFormsAuth(pipelines);
} }
else if (_configFileProvider.AuthenticationMethod == AuthenticationType.Basic) else if (_configFileProvider.AuthenticationMethod == AuthenticationType.Basic)
{ {
pipelines.EnableBasicAuthentication(new BasicAuthenticationConfiguration(_authenticationService, "Sonarr")); pipelines.EnableBasicAuthentication(new BasicAuthenticationConfiguration(_authenticationService, "Sonarr"));
} }
pipelines.BeforeRequest.AddItemToEndOfPipeline((Func<NancyContext, Response>) RequiresAuthentication); pipelines.BeforeRequest.AddItemToEndOfPipeline((Func<NancyContext, Response>) RequiresAuthentication);
@@ -66,6 +68,7 @@ namespace NzbDrone.Api.Authentication
{ {
RedirectUrl = _configFileProvider.UrlBase + "/login", RedirectUrl = _configFileProvider.UrlBase + "/login",
UserMapper = _authenticationService, UserMapper = _authenticationService,
Path = _configFileProvider.UrlBase,
CryptographyConfiguration = cryptographyConfiguration CryptographyConfiguration = cryptographyConfiguration
}); });
} }
@@ -75,7 +78,7 @@ namespace NzbDrone.Api.Authentication
if (context.Request.IsApiRequest()) if (context.Request.IsApiRequest())
{ {
if ((context.Response.StatusCode == HttpStatusCode.SeeOther && if ((context.Response.StatusCode == HttpStatusCode.SeeOther &&
context.Response.Headers["Location"].StartsWith("/login", StringComparison.InvariantCultureIgnoreCase)) || context.Response.Headers["Location"].StartsWith($"{_configFileProvider.UrlBase}/login", StringComparison.InvariantCultureIgnoreCase)) ||
context.Response.StatusCode == HttpStatusCode.Unauthorized) context.Response.StatusCode == HttpStatusCode.Unauthorized)
{ {
context.Response = new { Error = "Unauthorized" }.AsResponse(HttpStatusCode.Unauthorized); context.Response = new { Error = "Unauthorized" }.AsResponse(HttpStatusCode.Unauthorized);
@@ -16,15 +16,9 @@ namespace NzbDrone.Api.Blacklist
private PagingResource<BlacklistResource> GetBlacklist(PagingResource<BlacklistResource> pagingResource) private PagingResource<BlacklistResource> GetBlacklist(PagingResource<BlacklistResource> pagingResource)
{ {
var pagingSpec = new PagingSpec<Core.Blacklisting.Blacklist> var pagingSpec = pagingResource.MapToPagingSpec<BlacklistResource, Core.Blacklisting.Blacklist>("id", SortDirection.Ascending);
{
Page = pagingResource.Page,
PageSize = pagingResource.PageSize,
SortKey = pagingResource.SortKey,
SortDirection = pagingResource.SortDirection
};
return ApplyToPage(_blacklistService.Paged, pagingSpec); return ApplyToPage(_blacklistService.Paged, pagingSpec, BlacklistResourceMapper.MapToResource);
} }
private void DeleteBlacklist(int id) private void DeleteBlacklist(int id)
@@ -32,4 +26,4 @@ namespace NzbDrone.Api.Blacklist
_blacklistService.Delete(id); _blacklistService.Delete(id);
} }
} }
} }
@@ -20,4 +20,28 @@ namespace NzbDrone.Api.Blacklist
public SeriesResource Series { get; set; } public SeriesResource Series { get; set; }
} }
public static class BlacklistResourceMapper
{
public static BlacklistResource MapToResource(this Core.Blacklisting.Blacklist model)
{
if (model == null) return null;
return new BlacklistResource
{
Id = model.Id,
SeriesId = model.SeriesId,
EpisodeIds = model.EpisodeIds,
SourceTitle = model.SourceTitle,
Quality = model.Quality,
Date = model.Date,
Protocol = model.Protocol,
Indexer = model.Indexer,
Message = model.Message,
Series = model.Series.ToResource()
};
}
}
} }
+92 -15
View File
@@ -2,62 +2,139 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using DDay.iCal; using Ical.Net;
using Ical.Net.DataTypes;
using Ical.Net.Interfaces.Serialization;
using Ical.Net.Serialization;
using Ical.Net.Serialization.iCalendar.Factory;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using Nancy.Responses; using Nancy.Responses;
using NzbDrone.Core.Tags;
using NzbDrone.Common.Extensions;
namespace NzbDrone.Api.Calendar namespace NzbDrone.Api.Calendar
{ {
public class CalendarFeedModule : NzbDroneFeedModule public class CalendarFeedModule : NzbDroneFeedModule
{ {
private readonly IEpisodeService _episodeService; private readonly IEpisodeService _episodeService;
private readonly ITagService _tagService;
public CalendarFeedModule(IEpisodeService episodeService) public CalendarFeedModule(IEpisodeService episodeService, ITagService tagService)
: base("calendar") : base("calendar")
{ {
_episodeService = episodeService; _episodeService = episodeService;
_tagService = tagService;
Get["/NzbDrone.ics"] = options => GetCalendarFeed(); Get["/NzbDrone.ics"] = options => GetCalendarFeed();
Get["/Sonarr.ics"] = options => GetCalendarFeed();
} }
private Response GetCalendarFeed() private Response GetCalendarFeed()
{ {
var start = DateTime.Today.AddDays(-7); var pastDays = 7;
var end = DateTime.Today.AddDays(28); var futureDays = 28;
var start = DateTime.Today.AddDays(-pastDays);
var end = DateTime.Today.AddDays(futureDays);
var unmonitored = false;
var premiersOnly = false;
var asAllDay = false;
var tags = new List<int>();
// TODO: Remove start/end parameters in v3, they don't work well for iCal
var queryStart = Request.Query.Start; var queryStart = Request.Query.Start;
var queryEnd = Request.Query.End; var queryEnd = Request.Query.End;
var queryPastDays = Request.Query.PastDays;
var queryFutureDays = Request.Query.FutureDays;
var queryUnmonitored = Request.Query.Unmonitored;
var queryPremiersOnly = Request.Query.PremiersOnly;
var queryAsAllDay = Request.Query.AsAllDay;
var queryTags = Request.Query.Tags;
if (queryStart.HasValue) start = DateTime.Parse(queryStart.Value); if (queryStart.HasValue) start = DateTime.Parse(queryStart.Value);
if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value); if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value);
var episodes = _episodeService.EpisodesBetweenDates(start, end, false); if (queryPastDays.HasValue)
var icalCalendar = new iCalendar(); {
pastDays = int.Parse(queryPastDays.Value);
start = DateTime.Today.AddDays(-pastDays);
}
if (queryFutureDays.HasValue)
{
futureDays = int.Parse(queryFutureDays.Value);
end = DateTime.Today.AddDays(futureDays);
}
if (queryUnmonitored.HasValue)
{
unmonitored = bool.Parse(queryUnmonitored.Value);
}
if (queryPremiersOnly.HasValue)
{
premiersOnly = bool.Parse(queryPremiersOnly.Value);
}
if (queryAsAllDay.HasValue)
{
asAllDay = bool.Parse(queryAsAllDay.Value);
}
if (queryTags.HasValue)
{
var tagInput = (string)queryTags.Value.ToString();
tags.AddRange(tagInput.Split(',').Select(_tagService.GetTag).Select(t => t.Id));
}
var episodes = _episodeService.EpisodesBetweenDates(start, end, unmonitored);
var calendar = new Ical.Net.Calendar
{
ProductId = "-//sonarr.tv//Sonarr//EN"
};
foreach (var episode in episodes.OrderBy(v => v.AirDateUtc.Value)) foreach (var episode in episodes.OrderBy(v => v.AirDateUtc.Value))
{ {
var occurrence = icalCalendar.Create<Event>(); if (premiersOnly && (episode.SeasonNumber == 0 || episode.EpisodeNumber != 1))
occurrence.UID = "NzbDrone_episode_" + episode.Id.ToString(); {
continue;
}
if (tags.Any() && tags.None(episode.Series.Tags.Contains))
{
continue;
}
var occurrence = calendar.Create<Event>();
occurrence.Uid = "NzbDrone_episode_" + episode.Id;
occurrence.Status = episode.HasFile ? EventStatus.Confirmed : EventStatus.Tentative; occurrence.Status = episode.HasFile ? EventStatus.Confirmed : EventStatus.Tentative;
occurrence.Start = new iCalDateTime(episode.AirDateUtc.Value) { HasTime = true };
occurrence.End = new iCalDateTime(episode.AirDateUtc.Value.AddMinutes(episode.Series.Runtime)) { HasTime = true };
occurrence.Description = episode.Overview; occurrence.Description = episode.Overview;
occurrence.Categories = new List<string>() { episode.Series.Network }; occurrence.Categories = new List<string>() { episode.Series.Network };
if (asAllDay)
{
occurrence.Start = new CalDateTime(episode.AirDateUtc.Value) { HasTime = false };
}
else
{
occurrence.Start = new CalDateTime(episode.AirDateUtc.Value) { HasTime = true };
occurrence.End = new CalDateTime(episode.AirDateUtc.Value.AddMinutes(episode.Series.Runtime)) { HasTime = true };
}
switch (episode.Series.SeriesType) switch (episode.Series.SeriesType)
{ {
case SeriesTypes.Daily: case SeriesTypes.Daily:
occurrence.Summary = string.Format("{0} - {1}", episode.Series.Title, episode.Title); occurrence.Summary = $"{episode.Series.Title} - {episode.Title}";
break; break;
default: default:
occurrence.Summary = string.Format("{0} - {1}x{2:00} - {3}", episode.Series.Title, episode.SeasonNumber, episode.EpisodeNumber, episode.Title); occurrence.Summary =$"{episode.Series.Title} - {episode.SeasonNumber}x{episode.EpisodeNumber:00} - {episode.Title}";
break; break;
} }
} }
var serializer = new DDay.iCal.Serialization.iCalendar.SerializerFactory().Build(icalCalendar.GetType(), new DDay.iCal.Serialization.SerializationContext()) as DDay.iCal.Serialization.IStringSerializer; var serializer = (IStringSerializer) new SerializerFactory().Build(calendar.GetType(), new SerializationContext());
var icalendar = serializer.SerializeToString(icalCalendar); var icalendar = serializer.SerializeToString(calendar);
return new TextResponse(icalendar, "text/calendar"); return new TextResponse(icalendar, "text/calendar");
} }
+1 -1
View File
@@ -33,7 +33,7 @@ namespace NzbDrone.Api.Calendar
if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value); if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value);
if (queryIncludeUnmonitored.HasValue) includeUnmonitored = Convert.ToBoolean(queryIncludeUnmonitored.Value); if (queryIncludeUnmonitored.HasValue) includeUnmonitored = Convert.ToBoolean(queryIncludeUnmonitored.Value);
var resources = ToListResource(() => _episodeService.EpisodesBetweenDates(start, end, includeUnmonitored)); var resources = MapToResource(_episodeService.EpisodesBetweenDates(start, end, includeUnmonitored), true, true);
return resources.OrderBy(e => e.AirDateUtc).ToList(); return resources.OrderBy(e => e.AirDateUtc).ToList();
} }
+1 -2
View File
@@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
namespace NzbDrone.Api.ClientSchema namespace NzbDrone.Api.ClientSchema
{ {
+7 -13
View File
@@ -6,7 +6,6 @@ using NzbDrone.Common.EnsureThat;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Reflection; using NzbDrone.Common.Reflection;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using Omu.ValueInjecter;
namespace NzbDrone.Api.ClientSchema namespace NzbDrone.Api.ClientSchema
{ {
@@ -56,7 +55,7 @@ namespace NzbDrone.Api.ClientSchema
return result.OrderBy(r => r.Order).ToList(); return result.OrderBy(r => r.Order).ToList();
} }
public static object ReadFormSchema(List<Field> fields, Type targetType, object defaults = null) public static object ReadFromSchema(List<Field> fields, Type targetType)
{ {
Ensure.That(targetType, () => targetType).IsNotNull(); Ensure.That(targetType, () => targetType).IsNotNull();
@@ -64,11 +63,6 @@ namespace NzbDrone.Api.ClientSchema
var target = Activator.CreateInstance(targetType); var target = Activator.CreateInstance(targetType);
if (defaults != null)
{
target.InjectFrom(defaults);
}
foreach (var propertyInfo in properties) foreach (var propertyInfo in properties)
{ {
var fieldAttribute = propertyInfo.GetAttribute<FieldDefinitionAttribute>(false); var fieldAttribute = propertyInfo.GetAttribute<FieldDefinitionAttribute>(false);
@@ -79,14 +73,14 @@ namespace NzbDrone.Api.ClientSchema
if (propertyInfo.PropertyType == typeof(int)) if (propertyInfo.PropertyType == typeof(int))
{ {
var value = Convert.ToInt32(field.Value); var value = field.Value.ToString().ParseInt32();
propertyInfo.SetValue(target, value, null); propertyInfo.SetValue(target, value ?? 0, null);
} }
else if (propertyInfo.PropertyType == typeof(long)) else if (propertyInfo.PropertyType == typeof(long))
{ {
var value = Convert.ToInt64(field.Value); var value = field.Value.ToString().ParseInt64();
propertyInfo.SetValue(target, value, null); propertyInfo.SetValue(target, value ?? 0, null);
} }
else if (propertyInfo.PropertyType == typeof(int?)) else if (propertyInfo.PropertyType == typeof(int?))
@@ -146,9 +140,9 @@ namespace NzbDrone.Api.ClientSchema
} }
public static T ReadFormSchema<T>(List<Field> fields) public static T ReadFromSchema<T>(List<Field> fields)
{ {
return (T)ReadFormSchema(fields, typeof(T)); return (T)ReadFromSchema(fields, typeof(T));
} }
private static List<SelectOption> GetSelectOptions(Type selectOptions) private static List<SelectOption> GetSelectOptions(Type selectOptions)
+5 -8
View File
@@ -2,7 +2,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
using NzbDrone.Api.Mapping;
using NzbDrone.Api.Validation; using NzbDrone.Api.Validation;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Datastore.Events;
@@ -36,15 +35,13 @@ namespace NzbDrone.Api.Commands
private CommandResource GetCommand(int id) private CommandResource GetCommand(int id)
{ {
return _commandQueueManager.Get(id).InjectTo<CommandResource>(); return _commandQueueManager.Get(id).ToResource();
} }
private int StartCommand(CommandResource commandResource) private int StartCommand(CommandResource commandResource)
{ {
var commandType = var commandType = _serviceFactory.GetImplementations(typeof(Command))
_serviceFactory.GetImplementations(typeof (Command)) .Single(c => c.Name.Replace("Command", "").Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
.Single(c => c.Name.Replace("Command", "")
.Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
dynamic command = Request.Body.FromJson(commandType); dynamic command = Request.Body.FromJson(commandType);
command.Trigger = CommandTrigger.Manual; command.Trigger = CommandTrigger.Manual;
@@ -55,14 +52,14 @@ namespace NzbDrone.Api.Commands
private List<CommandResource> GetStartedCommands() private List<CommandResource> GetStartedCommands()
{ {
return ToListResource(_commandQueueManager.GetStarted()); return _commandQueueManager.GetStarted().ToResource();
} }
public void Handle(CommandUpdatedEvent message) public void Handle(CommandUpdatedEvent message)
{ {
if (message.Command.Body.SendUpdatesToClient) if (message.Command.Body.SendUpdatesToClient)
{ {
BroadcastResourceChange(ModelAction.Updated, message.Command.InjectTo<CommandResource>()); BroadcastResourceChange(ModelAction.Updated, message.Command.ToResource());
} }
} }
} }
+38 -3
View File
@@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Commands;
@@ -9,7 +11,7 @@ namespace NzbDrone.Api.Commands
{ {
public string Name { get; set; } public string Name { get; set; }
public string Message { get; set; } public string Message { get; set; }
public Command Body { get; set; } public object Body { get; set; }
public CommandPriority Priority { get; set; } public CommandPriority Priority { get; set; }
public CommandStatus Status { get; set; } public CommandStatus Status { get; set; }
public DateTime Queued { get; set; } public DateTime Queued { get; set; }
@@ -70,7 +72,7 @@ namespace NzbDrone.Api.Commands
{ {
get get
{ {
if (Body != null) return Body.SendUpdatesToClient; if (Body != null) return (Body as Command).SendUpdatesToClient;
return false; return false;
} }
@@ -82,7 +84,7 @@ namespace NzbDrone.Api.Commands
{ {
get get
{ {
if (Body != null) return Body.UpdateScheduledTask; if (Body != null) return (Body as Command).UpdateScheduledTask;
return false; return false;
} }
@@ -92,4 +94,37 @@ namespace NzbDrone.Api.Commands
public DateTime? LastExecutionTime { get; set; } public DateTime? LastExecutionTime { get; set; }
} }
public static class CommandResourceMapper
{
public static CommandResource ToResource(this CommandModel model)
{
if (model == null) return null;
return new CommandResource
{
Id = model.Id,
Name = model.Name,
Message = model.Message,
Body = model.Body,
Priority = model.Priority,
Status = model.Status,
Queued = model.QueuedAt,
Started = model.StartedAt,
Ended = model.EndedAt,
Duration = model.Duration,
Exception = model.Exception,
Trigger = model.Trigger,
CompletionMessage = model.Body.CompletionMessage,
LastExecutionTime = model.Body.LastExecutionTime
};
}
public static List<CommandResource> ToResource(this IEnumerable<CommandModel> models)
{
return models.Select(ToResource).ToList();
}
}
} }
@@ -1,5 +1,4 @@
using System; using FluentValidation;
using FluentValidation;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Validation.Paths; using NzbDrone.Core.Validation.Paths;
@@ -21,5 +20,10 @@ namespace NzbDrone.Api.Config
.SetValidator(pathExistsValidator) .SetValidator(pathExistsValidator)
.When(c => !string.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder)); .When(c => !string.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder));
} }
protected override DownloadClientConfigResource ToResource(IConfigService model)
{
return DownloadClientConfigResourceMapper.ToResource(model);
}
} }
} }
@@ -1,5 +1,5 @@
using System; using NzbDrone.Api.REST;
using NzbDrone.Api.REST; using NzbDrone.Core.Configuration;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
@@ -15,4 +15,23 @@ namespace NzbDrone.Api.Config
public bool AutoRedownloadFailed { get; set; } public bool AutoRedownloadFailed { get; set; }
public bool RemoveFailedDownloads { get; set; } public bool RemoveFailedDownloads { get; set; }
} }
public static class DownloadClientConfigResourceMapper
{
public static DownloadClientConfigResource ToResource(IConfigService model)
{
return new DownloadClientConfigResource
{
DownloadedEpisodesFolder = model.DownloadedEpisodesFolder,
DownloadClientWorkingFolders = model.DownloadClientWorkingFolders,
DownloadedEpisodesScanInterval = model.DownloadedEpisodesScanInterval,
EnableCompletedDownloadHandling = model.EnableCompletedDownloadHandling,
RemoveCompletedDownloads = model.RemoveCompletedDownloads,
AutoRedownloadFailed = model.AutoRedownloadFailed,
RemoveFailedDownloads = model.RemoveFailedDownloads
};
}
}
} }
+5 -5
View File
@@ -8,19 +8,20 @@ using NzbDrone.Core.Configuration;
using NzbDrone.Core.Update; using NzbDrone.Core.Update;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
using NzbDrone.Core.Validation.Paths; using NzbDrone.Core.Validation.Paths;
using Omu.ValueInjecter;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
public class HostConfigModule : NzbDroneRestModule<HostConfigResource> public class HostConfigModule : NzbDroneRestModule<HostConfigResource>
{ {
private readonly IConfigFileProvider _configFileProvider; private readonly IConfigFileProvider _configFileProvider;
private readonly IConfigService _configService;
private readonly IUserService _userService; private readonly IUserService _userService;
public HostConfigModule(IConfigFileProvider configFileProvider, IUserService userService) public HostConfigModule(IConfigFileProvider configFileProvider, IConfigService configService, IUserService userService)
: base("/config/host") : base("/config/host")
{ {
_configFileProvider = configFileProvider; _configFileProvider = configFileProvider;
_configService = configService;
_userService = userService; _userService = userService;
GetResourceSingle = GetHostConfig; GetResourceSingle = GetHostConfig;
@@ -48,12 +49,10 @@ namespace NzbDrone.Api.Config
private HostConfigResource GetHostConfig() private HostConfigResource GetHostConfig()
{ {
var resource = new HostConfigResource(); var resource = _configFileProvider.ToResource(_configService);
resource.InjectFrom(_configFileProvider);
resource.Id = 1; resource.Id = 1;
var user = _userService.FindUser(); var user = _userService.FindUser();
if (user != null) if (user != null)
{ {
resource.Username = user.Username; resource.Username = user.Username;
@@ -75,6 +74,7 @@ namespace NzbDrone.Api.Config
.ToDictionary(prop => prop.Name, prop => prop.GetValue(resource, null)); .ToDictionary(prop => prop.Name, prop => prop.GetValue(resource, null));
_configFileProvider.SaveConfigDictionary(dictionary); _configFileProvider.SaveConfigDictionary(dictionary);
_configService.SaveConfigDictionary(dictionary);
if (resource.Username.IsNotNullOrWhiteSpace() && resource.Password.IsNotNullOrWhiteSpace()) if (resource.Username.IsNotNullOrWhiteSpace() && resource.Password.IsNotNullOrWhiteSpace())
{ {
+47 -3
View File
@@ -1,7 +1,8 @@
using System; using NzbDrone.Api.REST;
using NzbDrone.Api.REST;
using NzbDrone.Core.Authentication; using NzbDrone.Core.Authentication;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Update; using NzbDrone.Core.Update;
using NzbDrone.Common.Http.Proxy;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
@@ -19,11 +20,54 @@ namespace NzbDrone.Api.Config
public string LogLevel { get; set; } public string LogLevel { get; set; }
public string Branch { get; set; } public string Branch { get; set; }
public string ApiKey { get; set; } public string ApiKey { get; set; }
public bool Torrent { get; set; }
public string SslCertHash { get; set; } public string SslCertHash { get; set; }
public string UrlBase { get; set; } public string UrlBase { get; set; }
public bool UpdateAutomatically { get; set; } public bool UpdateAutomatically { get; set; }
public UpdateMechanism UpdateMechanism { get; set; } public UpdateMechanism UpdateMechanism { get; set; }
public string UpdateScriptPath { get; set; } public string UpdateScriptPath { get; set; }
public bool ProxyEnabled { get; set; }
public ProxyType ProxyType { get; set; }
public string ProxyHostname { get; set; }
public int ProxyPort { get; set; }
public string ProxyUsername { get; set; }
public string ProxyPassword { get; set; }
public string ProxyBypassFilter { get; set; }
public bool ProxyBypassLocalAddresses { get; set; }
}
public static class HostConfigResourceMapper
{
public static HostConfigResource ToResource(this IConfigFileProvider model, IConfigService configService)
{
// TODO: Clean this mess up. don't mix data from multiple classes, use sub-resources instead?
return new HostConfigResource
{
BindAddress = model.BindAddress,
Port = model.Port,
SslPort = model.SslPort,
EnableSsl = model.EnableSsl,
LaunchBrowser = model.LaunchBrowser,
AuthenticationMethod = model.AuthenticationMethod,
AnalyticsEnabled = model.AnalyticsEnabled,
//Username
//Password
LogLevel = model.LogLevel,
Branch = model.Branch,
ApiKey = model.ApiKey,
SslCertHash = model.SslCertHash,
UrlBase = model.UrlBase,
UpdateAutomatically = model.UpdateAutomatically,
UpdateMechanism = model.UpdateMechanism,
UpdateScriptPath = model.UpdateScriptPath,
ProxyEnabled = configService.ProxyEnabled,
ProxyType = configService.ProxyType,
ProxyHostname = configService.ProxyHostname,
ProxyPort = configService.ProxyPort,
ProxyUsername = configService.ProxyUsername,
ProxyPassword = configService.ProxyPassword,
ProxyBypassFilter = configService.ProxyBypassFilter,
ProxyBypassLocalAddresses = configService.ProxyBypassLocalAddresses
};
}
} }
} }
@@ -1,4 +1,5 @@
using FluentValidation; using FluentValidation;
using NzbDrone.Api.Validation;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
@@ -16,8 +17,12 @@ namespace NzbDrone.Api.Config
.GreaterThanOrEqualTo(0); .GreaterThanOrEqualTo(0);
SharedValidator.RuleFor(c => c.RssSyncInterval) SharedValidator.RuleFor(c => c.RssSyncInterval)
.InclusiveBetween(10, 120) .IsValidRssSyncInterval();
.When(c => c.RssSyncInterval > 0); }
protected override IndexerConfigResource ToResource(IConfigService model)
{
return IndexerConfigResourceMapper.ToResource(model);
} }
} }
} }
@@ -1,5 +1,5 @@
using System; using NzbDrone.Api.REST;
using NzbDrone.Api.REST; using NzbDrone.Core.Configuration;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
@@ -9,4 +9,17 @@ namespace NzbDrone.Api.Config
public int Retention { get; set; } public int Retention { get; set; }
public int RssSyncInterval { get; set; } public int RssSyncInterval { get; set; }
} }
public static class IndexerConfigResourceMapper
{
public static IndexerConfigResource ToResource(IConfigService model)
{
return new IndexerConfigResource
{
MinimumAge = model.MinimumAge,
Retention = model.Retention,
RssSyncInterval = model.RssSyncInterval,
};
}
}
} }
@@ -1,5 +1,4 @@
using System; using FluentValidation;
using FluentValidation;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Validation.Paths; using NzbDrone.Core.Validation.Paths;
@@ -14,5 +13,10 @@ namespace NzbDrone.Api.Config
SharedValidator.RuleFor(c => c.FolderChmod).NotEmpty(); SharedValidator.RuleFor(c => c.FolderChmod).NotEmpty();
SharedValidator.RuleFor(c => c.RecycleBin).IsValidPath().SetValidator(pathExistsValidator).When(c => !string.IsNullOrWhiteSpace(c.RecycleBin)); SharedValidator.RuleFor(c => c.RecycleBin).IsValidPath().SetValidator(pathExistsValidator).When(c => !string.IsNullOrWhiteSpace(c.RecycleBin));
} }
protected override MediaManagementConfigResource ToResource(IConfigService model)
{
return MediaManagementConfigResourceMapper.ToResource(model);
}
} }
} }
@@ -1,5 +1,5 @@
using System; using NzbDrone.Api.REST;
using NzbDrone.Api.REST; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
@@ -20,6 +20,35 @@ namespace NzbDrone.Api.Config
public bool SkipFreeSpaceCheckWhenImporting { get; set; } public bool SkipFreeSpaceCheckWhenImporting { get; set; }
public bool CopyUsingHardlinks { get; set; } public bool CopyUsingHardlinks { get; set; }
public bool ImportExtraFiles { get; set; }
public string ExtraFileExtensions { get; set; }
public bool EnableMediaInfo { get; set; } public bool EnableMediaInfo { get; set; }
} }
public static class MediaManagementConfigResourceMapper
{
public static MediaManagementConfigResource ToResource(IConfigService model)
{
return new MediaManagementConfigResource
{
AutoUnmonitorPreviouslyDownloadedEpisodes = model.AutoUnmonitorPreviouslyDownloadedEpisodes,
RecycleBin = model.RecycleBin,
AutoDownloadPropers = model.AutoDownloadPropers,
CreateEmptySeriesFolders = model.CreateEmptySeriesFolders,
FileDate = model.FileDate,
SetPermissionsLinux = model.SetPermissionsLinux,
FileChmod = model.FileChmod,
FolderChmod = model.FolderChmod,
ChownUser = model.ChownUser,
ChownGroup = model.ChownGroup,
SkipFreeSpaceCheckWhenImporting = model.SkipFreeSpaceCheckWhenImporting,
CopyUsingHardlinks = model.CopyUsingHardlinks,
ImportExtraFiles = model.ImportExtraFiles,
ExtraFileExtensions = model.ExtraFileExtensions,
EnableMediaInfo = model.EnableMediaInfo
};
}
}
} }
+7 -12
View File
@@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using FluentValidation; using FluentValidation;
using FluentValidation.Results; using FluentValidation.Results;
@@ -7,9 +6,7 @@ using Nancy.Responses;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Organizer; using NzbDrone.Core.Organizer;
using Nancy.ModelBinding; using Nancy.ModelBinding;
using NzbDrone.Api.Mapping;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
using Omu.ValueInjecter;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
@@ -46,7 +43,7 @@ namespace NzbDrone.Api.Config
private void UpdateNamingConfig(NamingConfigResource resource) private void UpdateNamingConfig(NamingConfigResource resource)
{ {
var nameSpec = resource.InjectTo<NamingConfig>(); var nameSpec = resource.ToModel();
ValidateFormatResult(nameSpec); ValidateFormatResult(nameSpec);
_namingConfigService.Save(nameSpec); _namingConfigService.Save(nameSpec);
@@ -55,16 +52,14 @@ namespace NzbDrone.Api.Config
private NamingConfigResource GetNamingConfig() private NamingConfigResource GetNamingConfig()
{ {
var nameSpec = _namingConfigService.GetConfig(); var nameSpec = _namingConfigService.GetConfig();
var resource = nameSpec.InjectTo<NamingConfigResource>(); var resource = nameSpec.ToResource();
if (string.IsNullOrWhiteSpace(resource.StandardEpisodeFormat)) if (resource.StandardEpisodeFormat.IsNotNullOrWhiteSpace())
{ {
return resource; var basicConfig = _filenameBuilder.GetBasicNamingConfig(nameSpec);
basicConfig.AddToResource(resource);
} }
var basicConfig = _filenameBuilder.GetBasicNamingConfig(nameSpec);
resource.InjectFrom(basicConfig);
return resource; return resource;
} }
@@ -75,7 +70,7 @@ namespace NzbDrone.Api.Config
private JsonResponse<NamingSampleResource> GetExamples(NamingConfigResource config) private JsonResponse<NamingSampleResource> GetExamples(NamingConfigResource config)
{ {
var nameSpec = config.InjectTo<NamingConfig>(); var nameSpec = config.ToModel();
var sampleResource = new NamingSampleResource(); var sampleResource = new NamingSampleResource();
var singleEpisodeSampleResult = _filenameSampleService.GetStandardSample(nameSpec); var singleEpisodeSampleResult = _filenameSampleService.GetStandardSample(nameSpec);
@@ -1,5 +1,5 @@
using System; using NzbDrone.Api.REST;
using NzbDrone.Api.REST; using NzbDrone.Core.Organizer;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
@@ -20,4 +20,57 @@ namespace NzbDrone.Api.Config
public string Separator { get; set; } public string Separator { get; set; }
public string NumberStyle { get; set; } public string NumberStyle { get; set; }
} }
public static class NamingConfigResourceMapper
{
public static NamingConfigResource ToResource(this NamingConfig model)
{
return new NamingConfigResource
{
Id = model.Id,
RenameEpisodes = model.RenameEpisodes,
ReplaceIllegalCharacters = model.ReplaceIllegalCharacters,
MultiEpisodeStyle = model.MultiEpisodeStyle,
StandardEpisodeFormat = model.StandardEpisodeFormat,
DailyEpisodeFormat = model.DailyEpisodeFormat,
AnimeEpisodeFormat = model.AnimeEpisodeFormat,
SeriesFolderFormat = model.SeriesFolderFormat,
SeasonFolderFormat = model.SeasonFolderFormat
//IncludeSeriesTitle
//IncludeEpisodeTitle
//IncludeQuality
//ReplaceSpaces
//Separator
//NumberStyle
};
}
public static void AddToResource(this BasicNamingConfig basicNamingConfig, NamingConfigResource resource)
{
resource.IncludeSeriesTitle = basicNamingConfig.IncludeSeriesTitle;
resource.IncludeEpisodeTitle = basicNamingConfig.IncludeEpisodeTitle;
resource.IncludeQuality = basicNamingConfig.IncludeQuality;
resource.ReplaceSpaces = basicNamingConfig.ReplaceSpaces;
resource.Separator = basicNamingConfig.Separator;
resource.NumberStyle = basicNamingConfig.NumberStyle;
}
public static NamingConfig ToModel(this NamingConfigResource resource)
{
return new NamingConfig
{
Id = resource.Id,
RenameEpisodes = resource.RenameEpisodes,
ReplaceIllegalCharacters = resource.ReplaceIllegalCharacters,
MultiEpisodeStyle = resource.MultiEpisodeStyle,
StandardEpisodeFormat = resource.StandardEpisodeFormat,
DailyEpisodeFormat = resource.DailyEpisodeFormat,
AnimeEpisodeFormat = resource.AnimeEpisodeFormat,
SeriesFolderFormat = resource.SeriesFolderFormat,
SeasonFolderFormat = resource.SeasonFolderFormat
};
}
}
} }
@@ -2,7 +2,6 @@
using System.Reflection; using System.Reflection;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using Omu.ValueInjecter;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
@@ -27,13 +26,14 @@ namespace NzbDrone.Api.Config
private TResource GetConfig() private TResource GetConfig()
{ {
var resource = new TResource(); var resource = ToResource(_configService);
resource.InjectFrom(_configService);
resource.Id = 1; resource.Id = 1;
return resource; return resource;
} }
protected abstract TResource ToResource(IConfigService model);
private TResource GetConfig(int id) private TResource GetConfig(int id)
{ {
return GetConfig(); return GetConfig();
+5 -32
View File
@@ -1,45 +1,18 @@
using System.Linq; using NzbDrone.Core.Configuration;
using System.Reflection;
using NzbDrone.Core.Configuration;
using Omu.ValueInjecter;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
public class UiConfigModule : NzbDroneRestModule<UiConfigResource> public class UiConfigModule : NzbDroneConfigModule<UiConfigResource>
{ {
private readonly IConfigService _configService;
public UiConfigModule(IConfigService configService) public UiConfigModule(IConfigService configService)
: base("/config/ui") : base(configService)
{ {
_configService = configService;
GetResourceSingle = GetUiConfig;
GetResourceById = GetUiConfig;
UpdateResource = SaveUiConfig;
} }
private UiConfigResource GetUiConfig() protected override UiConfigResource ToResource(IConfigService model)
{ {
var resource = new UiConfigResource(); return UiConfigResourceMapper.ToResource(model);
resource.InjectFrom(_configService);
resource.Id = 1;
return resource;
}
private UiConfigResource GetUiConfig(int id)
{
return GetUiConfig();
}
private void SaveUiConfig(UiConfigResource resource)
{
var dictionary = resource.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.ToDictionary(prop => prop.Name, prop => prop.GetValue(resource, null));
_configService.SaveConfigDictionary(dictionary);
} }
} }
} }
+21 -2
View File
@@ -1,5 +1,5 @@
using System; using NzbDrone.Api.REST;
using NzbDrone.Api.REST; using NzbDrone.Core.Configuration;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
@@ -17,4 +17,23 @@ namespace NzbDrone.Api.Config
public bool EnableColorImpairedMode { get; set; } public bool EnableColorImpairedMode { get; set; }
} }
public static class UiConfigResourceMapper
{
public static UiConfigResource ToResource(IConfigService model)
{
return new UiConfigResource
{
FirstDayOfWeek = model.FirstDayOfWeek,
CalendarWeekColumnHeader = model.CalendarWeekColumnHeader,
ShortDateFormat = model.ShortDateFormat,
LongDateFormat = model.LongDateFormat,
TimeFormat = model.TimeFormat,
ShowRelativeDates = model.ShowRelativeDates,
EnableColorImpairedMode = model.EnableColorImpairedMode,
};
}
}
} }
@@ -8,15 +8,16 @@ namespace NzbDrone.Api.DiskSpace
private readonly IDiskSpaceService _diskSpaceService; private readonly IDiskSpaceService _diskSpaceService;
public DiskSpaceModule(IDiskSpaceService diskSpaceService) public DiskSpaceModule(IDiskSpaceService diskSpaceService)
:base("diskspace") : base("diskspace")
{ {
_diskSpaceService = diskSpaceService; _diskSpaceService = diskSpaceService;
GetResourceAll = GetFreeSpace; GetResourceAll = GetFreeSpace;
} }
public List<DiskSpaceResource> GetFreeSpace() public List<DiskSpaceResource> GetFreeSpace()
{ {
return ToListResource(_diskSpaceService.GetFreeSpace); return _diskSpaceService.GetFreeSpace().ConvertAll(DiskSpaceResourceMapper.MapToResource);
} }
} }
} }
@@ -1,5 +1,4 @@
using System; using NzbDrone.Api.REST;
using NzbDrone.Api.REST;
namespace NzbDrone.Api.DiskSpace namespace NzbDrone.Api.DiskSpace
{ {
@@ -10,4 +9,20 @@ namespace NzbDrone.Api.DiskSpace
public long FreeSpace { get; set; } public long FreeSpace { get; set; }
public long TotalSpace { get; set; } public long TotalSpace { get; set; }
} }
public static class DiskSpaceResourceMapper
{
public static DiskSpaceResource MapToResource(this Core.DiskSpace.DiskSpace model)
{
if (model == null) return null;
return new DiskSpaceResource
{
Path = model.Path,
Label = model.Label,
FreeSpace = model.FreeSpace,
TotalSpace = model.TotalSpace
};
}
}
} }
@@ -9,6 +9,22 @@ namespace NzbDrone.Api.DownloadClient
{ {
} }
protected override void MapToResource(DownloadClientResource resource, DownloadClientDefinition definition)
{
base.MapToResource(resource, definition);
resource.Enable = definition.Enable;
resource.Protocol = definition.Protocol;
}
protected override void MapToModel(DownloadClientDefinition definition, DownloadClientResource resource)
{
base.MapToModel(definition, resource);
definition.Enable = resource.Enable;
definition.Protocol = resource.Protocol;
}
protected override void Validate(DownloadClientDefinition definition, bool includeWarnings) protected override void Validate(DownloadClientDefinition definition, bool includeWarnings)
{ {
if (!definition.Enable) return; if (!definition.Enable) return;
@@ -1,5 +1,4 @@
using System; using NzbDrone.Core.Indexers;
using NzbDrone.Core.Indexers;
namespace NzbDrone.Api.DownloadClient namespace NzbDrone.Api.DownloadClient
{ {
@@ -1,11 +1,11 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using NLog; using NLog;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using NzbDrone.Api.Mapping;
using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
@@ -14,17 +14,19 @@ using NzbDrone.SignalR;
namespace NzbDrone.Api.EpisodeFiles namespace NzbDrone.Api.EpisodeFiles
{ {
public class EpisodeModule : NzbDroneRestModuleWithSignalR<EpisodeFileResource, EpisodeFile>, public class EpisodeFileModule : NzbDroneRestModuleWithSignalR<EpisodeFileResource, EpisodeFile>,
IHandle<EpisodeFileAddedEvent> IHandle<EpisodeFileAddedEvent>
{ {
private readonly IMediaFileService _mediaFileService; private readonly IMediaFileService _mediaFileService;
private readonly IDiskProvider _diskProvider;
private readonly IRecycleBinProvider _recycleBinProvider; private readonly IRecycleBinProvider _recycleBinProvider;
private readonly ISeriesService _seriesService; private readonly ISeriesService _seriesService;
private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification; private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification;
private readonly Logger _logger; private readonly Logger _logger;
public EpisodeModule(IBroadcastSignalRMessage signalRBroadcaster, public EpisodeFileModule(IBroadcastSignalRMessage signalRBroadcaster,
IMediaFileService mediaFileService, IMediaFileService mediaFileService,
IDiskProvider diskProvider,
IRecycleBinProvider recycleBinProvider, IRecycleBinProvider recycleBinProvider,
ISeriesService seriesService, ISeriesService seriesService,
IQualityUpgradableSpecification qualityUpgradableSpecification, IQualityUpgradableSpecification qualityUpgradableSpecification,
@@ -32,6 +34,7 @@ namespace NzbDrone.Api.EpisodeFiles
: base(signalRBroadcaster) : base(signalRBroadcaster)
{ {
_mediaFileService = mediaFileService; _mediaFileService = mediaFileService;
_diskProvider = diskProvider;
_recycleBinProvider = recycleBinProvider; _recycleBinProvider = recycleBinProvider;
_seriesService = seriesService; _seriesService = seriesService;
_qualityUpgradableSpecification = qualityUpgradableSpecification; _qualityUpgradableSpecification = qualityUpgradableSpecification;
@@ -47,22 +50,21 @@ namespace NzbDrone.Api.EpisodeFiles
var episodeFile = _mediaFileService.Get(id); var episodeFile = _mediaFileService.Get(id);
var series = _seriesService.GetSeries(episodeFile.SeriesId); var series = _seriesService.GetSeries(episodeFile.SeriesId);
return MapToResource(series, episodeFile); return episodeFile.ToResource(series, _qualityUpgradableSpecification);
} }
private List<EpisodeFileResource> GetEpisodeFiles() private List<EpisodeFileResource> GetEpisodeFiles()
{ {
var seriesId = (int?)Request.Query.SeriesId; if (!Request.Query.SeriesId.HasValue)
if (seriesId == null)
{ {
throw new BadRequestException("seriesId is missing"); throw new BadRequestException("seriesId is missing");
} }
var series = _seriesService.GetSeries(seriesId.Value); var seriesId = (int)Request.Query.SeriesId;
return _mediaFileService.GetFilesBySeries(seriesId.Value) var series = _seriesService.GetSeries(seriesId);
.Select(f => MapToResource(series, f)).ToList();
return _mediaFileService.GetFilesBySeries(seriesId).ConvertAll(f => f.ToResource(series, _qualityUpgradableSpecification));
} }
private void SetQuality(EpisodeFileResource episodeFileResource) private void SetQuality(EpisodeFileResource episodeFileResource)
@@ -77,22 +79,13 @@ namespace NzbDrone.Api.EpisodeFiles
var episodeFile = _mediaFileService.Get(id); var episodeFile = _mediaFileService.Get(id);
var series = _seriesService.GetSeries(episodeFile.SeriesId); var series = _seriesService.GetSeries(episodeFile.SeriesId);
var fullPath = Path.Combine(series.Path, episodeFile.RelativePath); var fullPath = Path.Combine(series.Path, episodeFile.RelativePath);
var subfolder = _diskProvider.GetParentFolder(series.Path).GetRelativePath(_diskProvider.GetParentFolder(fullPath));
_logger.Info("Deleting episode file: {0}", fullPath); _logger.Info("Deleting episode file: {0}", fullPath);
_recycleBinProvider.DeleteFile(fullPath); _recycleBinProvider.DeleteFile(fullPath, subfolder);
_mediaFileService.Delete(episodeFile, DeleteMediaFileReason.Manual); _mediaFileService.Delete(episodeFile, DeleteMediaFileReason.Manual);
} }
private EpisodeFileResource MapToResource(Core.Tv.Series series, EpisodeFile episodeFile)
{
var resource = episodeFile.InjectTo<EpisodeFileResource>();
resource.Path = Path.Combine(series.Path, episodeFile.RelativePath);
resource.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(series.Profile.Value, episodeFile.Quality);
return resource;
}
public void Handle(EpisodeFileAddedEvent message) public void Handle(EpisodeFileAddedEvent message)
{ {
BroadcastResourceChange(ModelAction.Updated, message.EpisodeFile.Id); BroadcastResourceChange(ModelAction.Updated, message.EpisodeFile.Id);
@@ -1,4 +1,5 @@
using System; using System;
using System.IO;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
@@ -17,4 +18,47 @@ namespace NzbDrone.Api.EpisodeFiles
public bool QualityCutoffNotMet { get; set; } public bool QualityCutoffNotMet { get; set; }
} }
public static class EpisodeFileResourceMapper
{
private static EpisodeFileResource ToResource(this Core.MediaFiles.EpisodeFile model)
{
if (model == null) return null;
return new EpisodeFileResource
{
Id = model.Id,
SeriesId = model.SeriesId,
SeasonNumber = model.SeasonNumber,
RelativePath = model.RelativePath,
//Path
Size = model.Size,
DateAdded = model.DateAdded,
SceneName = model.SceneName,
Quality = model.Quality,
//QualityCutoffNotMet
};
}
public static EpisodeFileResource ToResource(this Core.MediaFiles.EpisodeFile model, Core.Tv.Series series, Core.DecisionEngine.IQualityUpgradableSpecification qualityUpgradableSpecification)
{
if (model == null) return null;
return new EpisodeFileResource
{
Id = model.Id,
SeriesId = model.SeriesId,
SeasonNumber = model.SeasonNumber,
RelativePath = model.RelativePath,
Path = Path.Combine(series.Path, model.RelativePath),
Size = model.Size,
DateAdded = model.DateAdded,
SceneName = model.SceneName,
Quality = model.Quality,
QualityCutoffNotMet = qualityUpgradableSpecification.CutoffNotMet(series.Profile.Value, model.Quality)
};
}
}
} }
+5 -5
View File
@@ -20,14 +20,14 @@ namespace NzbDrone.Api.Episodes
private List<EpisodeResource> GetEpisodes() private List<EpisodeResource> GetEpisodes()
{ {
var seriesId = (int?)Request.Query.SeriesId; if (!Request.Query.SeriesId.HasValue)
if (seriesId == null)
{ {
throw new BadRequestException("seriesId is missing"); throw new BadRequestException("seriesId is missing");
} }
var resources = ToListResource(_episodeService.GetEpisodeBySeries(seriesId.Value)); var seriesId = (int)Request.Query.SeriesId;
var resources = MapToResource(_episodeService.GetEpisodeBySeries(seriesId), false, true);
return resources; return resources;
} }
@@ -37,4 +37,4 @@ namespace NzbDrone.Api.Episodes
_episodeService.SetEpisodeMonitored(episodeResource.Id, episodeResource.Monitored); _episodeService.SetEpisodeMonitored(episodeResource.Id, episodeResource.Monitored);
} }
} }
} }
@@ -1,9 +1,6 @@
using System; using System.Collections.Generic;
using System.Collections.Generic; using NzbDrone.Common.Extensions;
using System.IO; using NzbDrone.Api.EpisodeFiles;
using System.Linq;
using NzbDrone.Api.Extensions;
using NzbDrone.Api.Mapping;
using NzbDrone.Api.Series; using NzbDrone.Api.Series;
using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
@@ -53,40 +50,65 @@ namespace NzbDrone.Api.Episodes
protected EpisodeResource GetEpisode(int id) protected EpisodeResource GetEpisode(int id)
{ {
var episode = _episodeService.GetEpisode(id); var episode = _episodeService.GetEpisode(id);
episode.EpisodeFile.LazyLoad(); var resource = MapToResource(episode, true, true);
episode.Series = _seriesService.GetSeries(episode.SeriesId); return resource;
return ToResource(episode);
} }
protected override EpisodeResource ToResource<TModel>(TModel model) protected EpisodeResource MapToResource(Episode episode, bool includeSeries, bool includeEpisodeFile)
{ {
var resource = base.ToResource(model); var resource = episode.ToResource();
var episode = model as Episode; if (includeSeries || includeEpisodeFile)
if (episode != null)
{ {
if (episode.EpisodeFile.IsLoaded && episode.EpisodeFile.Value != null) var series = episode.Series ?? _seriesService.GetSeries(episode.SeriesId);
if (includeSeries)
{ {
resource.EpisodeFile.Path = Path.Combine(episode.Series.Path, episode.EpisodeFile.Value.RelativePath); resource.Series = series.ToResource();
resource.EpisodeFile.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(episode.Series.Profile.Value, episode.EpisodeFile.Value.Quality); }
if (includeEpisodeFile && episode.EpisodeFileId != 0)
{
resource.EpisodeFile = episode.EpisodeFile.Value.ToResource(series, _qualityUpgradableSpecification);
} }
} }
return resource; return resource;
} }
protected override List<EpisodeResource> ToListResource<TModel>(IEnumerable<TModel> modelList) protected List<EpisodeResource> MapToResource(List<Episode> episodes, bool includeSeries, bool includeEpisodeFile)
{ {
var resources = base.ToListResource(modelList); var result = episodes.ToResource();
return resources.LoadSubtype<EpisodeResource, SeriesResource, Core.Tv.Series>(e => e.SeriesId, _seriesService.GetSeries).ToList(); if (includeSeries || includeEpisodeFile)
{
var seriesDict = new Dictionary<int, Core.Tv.Series>();
for (var i = 0; i < episodes.Count; i++)
{
var episode = episodes[i];
var resource = result[i];
var series = episode.Series ?? seriesDict.GetValueOrDefault(episodes[i].SeriesId) ?? _seriesService.GetSeries(episodes[i].SeriesId);
seriesDict[series.Id] = series;
if (includeSeries)
{
resource.Series = series.ToResource();
}
if (includeEpisodeFile && episodes[i].EpisodeFileId != 0)
{
resource.EpisodeFile = episodes[i].EpisodeFile.Value.ToResource(series, _qualityUpgradableSpecification);
}
}
}
return result;
} }
public void Handle(EpisodeGrabbedEvent message) public void Handle(EpisodeGrabbedEvent message)
{ {
foreach (var episode in message.Episode.Episodes) foreach (var episode in message.Episode.Episodes)
{ {
var resource = episode.InjectTo<EpisodeResource>(); var resource = episode.ToResource();
resource.Grabbed = true; resource.Grabbed = true;
BroadcastResourceChange(ModelAction.Updated, resource); BroadcastResourceChange(ModelAction.Updated, resource);
@@ -101,4 +123,4 @@ namespace NzbDrone.Api.Episodes
} }
} }
} }
} }
+43 -2
View File
@@ -1,8 +1,11 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
using NzbDrone.Api.EpisodeFiles; using NzbDrone.Api.EpisodeFiles;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Api.Series; using NzbDrone.Api.Series;
using NzbDrone.Core.Tv;
namespace NzbDrone.Api.Episodes namespace NzbDrone.Api.Episodes
{ {
@@ -25,8 +28,6 @@ namespace NzbDrone.Api.Episodes
public int? SceneEpisodeNumber { get; set; } public int? SceneEpisodeNumber { get; set; }
public int? SceneSeasonNumber { get; set; } public int? SceneSeasonNumber { get; set; }
public bool UnverifiedSceneNumbering { get; set; } public bool UnverifiedSceneNumbering { get; set; }
public DateTime? EndTime { get; set; }
public DateTime? GrabDate { get; set; }
public string SeriesTitle { get; set; } public string SeriesTitle { get; set; }
public SeriesResource Series { get; set; } public SeriesResource Series { get; set; }
@@ -34,4 +35,44 @@ namespace NzbDrone.Api.Episodes
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool Grabbed { get; set; } public bool Grabbed { get; set; }
} }
public static class EpisodeResourceMapper
{
public static EpisodeResource ToResource(this Episode model)
{
if (model == null) return null;
return new EpisodeResource
{
Id = model.Id,
SeriesId = model.SeriesId,
EpisodeFileId = model.EpisodeFileId,
SeasonNumber = model.SeasonNumber,
EpisodeNumber = model.EpisodeNumber,
Title = model.Title,
AirDate = model.AirDate,
AirDateUtc = model.AirDateUtc,
Overview = model.Overview,
//EpisodeFile
HasFile = model.HasFile,
Monitored = model.Monitored,
AbsoluteEpisodeNumber = model.AbsoluteEpisodeNumber,
SceneAbsoluteEpisodeNumber = model.SceneAbsoluteEpisodeNumber,
SceneEpisodeNumber = model.SceneEpisodeNumber,
SceneSeasonNumber = model.SceneSeasonNumber,
UnverifiedSceneNumbering = model.UnverifiedSceneNumbering,
SeriesTitle = model.SeriesTitle,
//Series = model.Series.MapToResource(),
};
}
public static List<EpisodeResource> ToResource(this IEnumerable<Episode> models)
{
if (models == null) return null;
return models.Select(ToResource).ToList();
}
}
} }
@@ -18,25 +18,20 @@ namespace NzbDrone.Api.Episodes
private List<RenameEpisodeResource> GetEpisodes() private List<RenameEpisodeResource> GetEpisodes()
{ {
int seriesId; if (!Request.Query.SeriesId.HasValue)
if (Request.Query.SeriesId.HasValue)
{
seriesId = (int)Request.Query.SeriesId;
}
else
{ {
throw new BadRequestException("seriesId is missing"); throw new BadRequestException("seriesId is missing");
} }
var seriesId = (int)Request.Query.SeriesId;
if (Request.Query.SeasonNumber.HasValue) if (Request.Query.SeasonNumber.HasValue)
{ {
var seasonNumber = (int)Request.Query.SeasonNumber; var seasonNumber = (int)Request.Query.SeasonNumber;
return ToListResource(() => _renameEpisodeFileService.GetRenamePreviews(seriesId, seasonNumber)); return _renameEpisodeFileService.GetRenamePreviews(seriesId, seasonNumber).ToResource();
} }
return ToListResource(() => _renameEpisodeFileService.GetRenamePreviews(seriesId)); return _renameEpisodeFileService.GetRenamePreviews(seriesId).ToResource();
} }
} }
} }
@@ -1,5 +1,5 @@
using System; using System.Collections.Generic;
using System.Collections.Generic; using System.Linq;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
namespace NzbDrone.Api.Episodes namespace NzbDrone.Api.Episodes
@@ -13,4 +13,27 @@ namespace NzbDrone.Api.Episodes
public string ExistingPath { get; set; } public string ExistingPath { get; set; }
public string NewPath { get; set; } public string NewPath { get; set; }
} }
public static class RenameEpisodeResourceMapper
{
public static RenameEpisodeResource ToResource(this Core.MediaFiles.RenameEpisodeFilePreview model)
{
if (model == null) return null;
return new RenameEpisodeResource
{
SeriesId = model.SeriesId,
SeasonNumber = model.SeasonNumber,
EpisodeNumbers = model.EpisodeNumbers.ToList(),
EpisodeFileId = model.EpisodeFileId,
ExistingPath = model.ExistingPath,
NewPath = model.NewPath
};
}
public static List<RenameEpisodeResource> ToResource(this IEnumerable<Core.MediaFiles.RenameEpisodeFilePreview> models)
{
return models.Select(ToResource).ToList();
}
}
} }
@@ -26,7 +26,7 @@ namespace NzbDrone.Api.ErrorManagement
if (apiException != null) if (apiException != null)
{ {
_logger.WarnException("API Error", apiException); _logger.Warn(apiException, "API Error");
return apiException.ToErrorResponse(); return apiException.ToErrorResponse();
} }
@@ -63,18 +63,16 @@ namespace NzbDrone.Api.ErrorManagement
}.AsResponse(HttpStatusCode.Conflict); }.AsResponse(HttpStatusCode.Conflict);
} }
var sqlErrorMessage = string.Format("[{0} {1}]", context.Request.Method, context.Request.Path); _logger.Error(sqLiteException, "[{0} {1}]", context.Request.Method, context.Request.Path);
_logger.ErrorException(sqlErrorMessage, sqLiteException);
} }
_logger.FatalException("Request Failed", exception); _logger.Fatal(exception, "Request Failed. {0} {1}", context.Request.Method, context.Request.Path);
return new ErrorModel return new ErrorModel
{ {
Message = exception.Message, Message = exception.Message,
Description = exception.ToString() Description = exception.ToString()
}.AsResponse(HttpStatusCode.InternalServerError); }.AsResponse(HttpStatusCode.InternalServerError);
} }
} }
} }
@@ -1,55 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using NzbDrone.Api.Mapping;
using NzbDrone.Api.REST;
using NzbDrone.Common.Cache;
using NzbDrone.Core.Datastore;
namespace NzbDrone.Api.Extensions
{
public static class LazyExtensions
{
private static readonly ICached<MethodInfo> SetterCache = new Cached<MethodInfo>();
public static IEnumerable<TParent> LoadSubtype<TParent, TChild, TSourceChild>(this IEnumerable<TParent> parents, Func<TParent, int> foreignKeySelector, Func<IEnumerable<int>, IEnumerable<TSourceChild>> sourceChildSelector)
where TSourceChild : ModelBase, new()
where TChild : RestResource, new()
where TParent : RestResource
{
var parentList = parents.Where(p => foreignKeySelector(p) != 0).ToList();
if (!parentList.Any())
{
return parents;
}
var ids = parentList.Select(foreignKeySelector).Distinct();
var childDictionary = sourceChildSelector(ids).ToDictionary(child => child.Id, child => child);
var childSetter = GetChildSetter<TParent, TChild>();
foreach (var episode in parentList)
{
childSetter.Invoke(episode, new object[] { childDictionary[foreignKeySelector(episode)].InjectTo<TChild>() });
}
return parents;
}
private static MethodInfo GetChildSetter<TParent, TChild>()
where TChild : RestResource
where TParent : RestResource
{
var key = typeof(TChild).FullName + typeof(TParent).FullName;
return SetterCache.Get(key, () =>
{
var property = typeof(TParent).GetProperties().Single(c => c.PropertyType == typeof(TChild));
return property.GetSetMethod();
});
}
}
}
@@ -14,6 +14,8 @@ namespace NzbDrone.Api.Extensions.Pipelines
_cacheableSpecification = cacheableSpecification; _cacheableSpecification = cacheableSpecification;
} }
public int Order => 0;
public void Register(IPipelines pipelines) public void Register(IPipelines pipelines)
{ {
pipelines.AfterRequest.AddItemToStartOfPipeline((Action<NancyContext>) Handle); pipelines.AfterRequest.AddItemToStartOfPipeline((Action<NancyContext>) Handle);
@@ -7,6 +7,8 @@ namespace NzbDrone.Api.Extensions.Pipelines
{ {
public class CorsPipeline : IRegisterNancyPipeline public class CorsPipeline : IRegisterNancyPipeline
{ {
public int Order => 0;
public void Register(IPipelines pipelines) public void Register(IPipelines pipelines)
{ {
pipelines.AfterRequest.AddItemToEndOfPipeline((Action<NancyContext>) Handle); pipelines.AfterRequest.AddItemToEndOfPipeline((Action<NancyContext>) Handle);
@@ -5,6 +5,7 @@ using System.Linq;
using Nancy; using Nancy;
using Nancy.Bootstrapper; using Nancy.Bootstrapper;
using NLog; using NLog;
using NzbDrone.Common.Extensions;
namespace NzbDrone.Api.Extensions.Pipelines namespace NzbDrone.Api.Extensions.Pipelines
{ {
@@ -12,6 +13,8 @@ namespace NzbDrone.Api.Extensions.Pipelines
{ {
private readonly Logger _logger; private readonly Logger _logger;
public int Order => 0;
public GzipCompressionPipeline(Logger logger) public GzipCompressionPipeline(Logger logger)
{ {
_logger = logger; _logger = logger;
@@ -19,50 +22,62 @@ namespace NzbDrone.Api.Extensions.Pipelines
public void Register(IPipelines pipelines) public void Register(IPipelines pipelines)
{ {
pipelines.AfterRequest.AddItemToEndOfPipeline(c => CompressResponse(c.Request, c.Response)); pipelines.AfterRequest.AddItemToEndOfPipeline(CompressResponse);
} }
private Response CompressResponse(Request request, Response response) private void CompressResponse(NancyContext context)
{ {
var request = context.Request;
var response = context.Response;
try try
{ {
if ( if (
!response.ContentType.Contains("image") !response.ContentType.Contains("image")
&& !response.ContentType.Contains("font") && !response.ContentType.Contains("font")
&& request.Headers.AcceptEncoding.Any(x => x.Contains("gzip")) && request.Headers.AcceptEncoding.Any(x => x.Contains("gzip"))
&& (!response.Headers.ContainsKey("Content-Encoding") || response.Headers["Content-Encoding"] != "gzip")) && !AlreadyGzipEncoded(response)
&& !ContentLengthIsTooSmall(response))
{ {
var data = new MemoryStream(); var contents = response.Contents;
response.Contents.Invoke(data);
data.Position = 0;
if (data.Length < 1024)
{
response.Contents = stream =>
{
data.CopyTo(stream);
stream.Flush();
};
}
else
{
response.Headers["Content-Encoding"] = "gzip";
response.Contents = s =>
{
var gzip = new GZipStream(s, CompressionMode.Compress, true);
data.CopyTo(gzip);
gzip.Close();
};
}
}
return response; response.Headers["Content-Encoding"] = "gzip";
response.Contents = responseStream =>
{
using (var gzip = new GZipStream(responseStream, CompressionMode.Compress, true))
using (var buffered = new BufferedStream(gzip, 8192))
{
contents.Invoke(buffered);
}
};
}
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.ErrorException("Unable to gzip response", ex); _logger.Error(ex, "Unable to gzip response");
throw; throw;
} }
} }
private static bool ContentLengthIsTooSmall(Response response)
{
var contentLength = response.Headers.GetValueOrDefault("Content-Length");
if (contentLength != null && long.Parse(contentLength) < 1024)
{
return true;
}
return false;
}
private static bool AlreadyGzipEncoded(Response response)
{
var contentEncoding = response.Headers.GetValueOrDefault("Content-Encoding");
if (contentEncoding == "gzip")
{
return true;
}
return false;
}
} }
} }

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