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

Compare commits

..

85 Commits

Author SHA1 Message Date
Leonardo Galli a48793edd2 Fixed: Changes in http redirect logic causing failed grabs and >25% cpu usage. 2018-03-04 16:01:40 +01:00
Leonardo Galli 799a448544 Fixed: http->https redirects do not use the tls1.2 curl fallback.
fixes #1862
2018-03-04 15:57:02 +01:00
Leonardo Galli 57adf0e3a5 Fixed: Dates before 1970 causing an exception.
Fixes #1913
2018-03-04 15:42:15 +01:00
Leonardo Galli 61ee8edb5a Fixed: Browser not updating on Movie File Imported.
Fixes #657
2018-03-04 15:35:12 +01:00
Leonardo Galli ed1154ec3c @cosmetic Updated Changelog 2018-03-04 15:25:52 +01:00
Paul Kozlovitch 2d99f9268a Added: Copy & Paste now triggers search (#2587) 2018-03-04 15:24:49 +01:00
Simon Chapman 55dde613c2 Fixed: Movies not getting unmonitored when folder gets deleted (#2588)
Fixes #1191, fixes #1590
2018-03-04 15:24:07 +01:00
Leonardo Galli b83f2ca0ee Merge remote-tracking branch 'origin/develop' into develop 2018-03-04 15:23:15 +01:00
Leonardo Galli fc61f84522 @cosmetic Updated Changelog 2018-03-04 15:23:09 +01:00
Leonardo Galli c1692ff84c Merge remote-tracking branch 'origin/develop' into develop 2018-03-03 17:08:31 +01:00
Leonardo Galli 65c3704ff0 Fixed: NLog causing a crash under mono 5.10
Fixes #2585
Merge remote-tracking branch 'origin/develop' into develop


Revert "Fixed: NLog causing a crash under mono 5.10"

This reverts commit d11b565eda.

Added console logging in case NLog fails to initialize.

Fixed: Updated NLog to 4.5 RC6 to handle mono 5.10
Fixed: Messed up merge from Cherry pick


Fixed: Appveyor build.


Revert "Fixed: Appveyor build."

This reverts commit 99282359c4.

Revert "Fixed: Messed up merge from Cherry pick"

This reverts commit 450d90586d.

Revert "Fixed: Updated NLog to 4.5 RC6 to handle mono 5.10"

This reverts commit 1b20cbb5e3.

Fixed: NLog causing issues with mono 5.10
2018-03-03 17:07:50 +01:00
Leonardo Galli 0ab7c19e54 Revert "Fixed: Updated NLog to 4.5 RC6 to handle mono 5.10"
This reverts commit 1b20cbb5e3.
2018-03-03 00:40:31 +01:00
Leonardo Galli f70c769070 Revert "Fixed: Messed up merge from Cherry pick"
This reverts commit 450d90586d.
2018-03-03 00:40:23 +01:00
Leonardo Galli 702f61213c Revert "Fixed: Appveyor build."
This reverts commit 99282359c4.
2018-03-03 00:40:16 +01:00
Leonardo Galli 99282359c4 Fixed: Appveyor build. 2018-03-03 00:13:28 +01:00
Leonardo Galli 450d90586d Fixed: Messed up merge from Cherry pick 2018-03-02 20:04:16 +01:00
Leonardo Galli 1b20cbb5e3 Fixed: Updated NLog to 4.5 RC6 to handle mono 5.10 2018-03-02 20:00:28 +01:00
Taloth Saldono 400cf0e073 Added console logging in case NLog fails to initialize. 2018-03-02 19:56:48 +01:00
Leonardo Galli 79b3682b0f Revert "Fixed: NLog causing a crash under mono 5.10"
This reverts commit d11b565eda.
2018-03-02 19:55:47 +01:00
Leonardo Galli cbf8106672 Merge remote-tracking branch 'origin/develop' into develop 2018-03-01 22:37:35 +01:00
Leonardo Galli d11b565eda Fixed: NLog causing a crash under mono 5.10
Fixes #2585
2018-03-01 22:37:30 +01:00
Leonardo Galli 2ba1af5874 Merge pull request #2590 from Qstick/patch-1
Fixed: Pin Cake and Addin Versions
2018-03-01 08:55:59 +01:00
Qstick 731c9acd94 Fixed: Pin cake and addin versions 2018-02-28 23:08:18 -05:00
Qstick 59a176f03b Fixed: Temp Workaround for Appveyor Cake Issue 2018-02-27 22:43:16 -05:00
Qstick 6482024dc5 Fixed: Poster sliding issues (#2570)
Fixes #2568
2018-02-26 16:08:57 +01:00
Qstick 9e7e8cff11 Fixed: Multiple History Issues (#2571) 2018-02-26 16:08:44 +01:00
Leonardo Galli 15fe7a844c @cosmetic Updated Changelog 2018-02-21 11:04:23 +01:00
thezoggy 68d32e4d31 Fixed: Another Delete modal is fixed. (#2560)
Fixes #2537
2018-02-21 11:02:48 +01:00
thezoggy 29f540c4f2 Changed: Metadata links are now better readable. Also fixed links in the poster view. (#2562)
Fixes #2561
2018-02-21 11:02:04 +01:00
thezoggy 31eed11d1b Fixed: Messed up movie deletion modal (#2552)
Fixes #2537
2018-02-20 14:41:35 +01:00
thezoggy ba0bbddce9 Fixed: Remove sorting on Monitor/Profile columns to prevent unexpected results until sorting can properly be handled. Quick Fix for #2540 (#2553)
Fixes #2540
2018-02-20 14:41:01 +01:00
thezoggy a243a886f5 Fixed: OSX app has bundle name of Sonarr (#2555) 2018-02-20 14:40:35 +01:00
Leonardo Galli 033bc24984 @cosmetic update changelog 2018-02-19 16:16:04 +01:00
Leonardo Galli e071850d4c Fixed: Alt Titles from TMDB not getting added when mappings server throws 404
Fixes #2535
2018-02-19 13:02:55 +01:00
Leonardo Galli fa212872ab Added: Handle ctrl-c more gracefully.
Finally fixes #2218
2018-02-19 12:48:56 +01:00
Leonardo Galli c34137c423 Merge remote-tracking branch 'origin/develop' into develop 2018-02-19 08:38:40 +01:00
Leonardo Galli 67848ebff5 Fixed: Omgwtfnbs parsing being too greedy.
Fixes #608
2018-02-19 08:37:47 +01:00
Qstick d0406ced40 Fixed: Unable to execute custom scripts if IMDB ID is null (#2543)
fixes #1460
2018-02-19 08:19:14 +01:00
Qstick ae88645180 Added: Device names for Join notifications (#2544)
Closes #2364
2018-02-19 08:18:36 +01:00
Qstick 8519b64947 Cleanup TV related code in API (#2530) 2018-02-19 08:18:14 +01:00
Leonardo Galli d67d89f54a Merge remote-tracking branch 'origin/develop' into develop 2018-02-19 00:01:11 +01:00
Leonardo Galli 2b2bd16d4d Updated NLog to version 4.4.12. Should fix #2218 2018-02-19 00:00:59 +01:00
Qstick 0c23511b7a Added: Same File Size MediaFile Specification (#2532) 2018-02-18 17:29:41 +01:00
Qstick 4dc3612347 Fixed: Help icon not centered (#2531)
Fixes #2528
2018-02-18 15:06:53 +01:00
Qstick 2139246c4a Fixed: Radarr Changes every file due to timezones (#2533)
Fixes #1741
2018-02-18 15:06:26 +01:00
Leonardo Galli c1a5e8e759 Fixed: Filters not working. Fuck you backbone. 2018-02-16 17:12:34 +01:00
Qstick e70e76adcb Cleanup Series Code from UI (#2525) 2018-02-16 10:53:41 +01:00
Leonardo Galli 1dbb856ced Fixed: Apostrophe getting replaced by an empty string causing no search results.
Fixes #1505
2018-02-15 15:21:15 +01:00
Leonardo Galli 74396a7abb @cosmetic Updated changelog 2018-02-15 15:03:33 +01:00
Qstick e7e9e2b154 Added: Importing extra files from downloaded movies and generate metadata such as .nfo (#2506)
Fixes #121, Fixes #167, Fixes #2262 and Fixes #1104
2018-02-15 13:39:01 +01:00
Qstick b40423f3a3 Added: Quotes around alternative titles (#2522)
Fixes #2511
2018-02-15 11:16:59 +01:00
Qstick b3e46d02c6 Fixed: Integration Unit Tests (#2500) 2018-02-13 19:10:49 +01:00
Qstick 081d8a8e53 Added: Backup improvements from Sonarr (#2513)
Fixes #2440
2018-02-13 19:07:26 +01:00
Leonardo Galli 2f271635f9 @cosmetic fixed build 2018-02-12 17:37:11 +01:00
Leonardo Galli c460153e66 @cosmetic fixed indentation error. 2018-02-12 17:33:14 +01:00
Leonardo Galli 8a674181be @cosmetic Staged builds & upload artifacts. 2018-02-12 17:31:18 +01:00
Leonardo Galli 7537cef93c @cosmetic Fixed junit transformer. 2018-02-12 17:18:25 +01:00
Leonardo Galli 808b6d16e9 @cosmetic added junit transformer 2018-02-12 17:15:14 +01:00
Leonardo Galli d1189e62c5 @cosmetic custom docker image for circleci 2018-02-12 17:10:44 +01:00
Leonardo Galli ef86c83799 @cosmetic changed config again. 2018-02-12 16:37:33 +01:00
Leonardo Galli aeb45e5f7e @cosmetic update test.sh 2018-02-12 16:27:48 +01:00
Leonardo Galli 149c7c534c @cosmetic update config. 2018-02-12 16:21:21 +01:00
Leonardo Galli 74ae66ba14 @cosmetic Wrong filename. 2018-02-12 16:10:53 +01:00
Leonardo Galli f94e7b562a @cosmetic Testing CircleCI for tests. 2018-02-12 16:06:31 +01:00
Leonardo Galli f5a7a2f29a @cosmetic 2018-02-11 22:59:11 +01:00
Qstick 1514a00b8f Updated: NzbDrone references in FirewallAdapter.cs (#2504) 2018-02-11 17:22:31 +01:00
Scott 3ed0652feb Fixed: XSS vulnerability in the navbar search. (#2505)
Fixes #2503
2018-02-11 17:20:55 +01:00
Qstick f4e2a510f2 Fixed: StartNzbDroneService.cs unit test (#2499) 2018-02-10 00:04:22 +01:00
geogolem 8edd15b5f8 Merge pull request #2497 from geogolem/selectAllMovieEditor
selectAll and deselectAll MovieEditor buttons
2018-02-09 11:59:31 -05:00
geogolem 2fdfd0fba5 selectAll and deselectAll MovieEditor buttons 2018-02-09 11:41:31 -05:00
geogolem 8b201af053 Merge pull request #2493 from geogolem/develop
fix build problem on windows
2018-02-08 09:35:41 -05:00
geogolem 976bc1a6a5 fix build problem on windows 2018-02-08 09:22:58 -05:00
Leonardo Galli 16ba7194a9 Merge branch 'develop' of https://github.com/Radarr/Radarr into develop 2018-02-08 11:26:58 +01:00
Leonardo Galli a151fbbcbe Revert "Fixed: Removed hebrew ISO, since english movies are still in english. (#1922)" 2018-02-08 11:26:43 +01:00
Leonardo Galli 71db67af2c @cosmetic 2018-02-07 17:27:04 +01:00
Leonardo Galli 1d2231a96d @cosmetic 2018-02-07 17:26:43 +01:00
Leonardo Galli 0837d3a8a0 @cosmetic 2018-02-07 17:26:23 +01:00
Leonardo Galli 05e5d610a3 @cosmetic 2018-02-07 17:11:51 +01:00
Leonardo Galli d2f99f1330 Fixed: Error with deluge when it doesn’t report a Hash.
Fixes #2329
2018-02-07 15:59:14 +01:00
Leonardo Galli 27001b48f6 Fixed: Logging error when accessing mount point
Fixes #2305
2018-02-07 15:26:25 +01:00
Leonardo Galli 97ab4cbcbd Fixed: Invalid runtime from CP causing issues importing.
Fixes #2081
2018-02-07 12:04:27 +01:00
Leonardo Galli 8b3a71a537 Fixed: Typo in TMDB Settings.
Fixes #2077
2018-02-07 11:57:49 +01:00
Leonardo Galli e22141e2ed Fixed: Hopefully fixed errors with Delay Profiles.
Fixes #1817
2018-02-07 11:24:58 +01:00
Leonardo Galli 11211dc2ed Fixed: Error when importing files and old folder doesn’t exist.
Fixes #2485
2018-02-07 11:08:05 +01:00
Leonardo Galli e71e518d30 Fixed: Zooqle torrents not getting added, since their torrent file is messed up.
Fixes #1516
2018-02-07 00:10:33 +01:00
389 changed files with 7819 additions and 15121 deletions
+5
View File
@@ -0,0 +1,5 @@
FROM mono:4.8
RUN apt-get update && apt-get install -y git ssh tar gzip ca-certificates
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -E -
RUN apt-get install -y nodejs npm
+40
View File
@@ -0,0 +1,40 @@
version: 2
jobs:
build:
docker:
- image: gallileo/radarr-cci-primary:4.8
steps:
- checkout
- run: git submodule update --init --recursive
- run:
name: Clean Build
command: ./build.sh Clean
- run:
name: Restore Nuget
command: ./build.sh NugetMono
- run:
name: Build
command: ./build.sh Build
- run:
name: Gulp
command: ./build.sh Gulp
- run:
name: Package
command: ./build.sh Package
- run:
name: Preparing Tests
command: mkdir _tests/reports
- run:
name: Testing
command: ./test.sh Linux Unit
- store_test_results:
path: _tests/reports/
- store_artifacts:
path: _output
- store_artifacts:
path: _output_mono
- store_artifacts:
path: _output_osx
- store_artifacts:
path: _output_osx_app
+69
View File
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/test-run">
<testsuites tests="{@testcasecount}" failures="{@failed}" disabled="{@skipped}" time="{@duration}">
<xsl:apply-templates/>
</testsuites>
</xsl:template>
<xsl:template match="test-suite">
<xsl:if test="test-case">
<testsuite tests="{@testcasecount}" time="{@duration}" errors="{@testcasecount - @passed - @skipped - @failed}" failures="{@failed}" skipped="{@skipped}" timestamp="{@start-time}">
<xsl:attribute name="name">
<xsl:for-each select="ancestor-or-self::test-suite/@name">
<xsl:value-of select="concat(., '.')"/>
</xsl:for-each>
</xsl:attribute>
<xsl:apply-templates select="test-case"/>
</testsuite>
<xsl:apply-templates select="test-suite"/>
</xsl:if>
<xsl:if test="not(test-case)">
<xsl:apply-templates/>
</xsl:if>
</xsl:template>
<xsl:template match="test-case">
<testcase name="{@name}" assertions="{@asserts}" time="{@duration}" status="{@result}" classname="{@classname}">
<xsl:if test="@runstate = 'Skipped' or @runstate = 'Ignored'">
<skipped/>
</xsl:if>
<xsl:apply-templates/>
</testcase>
</xsl:template>
<xsl:template match="command-line"/>
<xsl:template match="settings"/>
<xsl:template match="output">
<system-out>
<xsl:value-of select="."/>
</system-out>
</xsl:template>
<xsl:template match="stack-trace">
</xsl:template>
<xsl:template match="test-case/failure">
<failure message="{./message}">
<xsl:value-of select="./stack-trace"/>
</failure>
</xsl:template>
<xsl:template match="test-suite/failure"/>
<xsl:template match="test-case/reason">
<skipped message="{./message}"/>
</xsl:template>
<xsl:template match="test-case/assertions">
</xsl:template>
<xsl:template match="test-suite/reason"/>
<xsl:template match="properties"/>
</xsl:stylesheet>
+7 -3
View File
@@ -4,13 +4,17 @@ Check first that your problem is not listed in our wiki section:
* https://github.com/Radarr/Radarr/wiki/Common-Problems * https://github.com/Radarr/Radarr/wiki/Common-Problems
* https://github.com/Radarr/Radarr/wiki/FAQ * https://github.com/Radarr/Radarr/wiki/FAQ
**Just because you receive an exception in your logs, doesn't mean it's a bug and should be reported here. Often it's something else, such as a permission error. If you are unsure ask on the Discord or Subreddit first.**
Visit our [Discord server](https://discord.gg/NWYch8M) or [Subreddit](https://reddit.com/r/radarr) for support or longer discussions. Support questions posed on here will be closed immediately.
Provide a description of the feature request or bug here, the more details the better. Provide a description of the feature request or bug here, the more details the better.
Please also try to include the following if you are reporting a bug Please also include the following if you are reporting a bug. If you do not include it, the issue will probably be closed as we cannot help you.
**Radarr Version:** **Radarr Version:**
**Logs:** **Mono Version:**
**Debug Logs:**
Please use the search bar and make sure you are not submitting an already submitted issue. Please use the search bar and make sure you are not submitting an already submitted issue.
Visit our [Discord server](https://discord.gg/NWYch8M) for support or longer discussions.
+3 -2
View File
@@ -148,8 +148,9 @@ _temp_*/**/*
Thumbs.db Thumbs.db
# AppVeyor # AppVeyor
/tools-cake/ /tools/cake/
/_artifacts/ /_artifacts/
# Cake # Cake
/tools/Addins/* /tools/Addins/*
packages.config.md5sum
+140
View File
@@ -1,5 +1,145 @@
# Changelog # Changelog
## (unreleased)
### **New features**
- Copy & Paste now triggers search (#2587) [Paul Kozlovitch]
- Added console logging in case NLog fails to initialize. [Taloth Saldono]
### **Fixes**
- Movies not getting unmonitored when folder gets deleted (#2588) [Simon Chapman]
- NLog causing a crash under mono 5.10. [Leonardo Galli]
- Revert "Fixed: Updated NLog to 4.5 RC6 to handle mono 5.10" [Leonardo Galli]
- Revert "Fixed: Messed up merge from Cherry pick" [Leonardo Galli]
- Revert "Fixed: Appveyor build." [Leonardo Galli]
- Appveyor build. [Leonardo Galli]
- Messed up merge from Cherry pick. [Leonardo Galli]
- Updated NLog to 4.5 RC6 to handle mono 5.10. [Leonardo Galli]
- Revert "Fixed: NLog causing a crash under mono 5.10" [Leonardo Galli]
- Pin cake and addin versions. [Qstick]
- Temp Workaround for Appveyor Cake Issue. [Qstick]
- NLog causing a crash under mono 5.10. [Leonardo Galli]
- Poster sliding issues (#2570) [Qstick]
- Multiple History Issues (#2571) [Qstick]
## v0.2.0.980 (2018-02-21)
### **New features**
- Metadata links are now better readable. Also fixed links in the poster view. (#2562) [thezoggy]
- Handle ctrl-c more gracefully. [Leonardo Galli]
- Device names for Join notifications (#2544) [Qstick]
- Same File Size MediaFile Specification (#2532) [Qstick]
- Updated NLog to version 4.4.12. Should fix #2218. [Leonardo Galli]
- Importing extra files from downloaded movies and generate metadata such as .nfo (#2506) [Qstick]
- Quotes around alternative titles (#2522) [Qstick]
- Backup improvements from Sonarr (#2513) [Qstick]
- NzbDrone references in FirewallAdapter.cs (#2504) [Qstick]
### **Fixes**
- Another Delete modal is fixed. (#2560) [thezoggy]
- Messed up movie deletion modal (#2552) [thezoggy]
- Remove sorting on Monitor/Profile columns to prevent unexpected results until sorting can properly be handled. Quick Fix for #2540 (#2553) [thezoggy]
- OSX app has bundle name of Sonarr (#2555) [thezoggy]
- Alt Titles from TMDB not getting added when mappings server throws 404. [Leonardo Galli]
- Unable to execute custom scripts if IMDB ID is null (#2543) [Qstick]
- Cleanup TV related code in API (#2530) [Qstick]
- Omgwtfnbs parsing being too greedy. [Leonardo Galli]
- Help icon not centered (#2531) [Qstick]
- Radarr Changes every file due to timezones (#2533) [Qstick]
- Filters not working. Fuck you backbone. [Leonardo Galli]
- Cleanup Series Code from UI (#2525) [Qstick]
- Apostrophe getting replaced by an empty string causing no search results. [Leonardo Galli]
- Integration Unit Tests (#2500) [Qstick]
- XSS vulnerability in the navbar search. (#2505) [Scott]
- StartNzbDroneService.cs unit test (#2499) [Qstick]
- SelectAll and deselectAll MovieEditor buttons. [geogolem]
- Fix build problem on windows. [geogolem]
- Revert "Fixed: Removed hebrew ISO, since english movies are still in english. (#1922)" [Leonardo Galli]
- Error with deluge when it doesnt report a Hash. [Leonardo Galli]
- Logging error when accessing mount point. [Leonardo Galli]
- Invalid runtime from CP causing issues importing. [Leonardo Galli]
- Typo in TMDB Settings. [Leonardo Galli]
- Hopefully fixed errors with Delay Profiles. [Leonardo Galli]
- Error when importing files and old folder doesnt exist. [Leonardo Galli]
- Zooqle torrents not getting added, since their torrent file is messed up. [Leonardo Galli]
## v0.2.0.935 (2018-02-06)
### **New features**
- Include total space with root folders. [Leonardo Galli]
- Manual Import now adds year after movie title for filtering. This should help finding movies such as IT. [Leonardo Galli]
- Option to require indexer flags per indexer. (e.g. only download freeleech torrents from a private tracker) (#2460) [Leonardo Galli]
- Files downloaded with different quality than grabbed will get rejected. [Leonardo Galli]
- TMDbSettings.cs to allow pipe for or for genre ids (#2389) [crhammock]
- Dynamic paths cleanup old folders now! [Leonardo Galli]
### **Fixes**
- No Physical Release Date causing exception when setting last write time. [Leonardo Galli]
- Movies not getting unmonitored when folder gets deleted. [Leonardo Galli]
- Rare case of null quality causing issues with manual import. [Leonardo Galli]
- Manual Import not automatically choosing right movie. [Leonardo Galli]
- Rare case of RequiredIndexerFlags failing with old Newznab indexers. [Leonardo Galli]
- Folder name getting messed up when adding movies via a list. [Leonardo Galli]
- Error when adding an already excluded movie to the exclusion list. [Leonardo Galli]
- Last commit still not compiling (whoops squared) [Leonardo Galli]
- Last commit not compiling (whoops) [Leonardo Galli]
- Clean Library being to agressive when lists are having failures. [Leonardo Galli]
- Error when nno quality was associated with a movie file. [Leonardo Galli]
- Allowing in use Profiles to be Deleted. [Leonardo Galli]
- Error when Movie has no imdbid when searching Rargb. [Leonardo Galli]
- Rargb failing when imdbid is not found. [Leonardo Galli]
- {Original Filename} not allowed in Movie Filename. [Leonardo Galli]
- Look for changes to package.json before using old build cache (#2445) [Qstick]
- HistoryDetailsLayoutTemplate.hbs (#2361) [Pieter Janssens]
## v0.2.0.910 (2017-12-13)
### **New features**
- Separate naming tags for AudioLanguage and SubtitleLanguage (#2261) (Fixes #2257) [fhscholl]
- Include APFS disks in disk space calculation. [Leonardo Galli]
- Upgrade MediaInfo to 17.10 (Windows/macOS) [Leonardo Galli]
- Support for VF2 french tag. (#2291) (Fixes #2290) [kriegalex]
- Customize Slack Channel (#2308) (Fixes #2298) [grokdesigns]
- SceneName to MovieFile API output (#2250) (Fixes #2245) [fhscholl]
- Functionality to XBMC and Plex to update indivdual titles. Also: Notification Cleanup (#2240) [fhscholl]
- FolderPath to the Movie Webhook (#2230) [adnanklink]
- Download_Id to On Download/On Upgrade (#2229) [adnanklink]
- Movie_Quality to onGrab (#2221) (Fixes #1833) [fhscholl]
- Webhook Improvements (#2220) (Fixes #1751) [fhscholl]
- Message about adblockers preventing the log table from loading (#2213) (Fixes #2209) [James White]
- Sabnzbd Update test cases and rename to MovieCategory (#2212) [James White]
- Nzbget Rename TvCategory references to MovieCategory (#2211) [James White]
- Change default port of qBittorrent download client config (#2187) [James White]
- Initial state for torrents added to qBittorrent (#2176) [James White]
- Adjust ambiguous date options (#2165) [James White]
- A default name for Radarr.ics (#2163) [James White]
### **Fixes**
- Fixed MediaCover endpoint. [Taloth Saldono]
- Don't handle content requests in IndexHtmlMapper. [Mark McDowall]
- Movies parsed from lists with no year and only title getting added mutliple times. [Leonardo Galli]
- Security Vulnerabilities allowing authentication to be bypassed (discovered by Kyle Neideck) [Taloth Saldono]
- Movie Editor Path screwed up. Might also fix some other movie editor issues. (Fixes #2170) [Leonardo Galli]
- Tags disappearing (Fixes #2204) [Leonardo Galli]
- Moment.js deprecated zone and add functions (Fixes #2232) (Fixes #2231) (#2264) [Fish2]
- CPU locking at a 100% in certain instances. (#2258) (Fixes #2218) [Mike]
- Revert "Fixed: moment.js deprecated zone and Added: and lossless compression of images (#2232) (Fixes #2231)" [Fish2]
- Moment.js deprecated zone and Added: and lossless compression of images (#2232) (Fixes #2231) [Fish2]
- Fixes #2218. (#2254) [Mike]
- Minor error message tweak (#1778) [Oliver Rivett-Carnac]
- UTorrent initial state feature (#2192) [James White]
- Add IsUpgrade and related deleted file paths for CustomScript (#2205) [fhscholl]
- Typo on margin-bottom (#2182) [James White]
- Manual Import. Fixes #2160. [Leonardo Galli]
- Remove unit on zero values (#2178) [James White]
- Jackett apikey cleaned from log again. (#2177) [James White]
- Manual Movie Page Filtering. [Leonardo Galli]
- MediaInfo not getting read when quality isn't Bluray, Web-dl or HDTV. Fixes #1465. Fixes #1572. [Leonardo Galli]
## v0.2.0.870 (2017-10-09) ## v0.2.0.870 (2017-10-09)
### **New features** ### **New features**
+1 -1
View File
@@ -85,7 +85,7 @@ Radarr is currently undergoing rapid development and pull requests are actively
### Planned Features ### Planned Features
* Downloading Metadata such as trailers or subtitles (\*) * Importing Metadata such as trailers or subtitles (\*)
* Adding metadata such as posters and information for Kodi and others to use (\*) * Adding metadata such as posters and information for Kodi and others to use (\*)
* Dynamically renaming folders with quality info, etc. (\*) * Dynamically renaming folders with quality info, etc. (\*)
* Supporting custom folder structures, such as all movie files in one folder (\*) * Supporting custom folder structures, such as all movie files in one folder (\*)
+3 -3
View File
@@ -1,6 +1,6 @@
#addin "Cake.Npm" #addin nuget:?package=Cake.Npm&version=0.12.1
#addin "SharpZipLib" #addin nuget:?package=SharpZipLib&version=0.86.0
#addin "Cake.Compression" #addin nuget:?package=Cake.Compression&version=0.1.4
// Build variables // Build variables
var outputFolder = "./_output"; var outputFolder = "./_output";
+9 -4
View File
@@ -81,8 +81,8 @@ if(!$PSScriptRoot){
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
} }
$TOOLS_DIR = Join-Path $PSScriptRoot "tools-cake" $TOOLS_DIR = Join-Path $PSScriptRoot "tools"
$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe" $NUGET_EXE = Join-Path $TOOLS_DIR "nuget/nuget.exe"
$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe" $CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe"
$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" $NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
$PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config" $PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config"
@@ -156,7 +156,12 @@ if(-Not $SkipToolPackageRestore.IsPresent) {
if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or
($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) { ($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) {
Write-Verbose -Message "Missing or changed package.config hash..." Write-Verbose -Message "Missing or changed package.config hash..."
Remove-Item * -Recurse -Exclude packages.config,nuget.exe Get-ChildItem -Path $TOOLS_DIR -Recurse -Exclude packages.config |
Select -ExpandProperty FullName |
Where {$_ -notlike (Join-Path $TOOLS_DIR "pdb2mdb*")} |
Where {$_ -notlike (Join-Path $TOOLS_DIR "nuget*")} |
sort length -Descending |
Remove-Item -Recurse
} }
Write-Verbose -Message "Restoring tools from NuGet..." Write-Verbose -Message "Restoring tools from NuGet..."
@@ -181,4 +186,4 @@ if (!(Test-Path $CAKE_EXE)) {
# Start Cake # Start Cake
Write-Host "Running build script..." Write-Host "Running build script..."
Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseMono $UseDryRun $UseExperimental $ScriptArgs" Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseMono $UseDryRun $UseExperimental $ScriptArgs"
exit $LASTEXITCODE exit $LASTEXITCODE
+53 -9
View File
@@ -69,11 +69,21 @@ BuildWithMSBuild()
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb
} }
BuildWithXbuild() RestoreNuget()
{
export MONO_IOMAP=case
mono $nuget restore $slnFile
}
CleanWithXbuild()
{ {
export MONO_IOMAP=case export MONO_IOMAP=case
CheckExitCode xbuild /t:Clean $slnFile CheckExitCode xbuild /t:Clean $slnFile
mono $nuget restore $slnFile }
BuildWithXbuild()
{
export MONO_IOMAP=case
CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile
} }
@@ -86,6 +96,8 @@ Build()
if [ $runtime = "dotnet" ] ; then if [ $runtime = "dotnet" ] ; then
BuildWithMSBuild BuildWithMSBuild
else else
CleanWithXbuild
RestoreNuget
BuildWithXbuild BuildWithXbuild
fi fi
@@ -256,10 +268,42 @@ case "$(uname -s)" in
;; ;;
esac esac
Build if [ $# -eq 0 ]
RunGulp then
PackageMono Build
PackageOsx RunGulp
PackageOsxApp PackageMono
PackageTests PackageOsx
CleanupWindowsPackage PackageOsxApp
PackageTests
CleanupWindowsPackage
fi
if [ "$1" = "CleanXbuild" ]
then rm -rf $outputFolder
CleanWithXbuild
fi
if [ "$1" = "NugetMono" ]
then rm -rf $outputFolder
RestoreNuget
fi
if [ "$1" = "Build" ]
then BuildWithXbuild
CleanFolder $outputFolder false
AddJsonNet
rm $outputFolder/Mono.Posix.dll
fi
if [ "$1" = "Gulp" ]
then RunGulp
fi
if [ "$1" = "Package" ]
then PackageMono
PackageOsx
PackageOsxApp
PackageTests
CleanupWindowsPackage
fi
+1 -1
View File
@@ -19,7 +19,7 @@
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Sonarr</string> <string>Radarr</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
+97 -3
View File
@@ -1,9 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module type="RIDER_MODULE" version="4"> <module type="RIDER_MODULE" version="4">
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$/../../../Logo/1024.png" /> <content url="file://$MODULE_DIR$/../../../Logo/1024.png">
<content url="file://$MODULE_DIR$/../../../Logo/64.png" /> <sourceFolder url="file://$MODULE_DIR$/../../../Logo/1024.png" isTestSource="false" />
<content url="file://$MODULE_DIR$/../.." /> </content>
<content url="file://$MODULE_DIR$/../../../Logo/64.png">
<sourceFolder url="file://$MODULE_DIR$/../../../Logo/64.png" isTestSource="false" />
</content>
<content url="file://$MODULE_DIR$/../..">
<sourceFolder url="file://$MODULE_DIR$/../../.nuget/NuGet.exe" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Common/CommonAssemblyInfo.cs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Common/CommonVersionInfo.cs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Common/GlobalSuppressions.cs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../ExternalModules/CurlSharp/CurlSharp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Libraries/MediaInfo/libmediainfo.0.dylib" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Libraries/MediaInfo/MediaInfo.dll" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Libraries/Sqlite/libsqlite3.0.dylib" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Libraries/Sqlite/sqlite3.dll" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../LogentriesCore" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../LogentriesNLog" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Marr.Data" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Microsoft.AspNet.SignalR.Core" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../Microsoft.AspNet.SignalR.Owin" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../MonoTorrent" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Api" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Api.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.App.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Automation.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Common" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Common.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Console" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Core" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Core.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Host" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Integration.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Libraries.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Mono" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Mono.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.SignalR" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Test.Common" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Test.Dummy" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Update" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Update.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Windows" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../NzbDrone.Windows.Test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../ServiceHelpers/ServiceInstall" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../ServiceHelpers/ServiceUninstall" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/../../ExternalModules/CurlSharp/CurlSharp/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../ExternalModules/CurlSharp/CurlSharp/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../LogentriesCore/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../LogentriesCore/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../LogentriesNLog/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../LogentriesNLog/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../Marr.Data/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../Microsoft.AspNet.SignalR.Core/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../Microsoft.AspNet.SignalR.Core/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../Microsoft.AspNet.SignalR.Owin/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../Microsoft.AspNet.SignalR.Owin/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../MonoTorrent/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Api.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Api.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Api/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.App.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.App.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Automation.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Automation.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Common.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Common.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Common/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Console/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Core.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Core.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Core/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Host/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Integration.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Integration.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Libraries.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Libraries.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Mono.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Mono.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Mono/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.SignalR/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Test.Common/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Test.Common/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Test.Dummy/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Test.Dummy/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Update.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Update.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Update/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Windows.Test/bin" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Windows.Test/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone.Windows/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../NzbDrone/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../ServiceHelpers/ServiceInstall/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../ServiceHelpers/ServiceUninstall/obj" />
<excludeFolder url="file://$MODULE_DIR$/../../_ReSharper.Caches/ReSharperHost8.NzbDrone.00" />
<excludeFolder url="file://$MODULE_DIR$/../../packages" />
</content>
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>
+93 -90
View File
@@ -1,97 +1,100 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion> <ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{9DC31DE3-79FF-47A8-96B4-6BA18F6BB1CB}</ProjectGuid> <ProjectGuid>{9DC31DE3-79FF-47A8-96B4-6BA18F6BB1CB}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>LogentriesNLog</RootNamespace> <RootNamespace>LogentriesNLog</RootNamespace>
<AssemblyName>LogentriesNLog</AssemblyName> <AssemblyName>LogentriesNLog</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages> <RestorePackages>true</RestorePackages>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath> <OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath> <OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath> <OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath> <OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.3.11\lib\net40\NLog.dll</HintPath> <HintPath>..\packages\NLog.4.5.0-rc06\lib\net40-client\NLog.dll</HintPath>
<Private>True</Private> </Reference>
</Reference> <Reference Include="System" />
<Reference Include="System" /> <Reference Include="System.Configuration" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.ServiceModel" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="System.Transactions" />
<Reference Include="System.Data" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Xml" /> <Reference Include="System.Data.DataSetExtensions" />
</ItemGroup> <Reference Include="Microsoft.CSharp" />
<ItemGroup> <Reference Include="System.Data" />
<Compile Include="fastJSON\Getters.cs" /> <Reference Include="System.Xml" />
<Compile Include="fastJSON\JSON.cs" /> </ItemGroup>
<Compile Include="fastJSON\JsonParser.cs" /> <ItemGroup>
<Compile Include="fastJSON\JsonSerializer.cs" /> <Compile Include="fastJSON\Getters.cs" />
<Compile Include="fastJSON\SafeDictionary.cs" /> <Compile Include="fastJSON\JSON.cs" />
<Compile Include="LogentriesTarget.cs" /> <Compile Include="fastJSON\JsonParser.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="fastJSON\JsonSerializer.cs" />
</ItemGroup> <Compile Include="fastJSON\SafeDictionary.cs" />
<ItemGroup> <Compile Include="LogentriesTarget.cs" />
<ProjectReference Include="..\LogentriesCore\LogentriesCore.csproj"> <Compile Include="Properties\AssemblyInfo.cs" />
<Project>{90D6E9FC-7B88-4E1B-B018-8FA742274558}</Project> </ItemGroup>
<Name>LogentriesCore</Name> <ItemGroup>
</ProjectReference> <ProjectReference Include="..\LogentriesCore\LogentriesCore.csproj">
</ItemGroup> <Project>{90D6E9FC-7B88-4E1B-B018-8FA742274558}</Project>
<ItemGroup> <Name>LogentriesCore</Name>
<None Include="fastJSON\license.txt" /> </ProjectReference>
<None Include="packages.config" /> </ItemGroup>
</ItemGroup> <ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <None Include="fastJSON\license.txt" />
<PropertyGroup> <None Include="packages.config" />
<PostBuildEvent> </ItemGroup>
</PostBuildEvent> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</PropertyGroup> <PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
<!-- 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>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
+3 -3
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="4.3.11" targetFramework="net40" /> <package id="NLog" version="4.5.0-rc06" targetFramework="net40" />
</packages> </packages>
+1 -1
View File
@@ -96,7 +96,7 @@ namespace MonoTorrent.BEncoding
if (stream == null) if (stream == null)
throw new ArgumentNullException("stream"); throw new ArgumentNullException("stream");
return Decode(new RawReader(stream)); return Decode(new RawReader(stream, false));
} }
@@ -1,9 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using NzbDrone.Api.Movie; using NzbDrone.Api.Movies;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Api.Series;
using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers;
namespace NzbDrone.Api.Blacklist namespace NzbDrone.Api.Blacklist
@@ -20,7 +19,6 @@ namespace NzbDrone.Api.Blacklist
public string Indexer { get; set; } public string Indexer { get; set; }
public string Message { get; set; } public string Message { get; set; }
public MovieResource Movie { get; set; } public MovieResource Movie { get; set; }
public SeriesResource Series { get; set; }
} }
public static class BlacklistResourceMapper public static class BlacklistResourceMapper
@@ -41,8 +39,7 @@ namespace NzbDrone.Api.Blacklist
Protocol = model.Protocol, Protocol = model.Protocol,
Indexer = model.Indexer, Indexer = model.Indexer,
Message = model.Message, Message = model.Message,
Movie = model.Movie.ToResource(), Movie = model.Movie.ToResource()
Series = model.Series.ToResource()
}; };
} }
} }
+2 -5
View File
@@ -1,10 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Nancy; using Nancy;
using NzbDrone.Api.Episodes; using NzbDrone.Api.Movies;
using NzbDrone.Api.Movie;
using NzbDrone.Api.Series;
using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
@@ -17,7 +15,6 @@ using NzbDrone.Core.Validation.Paths;
using NzbDrone.Core.DataAugmentation.Scene; using NzbDrone.Core.DataAugmentation.Scene;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Tv;
using NzbDrone.SignalR; using NzbDrone.SignalR;
namespace NzbDrone.Api.Calendar namespace NzbDrone.Api.Calendar
@@ -1,4 +1,4 @@
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
@@ -22,6 +22,7 @@ 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 string ExtraFileExtensions { get; set; }
public bool EnableMediaInfo { get; set; } public bool EnableMediaInfo { get; set; }
} }
@@ -48,6 +49,7 @@ namespace NzbDrone.Api.Config
SkipFreeSpaceCheckWhenImporting = model.SkipFreeSpaceCheckWhenImporting, SkipFreeSpaceCheckWhenImporting = model.SkipFreeSpaceCheckWhenImporting,
CopyUsingHardlinks = model.CopyUsingHardlinks, CopyUsingHardlinks = model.CopyUsingHardlinks,
ImportExtraFiles = model.ImportExtraFiles,
ExtraFileExtensions = model.ExtraFileExtensions, ExtraFileExtensions = model.ExtraFileExtensions,
EnableMediaInfo = model.EnableMediaInfo EnableMediaInfo = model.EnableMediaInfo
}; };
@@ -1,88 +0,0 @@
using System.Collections.Generic;
using System.IO;
using NLog;
using NzbDrone.Api.REST;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Tv;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.SignalR;
namespace NzbDrone.Api.EpisodeFiles
{
public class EpisodeFileModule : NzbDroneRestModuleWithSignalR<EpisodeFileResource, EpisodeFile>,
IHandle<EpisodeFileAddedEvent>
{
private readonly IMediaFileService _mediaFileService;
private readonly IRecycleBinProvider _recycleBinProvider;
private readonly ISeriesService _seriesService;
private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification;
private readonly Logger _logger;
public EpisodeFileModule(IBroadcastSignalRMessage signalRBroadcaster,
IMediaFileService mediaFileService,
IRecycleBinProvider recycleBinProvider,
ISeriesService seriesService,
IQualityUpgradableSpecification qualityUpgradableSpecification,
Logger logger)
: base(signalRBroadcaster)
{
_mediaFileService = mediaFileService;
_recycleBinProvider = recycleBinProvider;
_seriesService = seriesService;
_qualityUpgradableSpecification = qualityUpgradableSpecification;
_logger = logger;
GetResourceById = GetEpisodeFile;
GetResourceAll = GetEpisodeFiles;
UpdateResource = SetQuality;
DeleteResource = DeleteEpisodeFile;
}
private EpisodeFileResource GetEpisodeFile(int id)
{
var episodeFile = _mediaFileService.Get(id);
var series = _seriesService.GetSeries(episodeFile.SeriesId);
return episodeFile.ToResource(series, _qualityUpgradableSpecification);
}
private List<EpisodeFileResource> GetEpisodeFiles()
{
if (!Request.Query.SeriesId.HasValue)
{
throw new BadRequestException("seriesId is missing");
}
var seriesId = (int)Request.Query.SeriesId;
var series = _seriesService.GetSeries(seriesId);
return _mediaFileService.GetFilesBySeries(seriesId).ConvertAll(f => f.ToResource(series, _qualityUpgradableSpecification));
}
private void SetQuality(EpisodeFileResource episodeFileResource)
{
var episodeFile = _mediaFileService.Get(episodeFileResource.Id);
episodeFile.Quality = episodeFileResource.Quality;
_mediaFileService.Update(episodeFile);
}
private void DeleteEpisodeFile(int id)
{
var episodeFile = _mediaFileService.Get(id);
var series = _seriesService.GetSeries(episodeFile.SeriesId);
var fullPath = Path.Combine(series.Path, episodeFile.RelativePath);
_logger.Info("Deleting episode file: {0}", fullPath);
_recycleBinProvider.DeleteFile(fullPath);
_mediaFileService.Delete(episodeFile, DeleteMediaFileReason.Manual);
}
public void Handle(EpisodeFileAddedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.EpisodeFile.Id);
}
}
}
@@ -1,64 +0,0 @@
using System;
using System.IO;
using NzbDrone.Api.REST;
using NzbDrone.Core.Qualities;
namespace NzbDrone.Api.EpisodeFiles
{
public class EpisodeFileResource : RestResource
{
public int SeriesId { get; set; }
public int SeasonNumber { get; set; }
public string RelativePath { get; set; }
public string Path { get; set; }
public long Size { get; set; }
public DateTime DateAdded { get; set; }
public string SceneName { get; set; }
public QualityModel Quality { 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)
};
}
}
}
@@ -1,41 +0,0 @@
using System.Collections.Generic;
using NzbDrone.Api.REST;
using NzbDrone.Core.Tv;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.SignalR;
using Nancy;
namespace NzbDrone.Api.Episodes
{
public class EpisodeModule : EpisodeModuleWithSignalR
{
public EpisodeModule(ISeriesService seriesService,
IEpisodeService episodeService,
IQualityUpgradableSpecification qualityUpgradableSpecification,
IBroadcastSignalRMessage signalRBroadcaster)
: base(episodeService, seriesService, qualityUpgradableSpecification, signalRBroadcaster)
{
GetResourceAll = GetEpisodes;
UpdateResource = SetMonitored;
}
private List<EpisodeResource> GetEpisodes()
{
if (!Request.Query.SeriesId.HasValue)
{
throw new BadRequestException("seriesId is missing");
}
var seriesId = (int)Request.Query.SeriesId;
var resources = MapToResource(_episodeService.GetEpisodeBySeries(seriesId), false, true);
return resources;
}
private void SetMonitored(EpisodeResource episodeResource)
{
_episodeService.SetEpisodeMonitored(episodeResource.Id, episodeResource.Monitored);
}
}
}
@@ -1,126 +0,0 @@
using System.Collections.Generic;
using NzbDrone.Common.Extensions;
using NzbDrone.Api.EpisodeFiles;
using NzbDrone.Api.Series;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Download;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Tv;
using NzbDrone.SignalR;
namespace NzbDrone.Api.Episodes
{
public abstract class EpisodeModuleWithSignalR : NzbDroneRestModuleWithSignalR<EpisodeResource, Episode>,
IHandle<EpisodeGrabbedEvent>,
IHandle<EpisodeDownloadedEvent>
{
protected readonly IEpisodeService _episodeService;
protected readonly ISeriesService _seriesService;
protected readonly IQualityUpgradableSpecification _qualityUpgradableSpecification;
protected EpisodeModuleWithSignalR(IEpisodeService episodeService,
ISeriesService seriesService,
IQualityUpgradableSpecification qualityUpgradableSpecification,
IBroadcastSignalRMessage signalRBroadcaster)
: base(signalRBroadcaster)
{
_episodeService = episodeService;
_seriesService = seriesService;
_qualityUpgradableSpecification = qualityUpgradableSpecification;
GetResourceById = GetEpisode;
}
protected EpisodeModuleWithSignalR(IEpisodeService episodeService,
ISeriesService seriesService,
IQualityUpgradableSpecification qualityUpgradableSpecification,
IBroadcastSignalRMessage signalRBroadcaster,
string resource)
: base(signalRBroadcaster, resource)
{
_episodeService = episodeService;
_seriesService = seriesService;
_qualityUpgradableSpecification = qualityUpgradableSpecification;
GetResourceById = GetEpisode;
}
protected EpisodeResource GetEpisode(int id)
{
var episode = _episodeService.GetEpisode(id);
var resource = MapToResource(episode, true, true);
return resource;
}
protected EpisodeResource MapToResource(Episode episode, bool includeSeries, bool includeEpisodeFile)
{
var resource = episode.ToResource();
if (includeSeries || includeEpisodeFile)
{
var series = episode.Series ?? _seriesService.GetSeries(episode.SeriesId);
if (includeSeries)
{
resource.Series = series.ToResource();
}
if (includeEpisodeFile && episode.EpisodeFileId != 0)
{
resource.EpisodeFile = episode.EpisodeFile.Value.ToResource(series, _qualityUpgradableSpecification);
}
}
return resource;
}
protected List<EpisodeResource> MapToResource(List<Episode> episodes, bool includeSeries, bool includeEpisodeFile)
{
var result = episodes.ToResource();
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)
{
foreach (var episode in message.Episode.Episodes)
{
var resource = episode.ToResource();
resource.Grabbed = true;
BroadcastResourceChange(ModelAction.Updated, resource);
}
}
public void Handle(EpisodeDownloadedEvent message)
{
foreach (var episode in message.Episode.Episodes)
{
BroadcastResourceChange(ModelAction.Updated, episode.Id);
}
}
}
}
@@ -1,78 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using NzbDrone.Api.EpisodeFiles;
using NzbDrone.Api.REST;
using NzbDrone.Api.Series;
using NzbDrone.Core.Tv;
namespace NzbDrone.Api.Episodes
{
public class EpisodeResource : RestResource
{
public int SeriesId { get; set; }
public int EpisodeFileId { get; set; }
public int SeasonNumber { get; set; }
public int EpisodeNumber { get; set; }
public string Title { get; set; }
public string AirDate { get; set; }
public DateTime? AirDateUtc { get; set; }
public string Overview { get; set; }
public EpisodeFileResource EpisodeFile { get; set; }
public bool HasFile { get; set; }
public bool Monitored { get; set; }
public int? AbsoluteEpisodeNumber { get; set; }
public int? SceneAbsoluteEpisodeNumber { get; set; }
public int? SceneEpisodeNumber { get; set; }
public int? SceneSeasonNumber { get; set; }
public bool UnverifiedSceneNumbering { get; set; }
public string SeriesTitle { get; set; }
public SeriesResource Series { get; set; }
//Hiding this so people don't think its usable (only used to set the initial state)
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
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();
}
}
}
@@ -1,37 +0,0 @@
using System.Collections.Generic;
using NzbDrone.Api.REST;
using NzbDrone.Core.MediaFiles;
namespace NzbDrone.Api.Episodes
{
public class RenameEpisodeModule : NzbDroneRestModule<RenameEpisodeResource>
{
private readonly IRenameEpisodeFileService _renameEpisodeFileService;
public RenameEpisodeModule(IRenameEpisodeFileService renameEpisodeFileService)
: base("rename")
{
_renameEpisodeFileService = renameEpisodeFileService;
GetResourceAll = GetEpisodes;
}
private List<RenameEpisodeResource> GetEpisodes()
{
if (!Request.Query.SeriesId.HasValue)
{
throw new BadRequestException("seriesId is missing");
}
var seriesId = (int)Request.Query.SeriesId;
if (Request.Query.SeasonNumber.HasValue)
{
var seasonNumber = (int)Request.Query.SeasonNumber;
return _renameEpisodeFileService.GetRenamePreviews(seriesId, seasonNumber).ToResource();
}
return _renameEpisodeFileService.GetRenamePreviews(seriesId).ToResource();
}
}
}
@@ -1,39 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Api.REST;
namespace NzbDrone.Api.Episodes
{
public class RenameEpisodeResource : RestResource
{
public int SeriesId { get; set; }
public int SeasonNumber { get; set; }
public List<int> EpisodeNumbers { get; set; }
public int EpisodeFileId { get; set; }
public string ExistingPath { 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();
}
}
}
@@ -0,0 +1,45 @@
using System.Collections.Generic;
using NzbDrone.Api.REST;
using NzbDrone.Core.Extras.Files;
using NzbDrone.Core.Extras.Metadata.Files;
using NzbDrone.Core.Extras.Others;
using NzbDrone.Core.Extras.Subtitles;
namespace NzbDrone.Api.ExtraFiles
{
public class ExtraFileModule : NzbDroneRestModule<ExtraFileResource>
{
private readonly IExtraFileService<SubtitleFile> _subtitleFileService;
private readonly IExtraFileService<MetadataFile> _metadataFileService;
private readonly IExtraFileService<OtherExtraFile> _otherFileService;
public ExtraFileModule(IExtraFileService<SubtitleFile> subtitleFileService, IExtraFileService<MetadataFile> metadataFileService, IExtraFileService<OtherExtraFile> otherExtraFileService)
: base("/extrafile")
{
_subtitleFileService = subtitleFileService;
_metadataFileService = metadataFileService;
_otherFileService = otherExtraFileService;
GetResourceAll = GetFiles;
}
private List<ExtraFileResource> GetFiles()
{
if (!Request.Query.MovieId.HasValue)
{
throw new BadRequestException("MovieId is missing");
}
var extraFiles = new List<ExtraFileResource>();
List<SubtitleFile> subtitleFiles = _subtitleFileService.GetFilesByMovie(Request.Query.MovieId);
List<MetadataFile> metadataFiles = _metadataFileService.GetFilesByMovie(Request.Query.MovieId);
List<OtherExtraFile> otherExtraFiles = _otherFileService.GetFilesByMovie(Request.Query.MovieId);
extraFiles.AddRange(subtitleFiles.ToResource());
extraFiles.AddRange(metadataFiles.ToResource());
extraFiles.AddRange(otherExtraFiles.ToResource());
return extraFiles;
}
}
}
@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Api.REST;
using NzbDrone.Core.Extras.Files;
using NzbDrone.Core.Extras.Metadata.Files;
using NzbDrone.Core.Extras.Others;
using NzbDrone.Core.Extras.Subtitles;
namespace NzbDrone.Api.ExtraFiles
{
public class ExtraFileResource : RestResource
{
public int MovieId { get; set; }
public int? MovieFileId { get; set; }
public string RelativePath { get; set; }
public string Extension { get; set; }
public ExtraFileType Type { get; set; }
}
public static class ExtraFileResourceMapper
{
public static ExtraFileResource ToResource(this MetadataFile model)
{
if (model == null) return null;
return new ExtraFileResource
{
Id = model.Id,
MovieId = model.MovieId,
MovieFileId = model.MovieFileId,
RelativePath = model.RelativePath,
Extension = model.Extension,
Type = ExtraFileType.Metadata
};
}
public static ExtraFileResource ToResource(this SubtitleFile model)
{
if (model == null) return null;
return new ExtraFileResource
{
Id = model.Id,
MovieId = model.MovieId,
MovieFileId = model.MovieFileId,
RelativePath = model.RelativePath,
Extension = model.Extension,
Type = ExtraFileType.Subtitle
};
}
public static ExtraFileResource ToResource(this OtherExtraFile model)
{
if (model == null) return null;
return new ExtraFileResource
{
Id = model.Id,
MovieId = model.MovieId,
MovieFileId = model.MovieFileId,
RelativePath = model.RelativePath,
Extension = model.Extension,
Type = ExtraFileType.Other
};
}
public static List<ExtraFileResource> ToResource(this IEnumerable<SubtitleFile> movies)
{
return movies.Select(ToResource).ToList();
}
public static List<ExtraFileResource> ToResource(this IEnumerable<MetadataFile> movies)
{
return movies.Select(ToResource).ToList();
}
public static List<ExtraFileResource> ToResource(this IEnumerable<OtherExtraFile> movies)
{
return movies.Select(ToResource).ToList();
}
}
}
+2 -2
View File
@@ -1,7 +1,7 @@
using System; using System;
using Nancy; using Nancy;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
using NzbDrone.Api.Movie; using NzbDrone.Api.Movies;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
+2 -13
View File
@@ -1,9 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using NzbDrone.Api.Episodes;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Api.Series; using NzbDrone.Api.Movies;
using NzbDrone.Api.Movie;
using NzbDrone.Core.History; using NzbDrone.Core.History;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
@@ -12,9 +10,7 @@ namespace NzbDrone.Api.History
{ {
public class HistoryResource : RestResource public class HistoryResource : RestResource
{ {
public int EpisodeId { get; set; }
public int MovieId { get; set; } public int MovieId { get; set; }
public int SeriesId { get; set; }
public string SourceTitle { get; set; } public string SourceTitle { get; set; }
public QualityModel Quality { get; set; } public QualityModel Quality { get; set; }
public bool QualityCutoffNotMet { get; set; } public bool QualityCutoffNotMet { get; set; }
@@ -25,8 +21,6 @@ namespace NzbDrone.Api.History
public Dictionary<string, string> Data { get; set; } public Dictionary<string, string> Data { get; set; }
public MovieResource Movie { get; set; } public MovieResource Movie { get; set; }
public EpisodeResource Episode { get; set; }
public SeriesResource Series { get; set; }
} }
public static class HistoryResourceMapper public static class HistoryResourceMapper
@@ -38,9 +32,6 @@ namespace NzbDrone.Api.History
return new HistoryResource return new HistoryResource
{ {
Id = model.Id, Id = model.Id,
EpisodeId = model.EpisodeId,
SeriesId = model.SeriesId,
MovieId = model.MovieId, MovieId = model.MovieId,
SourceTitle = model.SourceTitle, SourceTitle = model.SourceTitle,
Quality = model.Quality, Quality = model.Quality,
@@ -51,8 +42,6 @@ namespace NzbDrone.Api.History
EventType = model.EventType, EventType = model.EventType,
Data = model.Data Data = model.Data
//Episode
//Series
}; };
} }
} }
@@ -1,9 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Api.Episodes; using NzbDrone.Api.Movies;
using NzbDrone.Api.Movie;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Api.Series;
using NzbDrone.Common.Crypto; using NzbDrone.Common.Crypto;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
@@ -16,10 +14,7 @@ namespace NzbDrone.Api.ManualImport
public string RelativePath { get; set; } public string RelativePath { get; set; }
public string Name { get; set; } public string Name { get; set; }
public long Size { get; set; } public long Size { get; set; }
public SeriesResource Series { get; set; }
public MovieResource Movie { get; set; } public MovieResource Movie { get; set; }
public int? SeasonNumber { get; set; }
public List<Episodes.EpisodeResource> Episodes { get; set; }
public QualityModel Quality { get; set; } public QualityModel Quality { get; set; }
public int QualityWeight { get; set; } public int QualityWeight { get; set; }
public string DownloadId { get; set; } public string DownloadId { get; set; }
@@ -40,10 +35,7 @@ namespace NzbDrone.Api.ManualImport
RelativePath = model.RelativePath, RelativePath = model.RelativePath,
Name = model.Name, Name = model.Name,
Size = model.Size, Size = model.Size,
Series = model.Series.ToResource(),
Movie = model.Movie.ToResource(), Movie = model.Movie.ToResource(),
SeasonNumber = model.SeasonNumber,
Episodes = model.Episodes.ToResource(),
Quality = model.Quality, Quality = model.Quality,
//QualityWeight //QualityWeight
DownloadId = model.DownloadId, DownloadId = model.DownloadId,
@@ -1,8 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using NLog; using NLog;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Api.Movie;
using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.MediaFiles.Events;
@@ -11,7 +10,7 @@ using NzbDrone.Core.Tv;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.SignalR; using NzbDrone.SignalR;
namespace NzbDrone.Api.EpisodeFiles namespace NzbDrone.Api.MovieFiles
{ {
public class MovieFileModule : NzbDroneRestModuleWithSignalR<MovieFileResource, MovieFile>, IHandle<MovieFileAddedEvent> public class MovieFileModule : NzbDroneRestModuleWithSignalR<MovieFileResource, MovieFile>, IHandle<MovieFileAddedEvent>
{ {
@@ -72,4 +71,4 @@ namespace NzbDrone.Api.EpisodeFiles
BroadcastResourceChange(ModelAction.Updated, message.MovieFile.Id); BroadcastResourceChange(ModelAction.Updated, message.MovieFile.Id);
} }
} }
} }
@@ -1,14 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Api.Movies;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Api.Series;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.MovieFiles
{ {
public class MovieFileResource : RestResource public class MovieFileResource : RestResource
{ {
@@ -4,7 +4,6 @@ using System.Linq;
using Marr.Data; using Marr.Data;
using Nancy; using Nancy;
using NzbDrone.Api; using NzbDrone.Api;
using NzbDrone.Api.Movie;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
@@ -18,7 +17,7 @@ using NzbDrone.Core.RootFolders;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Tv.Events; using NzbDrone.Core.Tv.Events;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class AlternativeTitleModule : NzbDroneRestModule<AlternativeTitleResource> public class AlternativeTitleModule : NzbDroneRestModule<AlternativeTitleResource>
{ {
@@ -54,4 +53,4 @@ namespace NzbDrone.Api.Movie
return _altTitleService.GetById(id).ToResource(); return _altTitleService.GetById(id).ToResource();
} }
} }
} }
@@ -1,16 +1,15 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Api.Series;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Movies.AlternativeTitles; using NzbDrone.Core.Movies.AlternativeTitles;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class AlternativeTitleResource : RestResource public class AlternativeTitleResource : RestResource
{ {
@@ -4,7 +4,6 @@ using System.Linq;
using Marr.Data; using Marr.Data;
using Nancy; using Nancy;
using NzbDrone.Api; using NzbDrone.Api;
using NzbDrone.Api.Movie;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Messaging; using NzbDrone.Common.Messaging;
@@ -19,7 +18,7 @@ using NzbDrone.Core.RootFolders;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Tv.Events; using NzbDrone.Core.Tv.Events;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class AlternativeYearModule : NzbDroneRestModule<AlternativeYearResource> public class AlternativeYearModule : NzbDroneRestModule<AlternativeYearResource>
{ {
@@ -60,4 +59,4 @@ namespace NzbDrone.Api.Movie
}; };
} }
} }
} }
@@ -1,16 +1,15 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Api.Series;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Movies.AlternativeTitles; using NzbDrone.Core.Movies.AlternativeTitles;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class AlternativeYearResource : RestResource public class AlternativeYearResource : RestResource
{ {
@@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using Nancy; using Nancy;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
@@ -6,7 +6,7 @@ using NzbDrone.Core.MetadataSource;
using System.Linq; using System.Linq;
using NzbDrone.Core.NetImport; using NzbDrone.Core.NetImport;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class FetchMovieListModule : NzbDroneRestModule<MovieResource> public class FetchMovieListModule : NzbDroneRestModule<MovieResource>
{ {
@@ -57,4 +57,4 @@ namespace NzbDrone.Api.Movie
} }
} }
} }
} }
@@ -1,4 +1,3 @@
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using Nancy; using Nancy;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
@@ -16,7 +15,7 @@ using NzbDrone.Core.RootFolders;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class UnmappedComparer : IComparer<UnmappedFolder> public class UnmappedComparer : IComparer<UnmappedFolder>
@@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using Nancy; using Nancy;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
@@ -9,7 +9,7 @@ using NzbDrone.Api.REST;
using NzbDrone.Core.NetImport; using NzbDrone.Core.NetImport;
using NzbDrone.Api.NetImport; using NzbDrone.Api.NetImport;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class MovieDiscoverModule : NzbDroneRestModule<MovieResource> public class MovieDiscoverModule : NzbDroneRestModule<MovieResource>
{ {
@@ -60,4 +60,4 @@ namespace NzbDrone.Api.Movie
} }
} }
} }
} }
+2 -2
View File
@@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Nancy; using Nancy;
@@ -7,7 +7,7 @@ using NzbDrone.Api.Extensions;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class MovieEditorModule : NzbDroneApiModule public class MovieEditorModule : NzbDroneApiModule
{ {
@@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using Nancy; using Nancy;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
@@ -7,7 +7,7 @@ using System.Linq;
using System; using System;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class MovieLookupModule : NzbDroneRestModule<MovieResource> public class MovieLookupModule : NzbDroneRestModule<MovieResource>
{ {
@@ -15,7 +15,7 @@ namespace NzbDrone.Api.Movie
private readonly IProvideMovieInfo _movieInfo; private readonly IProvideMovieInfo _movieInfo;
public MovieLookupModule(ISearchForNewMovie searchProxy, IProvideMovieInfo movieInfo) public MovieLookupModule(ISearchForNewMovie searchProxy, IProvideMovieInfo movieInfo)
: base("/movies/lookup") : base("/movie/lookup")
{ {
_movieInfo = movieInfo; _movieInfo = movieInfo;
_searchProxy = searchProxy; _searchProxy = searchProxy;
@@ -64,4 +64,4 @@ namespace NzbDrone.Api.Movie
} }
} }
} }
} }
+290 -3
View File
@@ -1,11 +1,298 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using FluentValidation;
using NzbDrone.Common.Extensions;
using NzbDrone.Api.Extensions;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.MediaCover;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.MovieStats;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Tv.Events;
using NzbDrone.Core.Validation.Paths;
using NzbDrone.Core.DataAugmentation.Scene;
using NzbDrone.Core.Validation;
using NzbDrone.SignalR;
using NzbDrone.Core.Datastore;
using Microsoft.CSharp.RuntimeBinder;
using Nancy;
namespace NzbDrone.Api.Movies namespace NzbDrone.Api.Movies
{ {
class MovieModule public class MovieModule : NzbDroneRestModuleWithSignalR<MovieResource, Core.Tv.Movie>,
IHandle<MovieImportedEvent>,
IHandle<MovieFileDeletedEvent>,
IHandle<MovieUpdatedEvent>,
IHandle<MovieEditedEvent>,
IHandle<MovieDeletedEvent>,
IHandle<MovieRenamedEvent>,
IHandle<MediaCoversUpdatedEvent>
{ {
protected readonly IMovieService _moviesService;
private readonly IMovieStatisticsService _moviesStatisticsService;
private readonly IMapCoversToLocal _coverMapper;
private const string TITLE_SLUG_ROUTE = "/titleslug/(?<slug>[^/]+)";
public MovieModule(IBroadcastSignalRMessage signalRBroadcaster,
IMovieService moviesService,
IMovieStatisticsService moviesStatisticsService,
ISceneMappingService sceneMappingService,
IMapCoversToLocal coverMapper,
RootFolderValidator rootFolderValidator,
MoviePathValidator moviesPathValidator,
MovieExistsValidator moviesExistsValidator,
DroneFactoryValidator droneFactoryValidator,
MovieAncestorValidator moviesAncestorValidator,
ProfileExistsValidator profileExistsValidator
)
: base(signalRBroadcaster)
{
_moviesService = moviesService;
_moviesStatisticsService = moviesStatisticsService;
_coverMapper = coverMapper;
GetResourceAll = AllMovie;
GetResourcePaged = GetMoviePaged;
GetResourceById = GetMovie;
Get[TITLE_SLUG_ROUTE] = GetByTitleSlug; /*(options) => {
return ReqResExtensions.AsResponse(GetByTitleSlug(options.slug), Nancy.HttpStatusCode.OK);
};*/
CreateResource = AddMovie;
UpdateResource = UpdateMovie;
DeleteResource = DeleteMovie;
Validation.RuleBuilderExtensions.ValidId(SharedValidator.RuleFor(s => s.ProfileId));
SharedValidator.RuleFor(s => s.Path)
.Cascade(CascadeMode.StopOnFirstFailure)
.IsValidPath()
.SetValidator(rootFolderValidator)
.SetValidator(moviesPathValidator)
.SetValidator(droneFactoryValidator)
.SetValidator(moviesAncestorValidator)
.When(s => !s.Path.IsNullOrWhiteSpace());
SharedValidator.RuleFor(s => s.ProfileId).SetValidator(profileExistsValidator);
PostValidator.RuleFor(s => s.Path).IsValidPath().When(s => s.RootFolderPath.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.RootFolderPath).IsValidPath().When(s => s.Path.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.Title).NotEmpty();
PostValidator.RuleFor(s => s.TmdbId).NotNull().NotEmpty().SetValidator(moviesExistsValidator);
PutValidator.RuleFor(s => s.Path).IsValidPath();
}
public MovieModule(IBroadcastSignalRMessage signalRBroadcaster,
IMovieService moviesService,
IMovieStatisticsService moviesStatisticsService,
ISceneMappingService sceneMappingService,
IMapCoversToLocal coverMapper,
string resource)
: base(signalRBroadcaster, resource)
{
_moviesService = moviesService;
_moviesStatisticsService = moviesStatisticsService;
_coverMapper = coverMapper;
GetResourceAll = AllMovie;
GetResourceById = GetMovie;
CreateResource = AddMovie;
UpdateResource = UpdateMovie;
DeleteResource = DeleteMovie;
}
private MovieResource GetMovie(int id)
{
var movies = _moviesService.GetMovie(id);
return MapToResource(movies);
}
private PagingResource<MovieResource> GetMoviePaged(PagingResource<MovieResource> pagingResource)
{
var pagingSpec = pagingResource.MapToPagingSpec<MovieResource, Core.Tv.Movie>();
pagingSpec.FilterExpression = _moviesService.ConstructFilterExpression(pagingResource.FilterKey, pagingResource.FilterValue, pagingResource.FilterType);
return ApplyToPage(_moviesService.Paged, pagingSpec, MapToResource);
}
protected MovieResource MapToResource(Core.Tv.Movie movies)
{
if (movies == null) return null;
var resource = movies.ToResource();
MapCoversToLocal(resource);
//FetchAndLinkMovieStatistics(resource);
//PopulateAlternateTitles(resource);
return resource;
}
private List<MovieResource> AllMovie()
{
var moviesStats = _moviesStatisticsService.MovieStatistics();
var moviesResources = _moviesService.GetAllMovies().ToResource();
MapCoversToLocal(moviesResources.ToArray());
LinkMovieStatistics(moviesResources, moviesStats);
PopulateAlternateTitles(moviesResources);
return moviesResources;
}
private Response GetByTitleSlug(dynamic options)
{
var slug = "";
try
{
slug = options.slug;
// do stuff with x
}
catch (RuntimeBinderException)
{
return new NotFoundResponse();
}
try
{
return MapToResource(_moviesService.FindByTitleSlug(slug)).AsResponse(Nancy.HttpStatusCode.OK);
}
catch (ModelNotFoundException)
{
return new NotFoundResponse();
}
}
private int AddMovie(MovieResource moviesResource)
{
var model = moviesResource.ToModel();
return _moviesService.AddMovie(model).Id;
}
private void UpdateMovie(MovieResource moviesResource)
{
var model = moviesResource.ToModel(_moviesService.GetMovie(moviesResource.Id));
_moviesService.UpdateMovie(model);
BroadcastResourceChange(ModelAction.Updated, moviesResource);
}
private void DeleteMovie(int id)
{
var deleteFiles = false;
var addExclusion = false;
var deleteFilesQuery = Request.Query.deleteFiles;
var addExclusionQuery = Request.Query.addExclusion;
if (deleteFilesQuery.HasValue)
{
deleteFiles = Convert.ToBoolean(deleteFilesQuery.Value);
}
if (addExclusionQuery.HasValue)
{
addExclusion = Convert.ToBoolean(addExclusionQuery.Value);
}
_moviesService.DeleteMovie(id, deleteFiles, addExclusion);
}
private void MapCoversToLocal(params MovieResource[] movies)
{
foreach (var moviesResource in movies)
{
_coverMapper.ConvertToLocalUrls(moviesResource.Id, moviesResource.Images);
}
}
private void FetchAndLinkMovieStatistics(MovieResource resource)
{
LinkMovieStatistics(resource, _moviesStatisticsService.MovieStatistics(resource.Id));
}
private void LinkMovieStatistics(List<MovieResource> resources, List<MovieStatistics> moviesStatistics)
{
var dictMovieStats = moviesStatistics.ToDictionary(v => v.MovieId);
foreach (var movies in resources)
{
var stats = dictMovieStats.GetValueOrDefault(movies.Id);
if (stats == null) continue;
LinkMovieStatistics(movies, stats);
}
}
private void LinkMovieStatistics(MovieResource resource, MovieStatistics moviesStatistics)
{
//resource.SizeOnDisk = 0;//TODO: incorporate movie statistics moviesStatistics.SizeOnDisk;
}
private void PopulateAlternateTitles(List<MovieResource> resources)
{
foreach (var resource in resources)
{
PopulateAlternateTitles(resource);
}
}
private void PopulateAlternateTitles(MovieResource resource)
{
//var mappings = null;//_sceneMappingService.FindByTvdbId(resource.TvdbId);
//if (mappings == null) return;
//Not necessary anymore
//resource.AlternateTitles = mappings.Select(v => new AlternateTitleResource { Title = v.Title, SeasonNumber = v.SeasonNumber, SceneSeasonNumber = v.SceneSeasonNumber }).ToList();
}
public void Handle(MovieImportedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.ImportedMovie.MovieId);
}
public void Handle(MovieFileDeletedEvent message)
{
if (message.Reason == DeleteMediaFileReason.Upgrade) return;
BroadcastResourceChange(ModelAction.Updated, message.MovieFile.MovieId);
}
public void Handle(MovieUpdatedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
}
public void Handle(MovieEditedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
}
public void Handle(MovieDeletedEvent message)
{
BroadcastResourceChange(ModelAction.Deleted, message.Movie.ToResource());
}
public void Handle(MovieRenamedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
}
public void Handle(MediaCoversUpdatedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
}
} }
} }
@@ -1,4 +1,4 @@
using NzbDrone.Api.Movie; using NzbDrone.Api.Movies;
using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
@@ -1,12 +1,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Api.Series; using NzbDrone.Api.MovieFiles;
namespace NzbDrone.Api.Movie namespace NzbDrone.Api.Movies
{ {
public class MovieResource : RestResource public class MovieResource : RestResource
{ {
+1 -1
View File
@@ -1,4 +1,4 @@
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -1,4 +1,4 @@
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -1,34 +1,34 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation; using FluentValidation;
using NzbDrone.Api.ClientSchema; using NzbDrone.Api.ClientSchema;
using NzbDrone.Core.NetImport; using NzbDrone.Core.NetImport;
using NzbDrone.Core.NetImport.ImportExclusions; using NzbDrone.Core.NetImport.ImportExclusions;
using NzbDrone.Core.Validation.Paths; using NzbDrone.Core.Validation.Paths;
namespace NzbDrone.Api.NetImport namespace NzbDrone.Api.NetImport
{ {
public class ImportExclusionsModule : NzbDroneRestModule<ImportExclusionsResource> public class ImportExclusionsModule : NzbDroneRestModule<ImportExclusionsResource>
{ {
private readonly IImportExclusionsService _exclusionService; private readonly IImportExclusionsService _exclusionService;
public ImportExclusionsModule(NetImportFactory netImportFactory, IImportExclusionsService exclusionService) : base("exclusions") public ImportExclusionsModule(NetImportFactory netImportFactory, IImportExclusionsService exclusionService) : base("exclusions")
{ {
_exclusionService = exclusionService; _exclusionService = exclusionService;
GetResourceAll = GetAll; GetResourceAll = GetAll;
CreateResource = AddExclusion; CreateResource = AddExclusion;
DeleteResource = RemoveExclusion; DeleteResource = RemoveExclusion;
GetResourceById = GetById; GetResourceById = GetById;
} }
public List<ImportExclusionsResource> GetAll() public List<ImportExclusionsResource> GetAll()
{ {
return _exclusionService.GetAllExclusions().ToResource(); return _exclusionService.GetAllExclusions().ToResource();
} }
public ImportExclusionsResource GetById(int id) public ImportExclusionsResource GetById(int id)
{ {
return _exclusionService.GetById(id).ToResource(); return _exclusionService.GetById(id).ToResource();
} }
public int AddExclusion(ImportExclusionsResource exclusionResource) public int AddExclusion(ImportExclusionsResource exclusionResource)
{ {
@@ -40,6 +40,6 @@ namespace NzbDrone.Api.NetImport
public void RemoveExclusion (int id) public void RemoveExclusion (int id)
{ {
_exclusionService.RemoveExclusion(new ImportExclusion { Id = id }); _exclusionService.RemoveExclusion(new ImportExclusion { Id = id });
} }
} }
} }
@@ -1,46 +1,46 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Core.NetImport; using NzbDrone.Core.NetImport;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
namespace NzbDrone.Api.NetImport namespace NzbDrone.Api.NetImport
{ {
public class ImportExclusionsResource : ProviderResource public class ImportExclusionsResource : ProviderResource
{ {
//public int Id { get; set; } //public int Id { get; set; }
public int TmdbId { get; set; } public int TmdbId { get; set; }
public string MovieTitle { get; set; } public string MovieTitle { get; set; }
public int MovieYear { get; set; } public int MovieYear { get; set; }
} }
public static class ImportExclusionsResourceMapper public static class ImportExclusionsResourceMapper
{ {
public static ImportExclusionsResource ToResource(this Core.NetImport.ImportExclusions.ImportExclusion model) public static ImportExclusionsResource ToResource(this Core.NetImport.ImportExclusions.ImportExclusion model)
{ {
if (model == null) return null; if (model == null) return null;
return new ImportExclusionsResource return new ImportExclusionsResource
{ {
Id = model.Id, Id = model.Id,
TmdbId = model.TmdbId, TmdbId = model.TmdbId,
MovieTitle = model.MovieTitle, MovieTitle = model.MovieTitle,
MovieYear = model.MovieYear MovieYear = model.MovieYear
}; };
} }
public static List<ImportExclusionsResource> ToResource(this IEnumerable<Core.NetImport.ImportExclusions.ImportExclusion> exclusions) public static List<ImportExclusionsResource> ToResource(this IEnumerable<Core.NetImport.ImportExclusions.ImportExclusion> exclusions)
{ {
return exclusions.Select(ToResource).ToList(); return exclusions.Select(ToResource).ToList();
} }
public static Core.NetImport.ImportExclusions.ImportExclusion ToModel(this ImportExclusionsResource resource) public static Core.NetImport.ImportExclusions.ImportExclusion ToModel(this ImportExclusionsResource resource)
{ {
return new Core.NetImport.ImportExclusions.ImportExclusion return new Core.NetImport.ImportExclusions.ImportExclusion
{ {
TmdbId = resource.TmdbId, TmdbId = resource.TmdbId,
MovieTitle = resource.MovieTitle, MovieTitle = resource.MovieTitle,
MovieYear = resource.MovieYear MovieYear = resource.MovieYear
}; };
} }
} }
} }
@@ -1,9 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Nancy; using Nancy;
using Nancy.Extensions; using Nancy.Extensions;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
using NzbDrone.Api.Movie; using NzbDrone.Api.Movies;
using NzbDrone.Core.MetadataSource; using NzbDrone.Core.MetadataSource;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
@@ -1,4 +1,3 @@
using NzbDrone.Core.NetImport;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
namespace NzbDrone.Api.NetImport namespace NzbDrone.Api.NetImport
+298 -307
View File
@@ -1,314 +1,305 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{FD286DF8-2D3A-4394-8AD5-443FADE55FB2}</ProjectGuid> <ProjectGuid>{FD286DF8-2D3A-4394-8AD5-443FADE55FB2}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NzbDrone.Api</RootNamespace> <RootNamespace>NzbDrone.Api</RootNamespace>
<AssemblyName>NzbDrone.Api</AssemblyName> <AssemblyName>NzbDrone.Api</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages> <RestorePackages>true</RestorePackages>
<TargetFrameworkProfile> <TargetFrameworkProfile>
</TargetFrameworkProfile> </TargetFrameworkProfile>
<ProductVersion>12.0.0</ProductVersion> <ProductVersion>12.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>..\..\_output\</OutputPath> <OutputPath>..\..\_output\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<Optimize>false</Optimize> <Optimize>false</Optimize>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>..\..\_output\</OutputPath> <OutputPath>..\..\_output\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="antlr.runtime, Version=2.7.6.2, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="antlr.runtime, Version=2.7.6.2, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Ical.Net.2.2.25\lib\net40\antlr.runtime.dll</HintPath> <HintPath>..\packages\Ical.Net.2.2.25\lib\net40\antlr.runtime.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="FluentValidation, Version=6.2.1.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="FluentValidation, Version=6.2.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\FluentValidation.6.2.1.0\lib\portable-net40+sl50+wp80+win8+wpa81\FluentValidation.dll</HintPath> <HintPath>..\packages\FluentValidation.6.2.1.0\lib\portable-net40+sl50+wp80+win8+wpa81\FluentValidation.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Ical.Net, Version=2.1.0.30332, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Ical.Net, Version=2.1.0.30332, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Ical.Net.2.2.25\lib\net40\Ical.Net.dll</HintPath> <HintPath>..\packages\Ical.Net.2.2.25\lib\net40\Ical.Net.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Ical.Net.Collections, Version=2.1.0.30331, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Ical.Net.Collections, Version=2.1.0.30331, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Ical.Net.2.2.25\lib\net40\Ical.Net.Collections.dll</HintPath> <HintPath>..\packages\Ical.Net.2.2.25\lib\net40\Ical.Net.Collections.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Nancy, Version=1.4.2.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Nancy, Version=1.4.2.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nancy.1.4.3\lib\net40\Nancy.dll</HintPath> <HintPath>..\packages\Nancy.1.4.3\lib\net40\Nancy.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Nancy.Authentication.Basic, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Nancy.Authentication.Basic, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nancy.Authentication.Basic.1.4.1\lib\net40\Nancy.Authentication.Basic.dll</HintPath> <HintPath>..\packages\Nancy.Authentication.Basic.1.4.1\lib\net40\Nancy.Authentication.Basic.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Nancy.Authentication.Forms, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Nancy.Authentication.Forms, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nancy.Authentication.Forms.1.4.1\lib\net40\Nancy.Authentication.Forms.dll</HintPath> <HintPath>..\packages\Nancy.Authentication.Forms.1.4.1\lib\net40\Nancy.Authentication.Forms.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\net40\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\net40\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.3.11\lib\net40\NLog.dll</HintPath> <HintPath>..\packages\NLog.4.5.0-rc06\lib\net40-client\NLog.dll</HintPath>
<Private>True</Private> </Reference>
</Reference> <Reference Include="NodaTime, Version=1.3.0.0, Culture=neutral, PublicKeyToken=4226afe0d9b296d1, processorArchitecture=MSIL">
<Reference Include="NodaTime, Version=1.3.0.0, Culture=neutral, PublicKeyToken=4226afe0d9b296d1, processorArchitecture=MSIL"> <HintPath>..\packages\Ical.Net.2.2.25\lib\net40\NodaTime.dll</HintPath>
<HintPath>..\packages\Ical.Net.2.2.25\lib\net40\NodaTime.dll</HintPath> <Private>True</Private>
<Private>True</Private> </Reference>
</Reference> <Reference Include="System" />
<Reference Include="System" /> <Reference Include="System.Configuration" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data.SQLite, Version=1.0.84.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL"> <Reference Include="System.Data.SQLite, Version=1.0.84.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\Libraries\Sqlite\System.Data.SQLite.dll</HintPath> <HintPath>..\Libraries\Sqlite\System.Data.SQLite.dll</HintPath>
</Reference> </Reference>
</ItemGroup> <Reference Include="System.Runtime.Serialization" />
<ItemGroup> <Reference Include="System.ServiceModel" />
<Compile Include="..\NzbDrone.Common\Properties\SharedAssemblyInfo.cs"> <Reference Include="System.Transactions" />
<Link>Properties\SharedAssemblyInfo.cs</Link> <Reference Include="System.Xml" />
</Compile> </ItemGroup>
<Compile Include="Authentication\AuthenticationService.cs" /> <ItemGroup>
<Compile Include="Authentication\EnableAuthInNancy.cs" /> <Compile Include="..\NzbDrone.Common\Properties\SharedAssemblyInfo.cs">
<Compile Include="Authentication\AuthenticationModule.cs" /> <Link>Properties\SharedAssemblyInfo.cs</Link>
<Compile Include="Authentication\LoginResource.cs" /> </Compile>
<Compile Include="Authentication\NzbDroneUser.cs" /> <Compile Include="Authentication\AuthenticationService.cs" />
<Compile Include="Blacklist\BlacklistModule.cs" /> <Compile Include="Authentication\EnableAuthInNancy.cs" />
<Compile Include="Blacklist\BlacklistResource.cs" /> <Compile Include="Authentication\AuthenticationModule.cs" />
<Compile Include="Calendar\CalendarFeedModule.cs" /> <Compile Include="Authentication\LoginResource.cs" />
<Compile Include="Calendar\CalendarModule.cs" /> <Compile Include="Authentication\NzbDroneUser.cs" />
<Compile Include="ClientSchema\Field.cs" /> <Compile Include="Blacklist\BlacklistModule.cs" />
<Compile Include="ClientSchema\FieldDefinitionAttribute.cs" /> <Compile Include="Blacklist\BlacklistResource.cs" />
<Compile Include="ClientSchema\SchemaBuilder.cs" /> <Compile Include="Calendar\CalendarFeedModule.cs" />
<Compile Include="ClientSchema\SchemaDeserializer.cs" /> <Compile Include="Calendar\CalendarModule.cs" />
<Compile Include="ClientSchema\SelectOption.cs" /> <Compile Include="ClientSchema\Field.cs" />
<Compile Include="Commands\CommandModule.cs" /> <Compile Include="ClientSchema\FieldDefinitionAttribute.cs" />
<Compile Include="Commands\CommandResource.cs" /> <Compile Include="ClientSchema\SchemaBuilder.cs" />
<Compile Include="Config\NetImportConfigModule.cs" /> <Compile Include="ClientSchema\SchemaDeserializer.cs" />
<Compile Include="Config\NetImportConfigResource.cs" /> <Compile Include="ClientSchema\SelectOption.cs" />
<Compile Include="Extensions\AccessControlHeaders.cs" /> <Compile Include="Commands\CommandModule.cs" />
<Compile Include="Extensions\Pipelines\CorsPipeline.cs" /> <Compile Include="Commands\CommandResource.cs" />
<Compile Include="Extensions\Pipelines\UrlBasePipeline.cs" /> <Compile Include="Config\NetImportConfigModule.cs" />
<Compile Include="Extensions\Pipelines\RequestLoggingPipeline.cs" /> <Compile Include="Config\NetImportConfigResource.cs" />
<Compile Include="Frontend\Mappers\LoginHtmlMapper.cs" /> <Compile Include="Extensions\AccessControlHeaders.cs" />
<Compile Include="Frontend\Mappers\RobotsTxtMapper.cs" /> <Compile Include="Extensions\Pipelines\CorsPipeline.cs" />
<Compile Include="Indexers\ReleaseModuleBase.cs" /> <Compile Include="Extensions\Pipelines\UrlBasePipeline.cs" />
<Compile Include="Indexers\ReleasePushModule.cs" /> <Compile Include="Extensions\Pipelines\RequestLoggingPipeline.cs" />
<Compile Include="Movies\AlternativeTitleModule.cs" /> <Compile Include="ExtraFiles\ExtraFileResource.cs" />
<Compile Include="Movies\AlternativeYearResource.cs" /> <Compile Include="Frontend\Mappers\LoginHtmlMapper.cs" />
<Compile Include="Movies\AlternativeYearModule.cs" /> <Compile Include="Frontend\Mappers\RobotsTxtMapper.cs" />
<Compile Include="Movies\MovieModuleWithSignalR.cs" /> <Compile Include="Indexers\ReleaseModuleBase.cs" />
<Compile Include="Movies\MovieBulkImportModule.cs" /> <Compile Include="Indexers\ReleasePushModule.cs" />
<Compile Include="Movies\MovieFileModule.cs" /> <Compile Include="ExtraFiles\ExtraFileModule.cs" />
<Compile Include="Series\MovieModule.cs" /> <Compile Include="Movies\AlternativeTitleModule.cs" />
<Compile Include="Movies\RenameMovieModule.cs" /> <Compile Include="Movies\AlternativeYearResource.cs" />
<Compile Include="Movies\RenameMovieResource.cs" /> <Compile Include="Movies\AlternativeYearModule.cs" />
<Compile Include="Movies\MovieEditorModule.cs" /> <Compile Include="Movies\MovieModuleWithSignalR.cs" />
<Compile Include="NetImport\ListImportModule.cs" /> <Compile Include="Movies\MovieBulkImportModule.cs" />
<Compile Include="NetImport\NetImportModule.cs" /> <Compile Include="MovieFiles\MovieFileModule.cs" />
<Compile Include="NetImport\NetImportResource.cs" /> <Compile Include="Movies\MovieModule.cs" />
<Compile Include="Parse\ParseModule.cs" /> <Compile Include="Movies\RenameMovieModule.cs" />
<Compile Include="Parse\ParseResource.cs" /> <Compile Include="Movies\RenameMovieResource.cs" />
<Compile Include="ManualImport\ManualImportModule.cs" /> <Compile Include="Movies\MovieEditorModule.cs" />
<Compile Include="ManualImport\ManualImportResource.cs" /> <Compile Include="NetImport\ListImportModule.cs" />
<Compile Include="Profiles\Delay\DelayProfileModule.cs" /> <Compile Include="NetImport\NetImportModule.cs" />
<Compile Include="Profiles\Delay\DelayProfileResource.cs" /> <Compile Include="NetImport\NetImportResource.cs" />
<Compile Include="Queue\QueueActionModule.cs" /> <Compile Include="Parse\ParseModule.cs" />
<Compile Include="RemotePathMappings\RemotePathMappingModule.cs" /> <Compile Include="Parse\ParseResource.cs" />
<Compile Include="RemotePathMappings\RemotePathMappingResource.cs" /> <Compile Include="ManualImport\ManualImportModule.cs" />
<Compile Include="Config\UiConfigModule.cs" /> <Compile Include="ManualImport\ManualImportResource.cs" />
<Compile Include="Config\UiConfigResource.cs" /> <Compile Include="Profiles\Delay\DelayProfileModule.cs" />
<Compile Include="Config\DownloadClientConfigModule.cs" /> <Compile Include="Profiles\Delay\DelayProfileResource.cs" />
<Compile Include="Config\DownloadClientConfigResource.cs" /> <Compile Include="Queue\QueueActionModule.cs" />
<Compile Include="Config\HostConfigModule.cs" /> <Compile Include="RemotePathMappings\RemotePathMappingModule.cs" />
<Compile Include="Config\HostConfigResource.cs" /> <Compile Include="RemotePathMappings\RemotePathMappingResource.cs" />
<Compile Include="Config\IndexerConfigModule.cs" /> <Compile Include="Config\UiConfigModule.cs" />
<Compile Include="Config\IndexerConfigResource.cs" /> <Compile Include="Config\UiConfigResource.cs" />
<Compile Include="Config\MediaManagementConfigModule.cs" /> <Compile Include="Config\DownloadClientConfigModule.cs" />
<Compile Include="Config\MediaManagementConfigResource.cs" /> <Compile Include="Config\DownloadClientConfigResource.cs" />
<Compile Include="Config\NamingConfigModule.cs" /> <Compile Include="Config\HostConfigModule.cs" />
<Compile Include="Config\NamingConfigResource.cs" /> <Compile Include="Config\HostConfigResource.cs" />
<Compile Include="Config\NamingSampleResource.cs" /> <Compile Include="Config\IndexerConfigModule.cs" />
<Compile Include="Config\NzbDroneConfigModule.cs" /> <Compile Include="Config\IndexerConfigResource.cs" />
<Compile Include="FileSystem\FileSystemModule.cs" /> <Compile Include="Config\MediaManagementConfigModule.cs" />
<Compile Include="DiskSpace\DiskSpaceModule.cs" /> <Compile Include="Config\MediaManagementConfigResource.cs" />
<Compile Include="DiskSpace\DiskSpaceResource.cs" /> <Compile Include="Config\NamingConfigModule.cs" />
<Compile Include="DownloadClient\DownloadClientModule.cs" /> <Compile Include="Config\NamingConfigResource.cs" />
<Compile Include="DownloadClient\DownloadClientResource.cs" /> <Compile Include="Config\NamingSampleResource.cs" />
<Compile Include="EpisodeFiles\EpisodeFileModule.cs" /> <Compile Include="Config\NzbDroneConfigModule.cs" />
<Compile Include="EpisodeFiles\EpisodeFileResource.cs" /> <Compile Include="FileSystem\FileSystemModule.cs" />
<Compile Include="Episodes\EpisodeModule.cs" /> <Compile Include="DiskSpace\DiskSpaceModule.cs" />
<Compile Include="Episodes\EpisodeModuleWithSignalR.cs" /> <Compile Include="DiskSpace\DiskSpaceResource.cs" />
<Compile Include="Episodes\EpisodeResource.cs" /> <Compile Include="DownloadClient\DownloadClientModule.cs" />
<Compile Include="Episodes\RenameEpisodeModule.cs" /> <Compile Include="DownloadClient\DownloadClientResource.cs" />
<Compile Include="Episodes\RenameEpisodeResource.cs" /> <Compile Include="ErrorManagement\ApiException.cs" />
<Compile Include="ErrorManagement\ApiException.cs" /> <Compile Include="ErrorManagement\ErrorHandler.cs" />
<Compile Include="ErrorManagement\ErrorHandler.cs" /> <Compile Include="ErrorManagement\ErrorModel.cs" />
<Compile Include="ErrorManagement\ErrorModel.cs" /> <Compile Include="ErrorManagement\NzbDroneErrorPipeline.cs" />
<Compile Include="ErrorManagement\NzbDroneErrorPipeline.cs" /> <Compile Include="Exceptions\InvalidApiKeyException.cs" />
<Compile Include="Exceptions\InvalidApiKeyException.cs" /> <Compile Include="Extensions\NancyJsonSerializer.cs" />
<Compile Include="Extensions\NancyJsonSerializer.cs" /> <Compile Include="Extensions\Pipelines\CacheHeaderPipeline.cs" />
<Compile Include="Extensions\Pipelines\CacheHeaderPipeline.cs" /> <Compile Include="Extensions\Pipelines\GZipPipeline.cs" />
<Compile Include="Extensions\Pipelines\GZipPipeline.cs" /> <Compile Include="Extensions\Pipelines\IfModifiedPipeline.cs" />
<Compile Include="Extensions\Pipelines\IfModifiedPipeline.cs" /> <Compile Include="Extensions\Pipelines\IRegisterNancyPipeline.cs" />
<Compile Include="Extensions\Pipelines\IRegisterNancyPipeline.cs" /> <Compile Include="Extensions\Pipelines\NzbDroneVersionPipeline.cs" />
<Compile Include="Extensions\Pipelines\NzbDroneVersionPipeline.cs" /> <Compile Include="Extensions\ReqResExtensions.cs" />
<Compile Include="Extensions\ReqResExtensions.cs" /> <Compile Include="Extensions\RequestExtensions.cs" />
<Compile Include="Extensions\RequestExtensions.cs" /> <Compile Include="Frontend\CacheableSpecification.cs" />
<Compile Include="Frontend\CacheableSpecification.cs" /> <Compile Include="Frontend\Mappers\BackupFileMapper.cs" />
<Compile Include="Frontend\Mappers\BackupFileMapper.cs" /> <Compile Include="Frontend\Mappers\CacheBreakerProvider.cs" />
<Compile Include="Frontend\Mappers\CacheBreakerProvider.cs" /> <Compile Include="Frontend\Mappers\FaviconMapper.cs" />
<Compile Include="Frontend\Mappers\FaviconMapper.cs" /> <Compile Include="Frontend\Mappers\IMapHttpRequestsToDisk.cs" />
<Compile Include="Frontend\Mappers\IMapHttpRequestsToDisk.cs" /> <Compile Include="Frontend\Mappers\IndexHtmlMapper.cs" />
<Compile Include="Frontend\Mappers\IndexHtmlMapper.cs" /> <Compile Include="Frontend\Mappers\LogFileMapper.cs" />
<Compile Include="Frontend\Mappers\LogFileMapper.cs" /> <Compile Include="Frontend\Mappers\MediaCoverMapper.cs" />
<Compile Include="Frontend\Mappers\MediaCoverMapper.cs" /> <Compile Include="Frontend\Mappers\StaticResourceMapper.cs" />
<Compile Include="Frontend\Mappers\StaticResourceMapper.cs" /> <Compile Include="Frontend\Mappers\StaticResourceMapperBase.cs" />
<Compile Include="Frontend\Mappers\StaticResourceMapperBase.cs" /> <Compile Include="Frontend\Mappers\UpdateLogFileMapper.cs" />
<Compile Include="Frontend\Mappers\UpdateLogFileMapper.cs" /> <Compile Include="Frontend\StaticResourceModule.cs" />
<Compile Include="Frontend\StaticResourceModule.cs" /> <Compile Include="Health\HealthModule.cs" />
<Compile Include="Health\HealthModule.cs" /> <Compile Include="Health\HealthResource.cs" />
<Compile Include="Health\HealthResource.cs" /> <Compile Include="History\HistoryModule.cs" />
<Compile Include="History\HistoryModule.cs" /> <Compile Include="History\HistoryResource.cs" />
<Compile Include="History\HistoryResource.cs" /> <Compile Include="Indexers\IndexerModule.cs" />
<Compile Include="Indexers\IndexerModule.cs" /> <Compile Include="Indexers\IndexerResource.cs" />
<Compile Include="Indexers\IndexerResource.cs" /> <Compile Include="Indexers\ReleaseModule.cs" />
<Compile Include="Indexers\ReleaseModule.cs" /> <Compile Include="Indexers\ReleaseResource.cs" />
<Compile Include="Indexers\ReleaseResource.cs" /> <Compile Include="Logs\LogFileModule.cs" />
<Compile Include="Logs\LogFileModule.cs" /> <Compile Include="Logs\LogFileModuleBase.cs" />
<Compile Include="Logs\LogFileModuleBase.cs" /> <Compile Include="Logs\LogFileResource.cs" />
<Compile Include="Logs\LogFileResource.cs" /> <Compile Include="Logs\LogModule.cs" />
<Compile Include="Logs\LogModule.cs" /> <Compile Include="Logs\LogResource.cs" />
<Compile Include="Logs\LogResource.cs" /> <Compile Include="Logs\UpdateLogFileModule.cs" />
<Compile Include="Logs\UpdateLogFileModule.cs" /> <Compile Include="MediaCovers\MediaCoverModule.cs" />
<Compile Include="MediaCovers\MediaCoverModule.cs" /> <Compile Include="Metadata\MetadataModule.cs" />
<Compile Include="Metadata\MetadataModule.cs" /> <Compile Include="Metadata\MetadataResource.cs" />
<Compile Include="Metadata\MetadataResource.cs" /> <Compile Include="NancyBootstrapper.cs" />
<Compile Include="NancyBootstrapper.cs" /> <Compile Include="Notifications\NotificationModule.cs" />
<Compile Include="Notifications\NotificationModule.cs" /> <Compile Include="Notifications\NotificationResource.cs" />
<Compile Include="Notifications\NotificationResource.cs" /> <Compile Include="NzbDroneApiModule.cs" />
<Compile Include="NzbDroneApiModule.cs" /> <Compile Include="NzbDroneFeedModule.cs" />
<Compile Include="NzbDroneFeedModule.cs" /> <Compile Include="NzbDroneRestModule.cs" />
<Compile Include="NzbDroneRestModule.cs" /> <Compile Include="NzbDroneRestModuleWithSignalR.cs" />
<Compile Include="NzbDroneRestModuleWithSignalR.cs" /> <Compile Include="PagingResource.cs" />
<Compile Include="PagingResource.cs" /> <Compile Include="Profiles\Languages\LanguageModule.cs" />
<Compile Include="Profiles\Languages\LanguageModule.cs" /> <Compile Include="Profiles\Languages\LanguageResource.cs" />
<Compile Include="Profiles\Languages\LanguageResource.cs" /> <Compile Include="Profiles\LegacyProfileModule.cs" />
<Compile Include="Profiles\LegacyProfileModule.cs" /> <Compile Include="Profiles\ProfileModule.cs" />
<Compile Include="Profiles\ProfileModule.cs" /> <Compile Include="Profiles\ProfileResource.cs" />
<Compile Include="Profiles\ProfileResource.cs" /> <Compile Include="Profiles\ProfileSchemaModule.cs" />
<Compile Include="Profiles\ProfileSchemaModule.cs" /> <Compile Include="Profiles\ProfileValidation.cs" />
<Compile Include="Profiles\ProfileValidation.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="ProviderModuleBase.cs" />
<Compile Include="ProviderModuleBase.cs" /> <Compile Include="ProviderResource.cs" />
<Compile Include="ProviderResource.cs" /> <Compile Include="Qualities\QualityDefinitionModule.cs" />
<Compile Include="Qualities\QualityDefinitionModule.cs" /> <Compile Include="Qualities\QualityDefinitionResource.cs" />
<Compile Include="Qualities\QualityDefinitionResource.cs" /> <Compile Include="Queue\QueueModule.cs" />
<Compile Include="Queue\QueueModule.cs" /> <Compile Include="Queue\QueueResource.cs" />
<Compile Include="Queue\QueueResource.cs" /> <Compile Include="ResourceChangeMessage.cs" />
<Compile Include="ResourceChangeMessage.cs" /> <Compile Include="Restrictions\RestrictionModule.cs" />
<Compile Include="Restrictions\RestrictionModule.cs" /> <Compile Include="Restrictions\RestrictionResource.cs" />
<Compile Include="Restrictions\RestrictionResource.cs" /> <Compile Include="REST\NotFoundException.cs" />
<Compile Include="REST\NotFoundException.cs" /> <Compile Include="REST\BadRequestException.cs" />
<Compile Include="REST\BadRequestException.cs" /> <Compile Include="REST\MethodNotAllowedException.cs" />
<Compile Include="REST\MethodNotAllowedException.cs" /> <Compile Include="REST\ResourceValidator.cs" />
<Compile Include="REST\ResourceValidator.cs" /> <Compile Include="REST\RestModule.cs" />
<Compile Include="REST\RestModule.cs" /> <Compile Include="REST\RestResource.cs" />
<Compile Include="REST\RestResource.cs" /> <Compile Include="RootFolders\RootFolderModule.cs" />
<Compile Include="RootFolders\RootFolderModule.cs" /> <Compile Include="RootFolders\RootFolderResource.cs" />
<Compile Include="RootFolders\RootFolderResource.cs" /> <Compile Include="Movies\AlternativeTitleResource.cs" />
<Compile Include="SeasonPass\SeasonPassResource.cs" /> <Compile Include="MovieFiles\MovieFileResource.cs" />
<Compile Include="Series\AlternativeTitleResource.cs" /> <Compile Include="Movies\FetchMovieListModule.cs" />
<Compile Include="Series\MovieFileResource.cs" /> <Compile Include="Movies\MovieLookupModule.cs" />
<Compile Include="Series\FetchMovieListModule.cs" /> <Compile Include="Series\SeriesModule.cs" />
<Compile Include="Series\SeasonResource.cs" /> <Compile Include="Movies\MovieResource.cs" />
<Compile Include="SeasonPass\SeasonPassModule.cs" /> <Compile Include="Series\SeriesResource.cs" />
<Compile Include="Series\SeriesEditorModule.cs" /> <Compile Include="System\Backup\BackupModule.cs" />
<Compile Include="Series\MovieLookupModule.cs" /> <Compile Include="System\Backup\BackupResource.cs" />
<Compile Include="Series\SeriesLookupModule.cs" /> <Compile Include="System\Tasks\TaskModule.cs" />
<Compile Include="Series\SeriesModule.cs" /> <Compile Include="System\Tasks\TaskResource.cs" />
<Compile Include="Series\MovieResource.cs" /> <Compile Include="System\SystemModule.cs" />
<Compile Include="Series\SeriesResource.cs" /> <Compile Include="Tags\TagModule.cs" />
<Compile Include="Series\SeasonStatisticsResource.cs" /> <Compile Include="Tags\TagResource.cs" />
<Compile Include="System\Backup\BackupModule.cs" /> <Compile Include="TinyIoCNancyBootstrapper.cs" />
<Compile Include="System\Backup\BackupResource.cs" /> <Compile Include="Update\UpdateModule.cs" />
<Compile Include="System\Tasks\TaskModule.cs" /> <Compile Include="Update\UpdateResource.cs" />
<Compile Include="System\Tasks\TaskResource.cs" /> <Compile Include="Validation\NetImportSyncIntervalValidator.cs" />
<Compile Include="System\SystemModule.cs" /> <Compile Include="Validation\RssSyncIntervalValidator.cs" />
<Compile Include="Tags\TagModule.cs" /> <Compile Include="Validation\EmptyCollectionValidator.cs" />
<Compile Include="Tags\TagResource.cs" /> <Compile Include="Validation\RuleBuilderExtensions.cs" />
<Compile Include="TinyIoCNancyBootstrapper.cs" /> <Compile Include="Wanted\LegacyMissingModule.cs" />
<Compile Include="Update\UpdateModule.cs" /> <Compile Include="Wanted\MovieCutoffModule.cs" />
<Compile Include="Update\UpdateResource.cs" /> <Compile Include="Wanted\MovieMissingModule.cs" />
<Compile Include="Validation\NetImportSyncIntervalValidator.cs" /> <Compile Include="Movies\MovieDiscoverModule.cs" />
<Compile Include="Validation\RssSyncIntervalValidator.cs" /> <Compile Include="NetImport\ImportExclusionsModule.cs" />
<Compile Include="Validation\EmptyCollectionValidator.cs" /> <Compile Include="NetImport\ImportExclusionsResource.cs" />
<Compile Include="Validation\RuleBuilderExtensions.cs" /> </ItemGroup>
<Compile Include="Wanted\CutoffModule.cs" /> <ItemGroup>
<Compile Include="Wanted\LegacyMissingModule.cs" /> <None Include="app.config" />
<Compile Include="Wanted\MissingModule.cs" /> <None Include="packages.config">
<Compile Include="Wanted\MovieCutoffModule.cs" /> <SubType>Designer</SubType>
<Compile Include="Wanted\MovieMissingModule.cs" /> </None>
<Compile Include="Series\MovieDiscoverModule.cs" /> </ItemGroup>
<Compile Include="NetImport\ImportExclusionsModule.cs" /> <ItemGroup>
<Compile Include="NetImport\ImportExclusionsResource.cs" /> <ProjectReference Include="..\Marr.Data\Marr.Data.csproj">
</ItemGroup> <Project>{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}</Project>
<ItemGroup> <Name>Marr.Data</Name>
<None Include="app.config" /> </ProjectReference>
<None Include="packages.config"> <ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj">
<SubType>Designer</SubType> <Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project>
</None> <Name>NzbDrone.Common</Name>
</ItemGroup> </ProjectReference>
<ItemGroup> <ProjectReference Include="..\NzbDrone.Core\NzbDrone.Core.csproj">
<ProjectReference Include="..\Marr.Data\Marr.Data.csproj"> <Project>{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}</Project>
<Project>{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}</Project> <Name>NzbDrone.Core</Name>
<Name>Marr.Data</Name> </ProjectReference>
</ProjectReference> <ProjectReference Include="..\NzbDrone.SignalR\NzbDrone.SignalR.csproj">
<ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj"> <Project>{7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}</Project>
<Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project> <Name>NzbDrone.SignalR</Name>
<Name>NzbDrone.Common</Name> </ProjectReference>
</ProjectReference> </ItemGroup>
<ProjectReference Include="..\NzbDrone.Core\NzbDrone.Core.csproj"> <ItemGroup />
<Project>{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}</Project> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Name>NzbDrone.Core</Name>
</ProjectReference>
<ProjectReference Include="..\NzbDrone.SignalR\NzbDrone.SignalR.csproj">
<Project>{7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}</Project>
<Name>NzbDrone.SignalR</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.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>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
+9 -11
View File
@@ -1,5 +1,4 @@
using NzbDrone.Api.Episodes; using NzbDrone.Api.Movies;
using NzbDrone.Api.Series;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
namespace NzbDrone.Api.Parse namespace NzbDrone.Api.Parse
@@ -18,23 +17,22 @@ namespace NzbDrone.Api.Parse
private ParseResource Parse() private ParseResource Parse()
{ {
var title = Request.Query.Title.Value as string; var title = Request.Query.Title.Value as string;
var parsedEpisodeInfo = Parser.ParseTitle(title); var parsedMovieInfo = Parser.ParseMovieTitle(title, false);
if (parsedEpisodeInfo == null) if (parsedMovieInfo == null)
{ {
return null; return null;
} }
var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0, 0); var remoteMovie = _parsingService.Map(parsedMovieInfo, "");
if (remoteEpisode != null) if (remoteMovie != null)
{ {
return new ParseResource return new ParseResource
{ {
Title = title, Title = title,
ParsedEpisodeInfo = remoteEpisode.ParsedEpisodeInfo, ParsedMovieInfo = remoteMovie.RemoteMovie.ParsedMovieInfo,
Series = remoteEpisode.Series.ToResource(), Movie = remoteMovie.Movie.ToResource()
Episodes = remoteEpisode.Episodes.ToResource()
}; };
} }
else else
@@ -42,9 +40,9 @@ namespace NzbDrone.Api.Parse
return new ParseResource return new ParseResource
{ {
Title = title, Title = title,
ParsedEpisodeInfo = parsedEpisodeInfo ParsedMovieInfo = parsedMovieInfo
}; };
} }
} }
} }
} }
+5 -7
View File
@@ -1,7 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using NzbDrone.Api.Episodes; using NzbDrone.Api.Movies;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Api.Series;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Api.Parse namespace NzbDrone.Api.Parse
@@ -9,8 +8,7 @@ namespace NzbDrone.Api.Parse
public class ParseResource : RestResource public class ParseResource : RestResource
{ {
public string Title { get; set; } public string Title { get; set; }
public ParsedEpisodeInfo ParsedEpisodeInfo { get; set; } public ParsedMovieInfo ParsedMovieInfo { get; set; }
public SeriesResource Series { get; set; } public MovieResource Movie { get; set; }
public List<EpisodeResource> Episodes { get; set; }
} }
} }
+2 -9
View File
@@ -1,10 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Api.Series; using NzbDrone.Api.Movies;
using NzbDrone.Api.Episodes;
using NzbDrone.Api.Movie;
using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.Download.TrackedDownloads;
using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers;
using System.Linq; using System.Linq;
@@ -13,8 +11,6 @@ namespace NzbDrone.Api.Queue
{ {
public class QueueResource : RestResource public class QueueResource : RestResource
{ {
public SeriesResource Series { get; set; }
public EpisodeResource Episode { get; set; }
public MovieResource Movie { get; set; } public MovieResource Movie { get; set; }
public QualityModel Quality { get; set; } public QualityModel Quality { get; set; }
public decimal Size { get; set; } public decimal Size { get; set; }
@@ -38,9 +34,6 @@ namespace NzbDrone.Api.Queue
return new QueueResource return new QueueResource
{ {
Id = model.Id, Id = model.Id,
Series = model.Series.ToResource(),
Episode = model.Episode.ToResource(),
Quality = model.Quality, Quality = model.Quality,
Size = model.Size, Size = model.Size,
Title = model.Title, Title = model.Title,
@@ -1,31 +0,0 @@
using Nancy;
using NzbDrone.Api.Extensions;
using NzbDrone.Core.Tv;
namespace NzbDrone.Api.SeasonPass
{
public class SeasonPassModule : NzbDroneApiModule
{
private readonly IEpisodeMonitoredService _episodeMonitoredService;
public SeasonPassModule(IEpisodeMonitoredService episodeMonitoredService)
: base("/seasonpass")
{
_episodeMonitoredService = episodeMonitoredService;
Post["/"] = series => UpdateAll();
}
private Response UpdateAll()
{
//Read from request
var request = Request.Body.FromJson<SeasonPassResource>();
foreach (var s in request.Series)
{
_episodeMonitoredService.SetEpisodeMonitoredStatus(s, request.MonitoringOptions);
}
return "ok".AsResponse(HttpStatusCode.Accepted);
}
}
}
@@ -1,11 +0,0 @@
using System.Collections.Generic;
using NzbDrone.Core.Tv;
namespace NzbDrone.Api.SeasonPass
{
public class SeasonPassResource
{
public List<Core.Tv.Series> Series { get; set; }
public MonitoringOptions MonitoringOptions { get; set; }
}
}
-298
View File
@@ -1,298 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using FluentValidation;
using NzbDrone.Common.Extensions;
using NzbDrone.Api.Extensions;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.MediaCover;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.MovieStats;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Tv.Events;
using NzbDrone.Core.Validation.Paths;
using NzbDrone.Core.DataAugmentation.Scene;
using NzbDrone.Core.Validation;
using NzbDrone.SignalR;
using NzbDrone.Core.Datastore;
using Microsoft.CSharp.RuntimeBinder;
using Nancy;
namespace NzbDrone.Api.Movie
{
public class MovieModule : NzbDroneRestModuleWithSignalR<MovieResource, Core.Tv.Movie>,
IHandle<EpisodeImportedEvent>,
IHandle<EpisodeFileDeletedEvent>,
IHandle<MovieUpdatedEvent>,
IHandle<MovieEditedEvent>,
IHandle<MovieDeletedEvent>,
IHandle<MovieRenamedEvent>,
IHandle<MediaCoversUpdatedEvent>
{
protected readonly IMovieService _moviesService;
private readonly IMovieStatisticsService _moviesStatisticsService;
private readonly IMapCoversToLocal _coverMapper;
private const string TITLE_SLUG_ROUTE = "/titleslug/(?<slug>[^/]+)";
public MovieModule(IBroadcastSignalRMessage signalRBroadcaster,
IMovieService moviesService,
IMovieStatisticsService moviesStatisticsService,
ISceneMappingService sceneMappingService,
IMapCoversToLocal coverMapper,
RootFolderValidator rootFolderValidator,
MoviePathValidator moviesPathValidator,
MovieExistsValidator moviesExistsValidator,
DroneFactoryValidator droneFactoryValidator,
MovieAncestorValidator moviesAncestorValidator,
ProfileExistsValidator profileExistsValidator
)
: base(signalRBroadcaster)
{
_moviesService = moviesService;
_moviesStatisticsService = moviesStatisticsService;
_coverMapper = coverMapper;
GetResourceAll = AllMovie;
GetResourcePaged = GetMoviePaged;
GetResourceById = GetMovie;
Get[TITLE_SLUG_ROUTE] = GetByTitleSlug; /*(options) => {
return ReqResExtensions.AsResponse(GetByTitleSlug(options.slug), Nancy.HttpStatusCode.OK);
};*/
CreateResource = AddMovie;
UpdateResource = UpdateMovie;
DeleteResource = DeleteMovie;
Validation.RuleBuilderExtensions.ValidId(SharedValidator.RuleFor(s => s.ProfileId));
SharedValidator.RuleFor(s => s.Path)
.Cascade(CascadeMode.StopOnFirstFailure)
.IsValidPath()
.SetValidator(rootFolderValidator)
.SetValidator(moviesPathValidator)
.SetValidator(droneFactoryValidator)
.SetValidator(moviesAncestorValidator)
.When(s => !s.Path.IsNullOrWhiteSpace());
SharedValidator.RuleFor(s => s.ProfileId).SetValidator(profileExistsValidator);
PostValidator.RuleFor(s => s.Path).IsValidPath().When(s => s.RootFolderPath.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.RootFolderPath).IsValidPath().When(s => s.Path.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.Title).NotEmpty();
PostValidator.RuleFor(s => s.TmdbId).NotNull().NotEmpty().SetValidator(moviesExistsValidator);
PutValidator.RuleFor(s => s.Path).IsValidPath();
}
public MovieModule(IBroadcastSignalRMessage signalRBroadcaster,
IMovieService moviesService,
IMovieStatisticsService moviesStatisticsService,
ISceneMappingService sceneMappingService,
IMapCoversToLocal coverMapper,
string resource)
: base(signalRBroadcaster, resource)
{
_moviesService = moviesService;
_moviesStatisticsService = moviesStatisticsService;
_coverMapper = coverMapper;
GetResourceAll = AllMovie;
GetResourceById = GetMovie;
CreateResource = AddMovie;
UpdateResource = UpdateMovie;
DeleteResource = DeleteMovie;
}
private MovieResource GetMovie(int id)
{
var movies = _moviesService.GetMovie(id);
return MapToResource(movies);
}
private PagingResource<MovieResource> GetMoviePaged(PagingResource<MovieResource> pagingResource)
{
var pagingSpec = pagingResource.MapToPagingSpec<MovieResource, Core.Tv.Movie>();
pagingSpec.FilterExpression = _moviesService.ConstructFilterExpression(pagingResource.FilterKey, pagingResource.FilterValue, pagingResource.FilterType);
return ApplyToPage(_moviesService.Paged, pagingSpec, MapToResource);
}
protected MovieResource MapToResource(Core.Tv.Movie movies)
{
if (movies == null) return null;
var resource = movies.ToResource();
MapCoversToLocal(resource);
//FetchAndLinkMovieStatistics(resource);
//PopulateAlternateTitles(resource);
return resource;
}
private List<MovieResource> AllMovie()
{
var moviesStats = _moviesStatisticsService.MovieStatistics();
var moviesResources = _moviesService.GetAllMovies().ToResource();
MapCoversToLocal(moviesResources.ToArray());
LinkMovieStatistics(moviesResources, moviesStats);
PopulateAlternateTitles(moviesResources);
return moviesResources;
}
private Response GetByTitleSlug(dynamic options)
{
var slug = "";
try
{
slug = options.slug;
// do stuff with x
}
catch (RuntimeBinderException)
{
return new NotFoundResponse();
}
try
{
return MapToResource(_moviesService.FindByTitleSlug(slug)).AsResponse(Nancy.HttpStatusCode.OK);
}
catch (ModelNotFoundException)
{
return new NotFoundResponse();
}
}
private int AddMovie(MovieResource moviesResource)
{
var model = moviesResource.ToModel();
return _moviesService.AddMovie(model).Id;
}
private void UpdateMovie(MovieResource moviesResource)
{
var model = moviesResource.ToModel(_moviesService.GetMovie(moviesResource.Id));
_moviesService.UpdateMovie(model);
BroadcastResourceChange(ModelAction.Updated, moviesResource);
}
private void DeleteMovie(int id)
{
var deleteFiles = false;
var addExclusion = false;
var deleteFilesQuery = Request.Query.deleteFiles;
var addExclusionQuery = Request.Query.addExclusion;
if (deleteFilesQuery.HasValue)
{
deleteFiles = Convert.ToBoolean(deleteFilesQuery.Value);
}
if (addExclusionQuery.HasValue)
{
addExclusion = Convert.ToBoolean(addExclusionQuery.Value);
}
_moviesService.DeleteMovie(id, deleteFiles, addExclusion);
}
private void MapCoversToLocal(params MovieResource[] movies)
{
foreach (var moviesResource in movies)
{
_coverMapper.ConvertToLocalUrls(moviesResource.Id, moviesResource.Images);
}
}
private void FetchAndLinkMovieStatistics(MovieResource resource)
{
LinkMovieStatistics(resource, _moviesStatisticsService.MovieStatistics(resource.Id));
}
private void LinkMovieStatistics(List<MovieResource> resources, List<MovieStatistics> moviesStatistics)
{
var dictMovieStats = moviesStatistics.ToDictionary(v => v.MovieId);
foreach (var movies in resources)
{
var stats = dictMovieStats.GetValueOrDefault(movies.Id);
if (stats == null) continue;
LinkMovieStatistics(movies, stats);
}
}
private void LinkMovieStatistics(MovieResource resource, MovieStatistics moviesStatistics)
{
//resource.SizeOnDisk = 0;//TODO: incorporate movie statistics moviesStatistics.SizeOnDisk;
}
private void PopulateAlternateTitles(List<MovieResource> resources)
{
foreach (var resource in resources)
{
PopulateAlternateTitles(resource);
}
}
private void PopulateAlternateTitles(MovieResource resource)
{
//var mappings = null;//_sceneMappingService.FindByTvdbId(resource.TvdbId);
//if (mappings == null) return;
//Not necessary anymore
//resource.AlternateTitles = mappings.Select(v => new AlternateTitleResource { Title = v.Title, SeasonNumber = v.SeasonNumber, SceneSeasonNumber = v.SceneSeasonNumber }).ToList();
}
public void Handle(EpisodeImportedEvent message)
{
//BroadcastResourceChange(ModelAction.Updated, message.ImportedEpisode.MovieId);
}
public void Handle(EpisodeFileDeletedEvent message)
{
if (message.Reason == DeleteMediaFileReason.Upgrade) return;
//BroadcastResourceChange(ModelAction.Updated, message.EpisodeFile.MovieId);
}
public void Handle(MovieUpdatedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
}
public void Handle(MovieEditedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
}
public void Handle(MovieDeletedEvent message)
{
BroadcastResourceChange(ModelAction.Deleted, message.Movie.ToResource());
}
public void Handle(MovieRenamedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
}
public void Handle(MediaCoversUpdatedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
}
}
}
-47
View File
@@ -1,47 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Core.Tv;
namespace NzbDrone.Api.Series
{
public class SeasonResource
{
public int SeasonNumber { get; set; }
public bool Monitored { get; set; }
public SeasonStatisticsResource Statistics { get; set; }
}
public static class SeasonResourceMapper
{
public static SeasonResource ToResource(this Season model)
{
if (model == null) return null;
return new SeasonResource
{
SeasonNumber = model.SeasonNumber,
Monitored = model.Monitored
};
}
public static Season ToModel(this SeasonResource resource)
{
if (resource == null) return null;
return new Season
{
SeasonNumber = resource.SeasonNumber,
Monitored = resource.Monitored
};
}
public static List<SeasonResource> ToResource(this IEnumerable<Season> models)
{
return models.Select(ToResource).ToList();
}
public static List<Season> ToModel(this IEnumerable<SeasonResource> resources)
{
return resources.Select(ToModel).ToList();
}
}
}
@@ -1,43 +0,0 @@
using System;
using NzbDrone.Core.SeriesStats;
namespace NzbDrone.Api.Series
{
public class SeasonStatisticsResource
{
public DateTime? NextAiring { get; set; }
public DateTime? PreviousAiring { get; set; }
public int EpisodeFileCount { get; set; }
public int EpisodeCount { get; set; }
public int TotalEpisodeCount { get; set; }
public long SizeOnDisk { get; set; }
public decimal PercentOfEpisodes
{
get
{
if (EpisodeCount == 0) return 0;
return (decimal)EpisodeFileCount / (decimal)EpisodeCount * 100;
}
}
}
public static class SeasonStatisticsResourceMapper
{
public static SeasonStatisticsResource ToResource(this SeasonStatistics model)
{
if (model == null) return null;
return new SeasonStatisticsResource
{
NextAiring = model.NextAiring,
PreviousAiring = model.PreviousAiring,
EpisodeFileCount = model.EpisodeFileCount,
EpisodeCount = model.EpisodeFileCount,
TotalEpisodeCount = model.TotalEpisodeCount,
SizeOnDisk = model.SizeOnDisk
};
}
}
}
@@ -1,31 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using Nancy;
using NzbDrone.Api.Extensions;
using NzbDrone.Core.Tv;
namespace NzbDrone.Api.Series
{
public class SeriesEditorModule : NzbDroneApiModule
{
private readonly ISeriesService _seriesService;
public SeriesEditorModule(ISeriesService seriesService)
: base("/series/editor")
{
_seriesService = seriesService;
Put["/"] = series => SaveAll();
}
private Response SaveAll()
{
var resources = Request.Body.FromJson<List<SeriesResource>>();
var series = resources.Select(seriesResource => seriesResource.ToModel(_seriesService.GetSeries(seriesResource.Id))).ToList();
return _seriesService.UpdateSeries(series)
.ToResource()
.AsResponse(HttpStatusCode.Accepted);
}
}
}
@@ -1,44 +0,0 @@
using System.Collections.Generic;
using Nancy;
using NzbDrone.Api.Extensions;
using NzbDrone.Core.MediaCover;
using NzbDrone.Core.MetadataSource;
using System.Linq;
namespace NzbDrone.Api.Series
{
public class SeriesLookupModule : NzbDroneRestModule<SeriesResource>
{
private readonly ISearchForNewSeries _searchProxy;
public SeriesLookupModule(ISearchForNewSeries searchProxy)
: base("/series/lookup")
{
_searchProxy = searchProxy;
Get["/"] = x => Search();
}
private Response Search()
{
var tvDbResults = _searchProxy.SearchForNewSeries((string)Request.Query.term);
return MapToResource(tvDbResults).AsResponse();
}
private static IEnumerable<SeriesResource> MapToResource(IEnumerable<Core.Tv.Series> series)
{
foreach (var currentSeries in series)
{
var resource = currentSeries.ToResource();
var poster = currentSeries.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
if (poster != null)
{
resource.RemotePoster = poster.Url;
}
yield return resource;
}
}
}
}
+10 -205
View File
@@ -1,242 +1,47 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using FluentValidation;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.MediaCover;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.SeriesStats;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Tv.Events;
using NzbDrone.Core.Validation.Paths;
using NzbDrone.Core.DataAugmentation.Scene;
using NzbDrone.Core.Validation;
using NzbDrone.SignalR; using NzbDrone.SignalR;
namespace NzbDrone.Api.Series namespace NzbDrone.Api.Series
{ {
public class SeriesModule : NzbDroneRestModuleWithSignalR<SeriesResource, Core.Tv.Series>, [Obsolete("SeriesModule is Obsolete, Remove with new UI")]
IHandle<EpisodeImportedEvent>, public class SeriesModule : NzbDroneRestModuleWithSignalR<SeriesResource, Core.Tv.Series>
IHandle<EpisodeFileDeletedEvent>,
IHandle<SeriesUpdatedEvent>,
IHandle<SeriesEditedEvent>,
IHandle<SeriesDeletedEvent>,
IHandle<SeriesRenamedEvent>,
IHandle<MediaCoversUpdatedEvent>
{ {
private readonly ISeriesService _seriesService; public SeriesModule(IBroadcastSignalRMessage signalRBroadcaster
private readonly ISeriesStatisticsService _seriesStatisticsService; )
private readonly ISceneMappingService _sceneMappingService;
private readonly IMapCoversToLocal _coverMapper;
public SeriesModule(IBroadcastSignalRMessage signalRBroadcaster,
ISeriesService seriesService,
ISeriesStatisticsService seriesStatisticsService,
ISceneMappingService sceneMappingService,
IMapCoversToLocal coverMapper,
RootFolderValidator rootFolderValidator,
SeriesPathValidator seriesPathValidator,
SeriesExistsValidator seriesExistsValidator,
DroneFactoryValidator droneFactoryValidator,
SeriesAncestorValidator seriesAncestorValidator,
ProfileExistsValidator profileExistsValidator
)
: base(signalRBroadcaster) : base(signalRBroadcaster)
{ {
_seriesService = seriesService;
_seriesStatisticsService = seriesStatisticsService;
_sceneMappingService = sceneMappingService;
_coverMapper = coverMapper;
GetResourceAll = AllSeries; GetResourceAll = AllSeries;
GetResourceById = GetSeries; GetResourceById = GetSeries;
CreateResource = AddSeries; CreateResource = AddSeries;
UpdateResource = UpdateSeries; UpdateResource = UpdateSeries;
DeleteResource = DeleteSeries; DeleteResource = DeleteSeries;
Validation.RuleBuilderExtensions.ValidId(SharedValidator.RuleFor(s => s.ProfileId));
SharedValidator.RuleFor(s => s.Path)
.Cascade(CascadeMode.StopOnFirstFailure)
.IsValidPath()
.SetValidator(rootFolderValidator)
.SetValidator(seriesPathValidator)
.SetValidator(droneFactoryValidator)
.SetValidator(seriesAncestorValidator)
.When(s => !s.Path.IsNullOrWhiteSpace());
SharedValidator.RuleFor(s => s.ProfileId).SetValidator(profileExistsValidator);
PostValidator.RuleFor(s => s.Path).IsValidPath().When(s => s.RootFolderPath.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.RootFolderPath).IsValidPath().When(s => s.Path.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.Title).NotEmpty();
PostValidator.RuleFor(s => s.TvdbId).GreaterThan(0).SetValidator(seriesExistsValidator);
PutValidator.RuleFor(s => s.Path).IsValidPath();
} }
private SeriesResource GetSeries(int id) private SeriesResource GetSeries(int id)
{ {
var series = _seriesService.GetSeries(id); return new SeriesResource();
return MapToResource(series);
}
private SeriesResource MapToResource(Core.Tv.Series series)
{
if (series == null) return null;
var resource = series.ToResource();
MapCoversToLocal(resource);
FetchAndLinkSeriesStatistics(resource);
PopulateAlternateTitles(resource);
return resource;
} }
private List<SeriesResource> AllSeries() private List<SeriesResource> AllSeries()
{ {
var seriesStats = _seriesStatisticsService.SeriesStatistics(); return new List<SeriesResource>();
var seriesResources = _seriesService.GetAllSeries().ToResource();
MapCoversToLocal(seriesResources.ToArray());
LinkSeriesStatistics(seriesResources, seriesStats);
PopulateAlternateTitles(seriesResources);
return seriesResources;
} }
private int AddSeries(SeriesResource seriesResource) private int AddSeries(SeriesResource seriesResource)
{ {
var model = seriesResource.ToModel(); return 0;
return _seriesService.AddSeries(model).Id;
} }
private void UpdateSeries(SeriesResource seriesResource) private void UpdateSeries(SeriesResource seriesResource)
{ {
var model = seriesResource.ToModel(_seriesService.GetSeries(seriesResource.Id)); throw new NotImplementedException();
_seriesService.UpdateSeries(model);
BroadcastResourceChange(ModelAction.Updated, seriesResource);
} }
private void DeleteSeries(int id) private void DeleteSeries(int id)
{ {
var deleteFiles = false; throw new NotImplementedException();
var deleteFilesQuery = Request.Query.deleteFiles;
if (deleteFilesQuery.HasValue)
{
deleteFiles = Convert.ToBoolean(deleteFilesQuery.Value);
}
_seriesService.DeleteSeries(id, deleteFiles);
}
private void MapCoversToLocal(params SeriesResource[] series)
{
foreach (var seriesResource in series)
{
_coverMapper.ConvertToLocalUrls(seriesResource.Id, seriesResource.Images);
}
}
private void FetchAndLinkSeriesStatistics(SeriesResource resource)
{
LinkSeriesStatistics(resource, _seriesStatisticsService.SeriesStatistics(resource.Id));
}
private void LinkSeriesStatistics(List<SeriesResource> resources, List<SeriesStatistics> seriesStatistics)
{
var dictSeriesStats = seriesStatistics.ToDictionary(v => v.SeriesId);
foreach (var series in resources)
{
var stats = dictSeriesStats.GetValueOrDefault(series.Id);
if (stats == null) continue;
LinkSeriesStatistics(series, stats);
}
}
private void LinkSeriesStatistics(SeriesResource resource, SeriesStatistics seriesStatistics)
{
resource.TotalEpisodeCount = seriesStatistics.TotalEpisodeCount;
resource.EpisodeCount = seriesStatistics.EpisodeCount;
resource.EpisodeFileCount = seriesStatistics.EpisodeFileCount;
resource.NextAiring = seriesStatistics.NextAiring;
resource.PreviousAiring = seriesStatistics.PreviousAiring;
resource.SizeOnDisk = seriesStatistics.SizeOnDisk;
if (seriesStatistics.SeasonStatistics != null)
{
var dictSeasonStats = seriesStatistics.SeasonStatistics.ToDictionary(v => v.SeasonNumber);
foreach (var season in resource.Seasons)
{
season.Statistics = SeasonStatisticsResourceMapper.ToResource(dictSeasonStats.GetValueOrDefault(season.SeasonNumber));
}
}
}
private void PopulateAlternateTitles(List<SeriesResource> resources)
{
foreach (var resource in resources)
{
PopulateAlternateTitles(resource);
}
}
private void PopulateAlternateTitles(SeriesResource resource)
{
var mappings = _sceneMappingService.FindByTvdbId(resource.TvdbId);
if (mappings == null) return;
//resource.AlternateTitles = mappings.Select(v => new AlternateTitleResource { Title = v.Title, SeasonNumber = v.SeasonNumber, SceneSeasonNumber = v.SceneSeasonNumber }).ToList();
}
public void Handle(EpisodeImportedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.ImportedEpisode.SeriesId);
}
public void Handle(EpisodeFileDeletedEvent message)
{
if (message.Reason == DeleteMediaFileReason.Upgrade) return;
BroadcastResourceChange(ModelAction.Updated, message.EpisodeFile.SeriesId);
}
public void Handle(SeriesUpdatedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Series.Id);
}
public void Handle(SeriesEditedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Series.Id);
}
public void Handle(SeriesDeletedEvent message)
{
BroadcastResourceChange(ModelAction.Deleted, message.Series.ToResource());
}
public void Handle(SeriesRenamedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Series.Id);
}
public void Handle(MediaCoversUpdatedEvent message)
{
//BroadcastResourceChange(ModelAction.Updated, message.Series.Id);
} }
} }
} }
+5 -218
View File
@@ -1,232 +1,19 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.MediaCover;
using NzbDrone.Core.Tv;
namespace NzbDrone.Api.Series namespace NzbDrone.Api.Series
{ {
[Obsolete("SeriesResource is Obsolete, Remove with new UI")]
public class SeriesResource : RestResource public class SeriesResource : RestResource
{ {
public SeriesResource() public SeriesResource()
{ {
Monitored = true; Title = "Series Endpoint Obsolete";
} }
//Todo: Sorters should be done completely on the client
//Todo: Is there an easy way to keep IgnoreArticlesWhenSorting in sync between, Series, History, Missing?
//Todo: We should get the entire Profile instead of ID and Name separately
//View Only //View Only
public string Title { get; set; } public string Title { get; set; }
//public List<AlternativeTitleResource> AlternateTitles { get; set; }
public string SortTitle { get; set; }
public int SeasonCount
{
get
{
if (Seasons == null) return 0;
return Seasons.Where(s => s.SeasonNumber > 0).Count();
}
}
public int? TotalEpisodeCount { get; set; }
public int? EpisodeCount { get; set; }
public int? EpisodeFileCount { get; set; }
public long? SizeOnDisk { get; set; }
public SeriesStatusType Status { get; set; }
public string Overview { get; set; }
public DateTime? NextAiring { get; set; }
public DateTime? PreviousAiring { get; set; }
public string Network { get; set; }
public string AirTime { get; set; }
public List<MediaCover> Images { get; set; }
public string RemotePoster { get; set; }
public List<SeasonResource> Seasons { get; set; }
public int Year { get; set; }
//View & Edit
public string Path { get; set; }
public int ProfileId { get; set; }
//Editing Only
public bool SeasonFolder { get; set; }
public bool Monitored { get; set; }
public bool UseSceneNumbering { get; set; }
public int Runtime { get; set; }
public int TvdbId { get; set; }
public int TvRageId { get; set; }
public int TvMazeId { get; set; }
public DateTime? FirstAired { get; set; }
public DateTime? LastInfoSync { get; set; }
public SeriesTypes SeriesType { get; set; }
public string CleanTitle { get; set; }
public string ImdbId { get; set; }
public string TitleSlug { get; set; }
public string RootFolderPath { get; set; }
public string Certification { get; set; }
public List<string> Genres { get; set; }
public HashSet<int> Tags { get; set; }
public DateTime Added { get; set; }
public AddSeriesOptions AddOptions { get; set; }
public Ratings Ratings { get; set; }
//TODO: Add series statistics as a property of the series (instead of individual properties)
//Used to support legacy consumers
public int QualityProfileId
{
get
{
return ProfileId;
}
set
{
if (value > 0 && ProfileId == 0)
{
ProfileId = value;
}
}
}
}
public static class SeriesResourceMapper
{
public static SeriesResource ToResource(this Core.Tv.Series model)
{
if (model == null) return null;
return new SeriesResource
{
Id = model.Id,
Title = model.Title,
//AlternateTitles
SortTitle = model.SortTitle,
//TotalEpisodeCount
//EpisodeCount
//EpisodeFileCount
//SizeOnDisk
Status = model.Status,
Overview = model.Overview,
//NextAiring
//PreviousAiring
Network = model.Network,
AirTime = model.AirTime,
Images = model.Images,
Seasons = model.Seasons.ToResource(),
Year = model.Year,
Path = model.Path,
ProfileId = model.ProfileId,
SeasonFolder = model.SeasonFolder,
Monitored = model.Monitored,
UseSceneNumbering = model.UseSceneNumbering,
Runtime = model.Runtime,
TvdbId = model.TvdbId,
TvRageId = model.TvRageId,
TvMazeId = model.TvMazeId,
FirstAired = model.FirstAired,
LastInfoSync = model.LastInfoSync,
SeriesType = model.SeriesType,
CleanTitle = model.CleanTitle,
ImdbId = model.ImdbId,
TitleSlug = model.TitleSlug,
RootFolderPath = model.RootFolderPath,
Certification = model.Certification,
Genres = model.Genres,
Tags = model.Tags,
Added = model.Added,
AddOptions = model.AddOptions,
Ratings = model.Ratings
};
}
public static Core.Tv.Series ToModel(this SeriesResource resource)
{
if (resource == null) return null;
return new Core.Tv.Series
{
Id = resource.Id,
Title = resource.Title,
//AlternateTitles
SortTitle = resource.SortTitle,
//TotalEpisodeCount
//EpisodeCount
//EpisodeFileCount
//SizeOnDisk
Status = resource.Status,
Overview = resource.Overview,
//NextAiring
//PreviousAiring
Network = resource.Network,
AirTime = resource.AirTime,
Images = resource.Images,
Seasons = resource.Seasons.ToModel(),
Year = resource.Year,
Path = resource.Path,
ProfileId = resource.ProfileId,
SeasonFolder = resource.SeasonFolder,
Monitored = resource.Monitored,
UseSceneNumbering = resource.UseSceneNumbering,
Runtime = resource.Runtime,
TvdbId = resource.TvdbId,
TvRageId = resource.TvRageId,
TvMazeId = resource.TvMazeId,
FirstAired = resource.FirstAired,
LastInfoSync = resource.LastInfoSync,
SeriesType = resource.SeriesType,
CleanTitle = resource.CleanTitle,
ImdbId = resource.ImdbId,
TitleSlug = resource.TitleSlug,
RootFolderPath = resource.RootFolderPath,
Certification = resource.Certification,
Genres = resource.Genres,
Tags = resource.Tags,
Added = resource.Added,
AddOptions = resource.AddOptions,
Ratings = resource.Ratings
};
}
public static Core.Tv.Series ToModel(this SeriesResource resource, Core.Tv.Series series)
{
series.TvdbId = resource.TvdbId;
series.Seasons = resource.Seasons.ToModel();
series.Path = resource.Path;
series.ProfileId = resource.ProfileId;
series.SeasonFolder = resource.SeasonFolder;
series.Monitored = resource.Monitored;
series.SeriesType = resource.SeriesType;
series.RootFolderPath = resource.RootFolderPath;
series.Tags = resource.Tags;
series.AddOptions = resource.AddOptions;
return series;
}
public static List<SeriesResource> ToResource(this IEnumerable<Core.Tv.Series> series)
{
return series.Select(ToResource).ToList();
}
} }
} }
@@ -21,9 +21,9 @@ namespace NzbDrone.Api.System.Backup
return backups.Select(b => new BackupResource return backups.Select(b => new BackupResource
{ {
Id = b.Path.GetHashCode(), Id = b.Name.GetHashCode(),
Name = Path.GetFileName(b.Path), Name = b.Name,
Path = b.Path, Path = $"/backup/{b.Type.ToString().ToLower()}/{b.Name}",
Type = b.Type, Type = b.Type,
Time = b.Time Time = b.Time
}).ToList(); }).ToList();
-42
View File
@@ -1,42 +0,0 @@
using NzbDrone.Api.Episodes;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Tv;
using NzbDrone.SignalR;
namespace NzbDrone.Api.Wanted
{
public class CutoffModule : EpisodeModuleWithSignalR
{
private readonly IEpisodeCutoffService _episodeCutoffService;
public CutoffModule(IEpisodeCutoffService episodeCutoffService,
IEpisodeService episodeService,
ISeriesService seriesService,
IQualityUpgradableSpecification qualityUpgradableSpecification,
IBroadcastSignalRMessage signalRBroadcaster)
: base(episodeService, seriesService, qualityUpgradableSpecification, signalRBroadcaster, "wanted/cutoff-old")
{
_episodeCutoffService = episodeCutoffService;
GetResourcePaged = GetCutoffUnmetEpisodes;
}
private PagingResource<EpisodeResource> GetCutoffUnmetEpisodes(PagingResource<EpisodeResource> pagingResource)
{
var pagingSpec = pagingResource.MapToPagingSpec<EpisodeResource, Episode>("airDateUtc", SortDirection.Descending);
if (pagingResource.FilterKey == "monitored" && pagingResource.FilterValue == "false")
{
pagingSpec.FilterExpression = v => v.Monitored == false || v.Series.Monitored == false;
}
else
{
pagingSpec.FilterExpression = v => v.Monitored == true && v.Series.Monitored == true;
}
var resource = ApplyToPage(_episodeCutoffService.EpisodesWhereCutoffUnmet, pagingSpec, v => MapToResource(v, true, true));
return resource;
}
}
}
-38
View File
@@ -1,38 +0,0 @@
using NzbDrone.Api.Episodes;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Tv;
using NzbDrone.SignalR;
namespace NzbDrone.Api.Wanted
{
public class MissingModule : EpisodeModuleWithSignalR
{
public MissingModule(IEpisodeService episodeService,
ISeriesService seriesService,
IQualityUpgradableSpecification qualityUpgradableSpecification,
IBroadcastSignalRMessage signalRBroadcaster)
: base(episodeService, seriesService, qualityUpgradableSpecification, signalRBroadcaster, "wanted/missing_episodes")
{
GetResourcePaged = GetMissingEpisodes;
}
private PagingResource<EpisodeResource> GetMissingEpisodes(PagingResource<EpisodeResource> pagingResource)
{
var pagingSpec = pagingResource.MapToPagingSpec<EpisodeResource, Episode>("airDateUtc", SortDirection.Descending);
if (pagingResource.FilterKey == "monitored" && pagingResource.FilterValue == "false")
{
pagingSpec.FilterExpression = v => v.Monitored == false || v.Series.Monitored == false;
}
else
{
pagingSpec.FilterExpression = v => v.Monitored == true && v.Series.Monitored == true;
}
var resource = ApplyToPage(_episodeService.EpisodesWithoutFiles, pagingSpec, v => MapToResource(v, true, false));
return resource;
}
}
}
+1 -2
View File
@@ -1,4 +1,3 @@
using NzbDrone.Api.Movie;
using NzbDrone.Api.Movies; using NzbDrone.Api.Movies;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
@@ -32,4 +31,4 @@ namespace NzbDrone.Api.Wanted
return resource; return resource;
} }
} }
} }
@@ -1,4 +1,3 @@
using NzbDrone.Api.Movie;
using NzbDrone.Api.Movies; using NzbDrone.Api.Movies;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
+9 -9
View File
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="FluentValidation" version="6.2.1.0" targetFramework="net40" /> <package id="FluentValidation" version="6.2.1.0" targetFramework="net40" />
<package id="Ical.Net" version="2.2.25" targetFramework="net40" /> <package id="Ical.Net" version="2.2.25" targetFramework="net40" />
<package id="Nancy" version="1.4.3" targetFramework="net40" /> <package id="Nancy" version="1.4.3" targetFramework="net40" />
<package id="Nancy.Authentication.Basic" version="1.4.1" targetFramework="net40" /> <package id="Nancy.Authentication.Basic" version="1.4.1" targetFramework="net40" />
<package id="Nancy.Authentication.Forms" version="1.4.1" targetFramework="net40" /> <package id="Nancy.Authentication.Forms" version="1.4.1" targetFramework="net40" />
<package id="Newtonsoft.Json" version="6.0.6" targetFramework="net40" /> <package id="Newtonsoft.Json" version="6.0.6" targetFramework="net40" />
<package id="NLog" version="4.3.11" targetFramework="net40" /> <package id="NLog" version="4.5.0-rc06" targetFramework="net40" />
</packages> </packages>
+118 -113
View File
@@ -1,126 +1,131 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion> <ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}</ProjectGuid> <ProjectGuid>{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NzbDrone.App.Test</RootNamespace> <RootNamespace>NzbDrone.App.Test</RootNamespace>
<AssemblyName>NzbDrone.App.Test</AssemblyName> <AssemblyName>NzbDrone.App.Test</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages> <RestorePackages>true</RestorePackages>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath> <OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<Optimize>false</Optimize> <Optimize>false</Optimize>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath> <OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="FizzWare.NBuilder, Version=4.0.0.115, Culture=neutral, PublicKeyToken=5651b03e12e42c12, processorArchitecture=MSIL"> <Reference Include="FizzWare.NBuilder, Version=4.0.0.115, Culture=neutral, PublicKeyToken=5651b03e12e42c12, processorArchitecture=MSIL">
<HintPath>..\packages\NBuilder.4.0.0\lib\net40\FizzWare.NBuilder.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, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="FluentAssertions.Core, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions.Core, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.Core.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.Core.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <Reference Include="Microsoft.CSharp" />
<HintPath>..\packages\NLog.4.3.11\lib\net40\NLog.dll</HintPath> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<Private>True</Private> <HintPath>..\packages\NLog.4.5.0-rc06\lib\net40-client\NLog.dll</HintPath>
</Reference> </Reference>
<Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL"> <Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll</HintPath> <HintPath>..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Configuration" />
<Reference Include="System.ServiceProcess" /> <Reference Include="System.Core" />
<Reference Include="System.Xml" /> <Reference Include="System.Data" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Runtime.Serialization" />
<Reference Include="Moq"> <Reference Include="System.ServiceModel" />
<HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath> <Reference Include="System.ServiceProcess" />
</Reference> <Reference Include="System.Transactions" />
</ItemGroup> <Reference Include="System.Xml" />
<ItemGroup> <Reference Include="System.Xml.Linq" />
<Compile Include="ContainerFixture.cs" /> <Reference Include="Moq">
<Compile Include="NzbDroneProcessServiceFixture.cs" /> <HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath>
<Compile Include="Properties\AssemblyInfo.cs" /> </Reference>
<Compile Include="RouterTest.cs" /> </ItemGroup>
</ItemGroup> <ItemGroup>
<ItemGroup> <Compile Include="ContainerFixture.cs" />
<None Include="..\NzbDrone.Test.Common\App.config"> <Compile Include="NzbDroneProcessServiceFixture.cs" />
<Link>App.config</Link> <Compile Include="Properties\AssemblyInfo.cs" />
</None> <Compile Include="RouterTest.cs" />
<None Include="packages.config" /> </ItemGroup>
</ItemGroup> <ItemGroup>
<ItemGroup> <None Include="..\NzbDrone.Test.Common\App.config">
<ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj"> <Link>App.config</Link>
<Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project> </None>
<Name>NzbDrone.Common</Name> <None Include="packages.config" />
</ProjectReference> </ItemGroup>
<ProjectReference Include="..\NzbDrone.Core\NzbDrone.Core.csproj"> <ItemGroup>
<Project>{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}</Project> <ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj">
<Name>NzbDrone.Core</Name> <Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project>
</ProjectReference> <Name>NzbDrone.Common</Name>
<ProjectReference Include="..\NzbDrone.Host\NzbDrone.Host.csproj"> </ProjectReference>
<Project>{95C11A9E-56ED-456A-8447-2C89C1139266}</Project> <ProjectReference Include="..\NzbDrone.Core\NzbDrone.Core.csproj">
<Name>NzbDrone.Host</Name> <Project>{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}</Project>
</ProjectReference> <Name>NzbDrone.Core</Name>
<ProjectReference Include="..\NzbDrone.Test.Common\NzbDrone.Test.Common.csproj"> </ProjectReference>
<Project>{CADDFCE0-7509-4430-8364-2074E1EEFCA2}</Project> <ProjectReference Include="..\NzbDrone.Host\NzbDrone.Host.csproj">
<Name>NzbDrone.Test.Common</Name> <Project>{95C11A9E-56ED-456A-8447-2C89C1139266}</Project>
</ProjectReference> <Name>NzbDrone.Host</Name>
</ItemGroup> </ProjectReference>
<ItemGroup> <ProjectReference Include="..\NzbDrone.Test.Common\NzbDrone.Test.Common.csproj">
<Content Include="..\Libraries\Sqlite\sqlite3.dll"> <Project>{CADDFCE0-7509-4430-8364-2074E1EEFCA2}</Project>
<Link>sqlite3.dll</Link> <Name>NzbDrone.Test.Common</Name>
<CopyToOutputDirectory>Always</CopyToOutputDirectory> </ProjectReference>
</Content> </ItemGroup>
</ItemGroup> <ItemGroup>
<ItemGroup> <Content Include="..\Libraries\Sqlite\sqlite3.dll">
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> <Link>sqlite3.dll</Link>
</ItemGroup> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </Content>
<PropertyGroup> </ItemGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent Condition="('$(OS)' == 'Windows_NT')"> <PostBuildEvent Condition="('$(OS)' == 'Windows_NT')">
xcopy /s /y "$(SolutionDir)\..\_output\NzbDrone.Mono.*" "$(TargetDir)" xcopy /s /y "$(SolutionDir)\..\_output\NzbDrone.Mono.*" "$(TargetDir)"
xcopy /s /y "$(SolutionDir)\..\_output\NzbDrone.Windows.*" "$(TargetDir)" xcopy /s /y "$(SolutionDir)\..\_output\NzbDrone.Windows.*" "$(TargetDir)"
</PostBuildEvent> </PostBuildEvent>
<PostBuildEvent Condition="('$(OS)' != 'Windows_NT')"> <PostBuildEvent Condition="('$(OS)' != 'Windows_NT')">
cp -rv $(SolutionDir)\..\_output\NzbDrone.Mono.* $(TargetDir) cp -rv $(SolutionDir)\..\_output\NzbDrone.Mono.* $(TargetDir)
cp -rv $(SolutionDir)\..\_output\NzbDrone.Windows.* $(TargetDir) cp -rv $(SolutionDir)\..\_output\NzbDrone.Windows.* $(TargetDir)
</PostBuildEvent> </PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<!-- 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>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
+7 -7
View File
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="FluentAssertions" version="4.18.0" targetFramework="net40" /> <package id="FluentAssertions" version="4.18.0" targetFramework="net40" />
<package id="Moq" version="4.0.10827" /> <package id="Moq" version="4.0.10827" />
<package id="NBuilder" version="4.0.0" targetFramework="net40" /> <package id="NBuilder" version="4.0.0" targetFramework="net40" />
<package id="NLog" version="4.3.11" targetFramework="net40" /> <package id="NLog" version="4.5.0-rc06" targetFramework="net40" />
<package id="NUnit" version="3.5.0" targetFramework="net40" /> <package id="NUnit" version="3.5.0" targetFramework="net40" />
</packages> </packages>
@@ -1,106 +1,109 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{CC26800D-F67E-464B-88DE-8EB1A0C227A3}</ProjectGuid> <ProjectGuid>{CC26800D-F67E-464B-88DE-8EB1A0C227A3}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NzbDrone.Automation.Test</RootNamespace> <RootNamespace>NzbDrone.Automation.Test</RootNamespace>
<AssemblyName>NzbDrone.Automation.Test</AssemblyName> <AssemblyName>NzbDrone.Automation.Test</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages> <RestorePackages>true</RestorePackages>
<ProductVersion>12.0.0</ProductVersion> <ProductVersion>12.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath> <OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<Optimize>false</Optimize> <Optimize>false</Optimize>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath> <OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="FluentAssertions, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="FluentAssertions.Core, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions.Core, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.Core.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.Core.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.3.11\lib\net40\NLog.dll</HintPath> <HintPath>..\packages\NLog.4.5.0-rc06\lib\net40-client\NLog.dll</HintPath>
<Private>True</Private> </Reference>
</Reference> <Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL"> <HintPath>..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll</HintPath>
<HintPath>..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll</HintPath> <Private>True</Private>
<Private>True</Private> </Reference>
</Reference> <Reference Include="System" />
<Reference Include="System" /> <Reference Include="System.Configuration" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.Xml" /> <Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.ServiceModel" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="System.Transactions" />
<Reference Include="WebDriver, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="System.Xml" />
<HintPath>..\packages\Selenium.WebDriver.3.0.1\lib\net40\WebDriver.dll</HintPath> <Reference Include="System.Xml.Linq" />
<Private>True</Private> <Reference Include="Microsoft.CSharp" />
</Reference> <Reference Include="WebDriver, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<Reference Include="WebDriver.Support, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL"> <HintPath>..\packages\Selenium.WebDriver.3.0.1\lib\net40\WebDriver.dll</HintPath>
<HintPath>..\packages\Selenium.Support.3.0.1\lib\net40\WebDriver.Support.dll</HintPath> <Private>True</Private>
<Private>True</Private> </Reference>
</Reference> <Reference Include="WebDriver.Support, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
</ItemGroup> <HintPath>..\packages\Selenium.Support.3.0.1\lib\net40\WebDriver.Support.dll</HintPath>
<ItemGroup> <Private>True</Private>
<Compile Include="AutomationTest.cs" /> </Reference>
<Compile Include="AutomationTestAttribute.cs" /> </ItemGroup>
<Compile Include="MainPagesTest.cs" /> <ItemGroup>
<Compile Include="PageModel\PageBase.cs" /> <Compile Include="AutomationTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="AutomationTestAttribute.cs" />
</ItemGroup> <Compile Include="MainPagesTest.cs" />
<ItemGroup> <Compile Include="PageModel\PageBase.cs" />
<ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj"> <Compile Include="Properties\AssemblyInfo.cs" />
<Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project> </ItemGroup>
<Name>NzbDrone.Common</Name> <ItemGroup>
</ProjectReference> <ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj">
<ProjectReference Include="..\NzbDrone.Test.Common\NzbDrone.Test.Common.csproj"> <Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project>
<Project>{CADDFCE0-7509-4430-8364-2074E1EEFCA2}</Project> <Name>NzbDrone.Common</Name>
<Name>NzbDrone.Test.Common</Name> </ProjectReference>
</ProjectReference> <ProjectReference Include="..\NzbDrone.Test.Common\NzbDrone.Test.Common.csproj">
</ItemGroup> <Project>{CADDFCE0-7509-4430-8364-2074E1EEFCA2}</Project>
<ItemGroup> <Name>NzbDrone.Test.Common</Name>
<None Include="app.config" /> </ProjectReference>
<None Include="packages.config" /> </ItemGroup>
</ItemGroup> <ItemGroup>
<ItemGroup> <None Include="app.config" />
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.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>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
+7 -7
View File
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="FluentAssertions" version="4.18.0" targetFramework="net40" /> <package id="FluentAssertions" version="4.18.0" targetFramework="net40" />
<package id="NLog" version="4.3.11" targetFramework="net40" /> <package id="NLog" version="4.5.0-rc06" targetFramework="net40" />
<package id="NUnit" version="3.5.0" targetFramework="net40" /> <package id="NUnit" version="3.5.0" targetFramework="net40" />
<package id="Selenium.Support" version="3.0.1" targetFramework="net40" /> <package id="Selenium.Support" version="3.0.1" targetFramework="net40" />
<package id="Selenium.WebDriver" version="3.0.1" targetFramework="net40" /> <package id="Selenium.WebDriver" version="3.0.1" targetFramework="net40" />
</packages> </packages>
@@ -54,7 +54,7 @@ namespace NzbDrone.Common.Test.Http
response.Content.Should().NotBeNullOrWhiteSpace(); response.Content.Should().NotBeNullOrWhiteSpace();
} }
[Test] [Test]
public void should_execute_https_get() public void should_execute_https_get()
{ {
@@ -132,7 +132,49 @@ namespace NzbDrone.Common.Test.Http
var request = new HttpRequest(string.Format("http://{0}/redirect/1", _httpBinHost)); var request = new HttpRequest(string.Format("http://{0}/redirect/1", _httpBinHost));
request.AllowAutoRedirect = true; request.AllowAutoRedirect = true;
Subject.Get(request); var response = Subject.Get(request);
response.StatusCode.Should().Be(HttpStatusCode.OK);
ExceptionVerification.ExpectedErrors(0);
}
[Test]
public void should_not_follow_redirects()
{
var request = new HttpRequest($"http://{_httpBinHost}/redirect/1");
request.AllowAutoRedirect = false;
var response = Subject.Get(request);
response.StatusCode.Should().Be(HttpStatusCode.Found);
ExceptionVerification.ExpectedErrors(1);
}
[Test]
public void should_follow_redirects_to_https()
{
var request = new HttpRequestBuilder($"http://{_httpBinHost}/redirect-to")
.AddQueryParam("url", $"https://sonarr.tv/")
.Build();
request.AllowAutoRedirect = true;
var response = Subject.Get(request);
response.StatusCode.Should().Be(HttpStatusCode.OK);
response.Content.Should().Contain("Sonarr");
ExceptionVerification.ExpectedErrors(0);
}
[Test]
public void should_throw_on_too_many_redirects()
{
var request = new HttpRequest($"http://{_httpBinHost}/redirect/4");
request.AllowAutoRedirect = true;
Assert.Throws<WebException>(() => Subject.Get(request));
ExceptionVerification.ExpectedErrors(0); ExceptionVerification.ExpectedErrors(0);
} }
@@ -400,4 +442,4 @@ namespace NzbDrone.Common.Test.Http
public string Url { get; set; } public string Url { get; set; }
public string Data { get; set; } public string Data { get; set; }
} }
} }
@@ -1,161 +1,164 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion> <ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}</ProjectGuid> <ProjectGuid>{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NzbDrone.Common.Test</RootNamespace> <RootNamespace>NzbDrone.Common.Test</RootNamespace>
<AssemblyName>NzbDrone.Common.Test</AssemblyName> <AssemblyName>NzbDrone.Common.Test</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages> <RestorePackages>true</RestorePackages>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath> <OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<Optimize>false</Optimize> <Optimize>false</Optimize>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath> <OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="FluentAssertions, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="FluentAssertions.Core, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions.Core, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.Core.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.Core.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.3.11\lib\net40\NLog.dll</HintPath> <HintPath>..\packages\NLog.4.5.0-rc06\lib\net40-client\NLog.dll</HintPath>
<Private>True</Private> </Reference>
</Reference> <Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL"> <HintPath>..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll</HintPath>
<HintPath>..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll</HintPath> <Private>True</Private>
<Private>True</Private> </Reference>
</Reference> <Reference Include="System" />
<Reference Include="System" /> <Reference Include="System.Configuration" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.ServiceProcess" /> <Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Xml" /> <Reference Include="System.ServiceModel" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.ServiceProcess" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="System.Transactions" />
<Reference Include="Moq"> <Reference Include="System.Xml" />
<HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath> <Reference Include="System.Xml.Linq" />
</Reference> <Reference Include="Microsoft.CSharp" />
</ItemGroup> <Reference Include="Moq">
<ItemGroup> <HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath>
<Compile Include="CacheTests\CachedDictionaryFixture.cs" /> </Reference>
<Compile Include="CacheTests\CachedFixture.cs" /> </ItemGroup>
<Compile Include="CacheTests\CachedManagerFixture.cs" /> <ItemGroup>
<Compile Include="ConfigFileProviderTest.cs" /> <Compile Include="CacheTests\CachedDictionaryFixture.cs" />
<Compile Include="DiskTests\DirectoryLookupServiceFixture.cs" /> <Compile Include="CacheTests\CachedFixture.cs" />
<Compile Include="DiskTests\DiskProviderFixtureBase.cs" /> <Compile Include="CacheTests\CachedManagerFixture.cs" />
<Compile Include="DiskTests\FreeSpaceFixtureBase.cs" /> <Compile Include="ConfigFileProviderTest.cs" />
<Compile Include="DiskTests\IsParentFixtureBase.cs" /> <Compile Include="DiskTests\DirectoryLookupServiceFixture.cs" />
<Compile Include="DiskTests\DiskTransferServiceFixture.cs" /> <Compile Include="DiskTests\DiskProviderFixtureBase.cs" />
<Compile Include="EnsureTest\PathExtensionFixture.cs" /> <Compile Include="DiskTests\FreeSpaceFixtureBase.cs" />
<Compile Include="EnvironmentProviderTest.cs" /> <Compile Include="DiskTests\IsParentFixtureBase.cs" />
<Compile Include="EnvironmentTests\EnvironmentProviderTest.cs" /> <Compile Include="DiskTests\DiskTransferServiceFixture.cs" />
<Compile Include="EnvironmentTests\StartupArgumentsFixture.cs" /> <Compile Include="EnsureTest\PathExtensionFixture.cs" />
<Compile Include="ExtensionTests\FromOctalStringFixture.cs" /> <Compile Include="EnvironmentProviderTest.cs" />
<Compile Include="ExtensionTests\IEnumerableExtensionTests\ExceptByFixture.cs" /> <Compile Include="EnvironmentTests\EnvironmentProviderTest.cs" />
<Compile Include="ExtensionTests\IEnumerableExtensionTests\IntersectByFixture.cs" /> <Compile Include="EnvironmentTests\StartupArgumentsFixture.cs" />
<Compile Include="ExtensionTests\Int64ExtensionFixture.cs" /> <Compile Include="ExtensionTests\FromOctalStringFixture.cs" />
<Compile Include="Http\HttpClientFixture.cs" /> <Compile Include="ExtensionTests\IEnumerableExtensionTests\ExceptByFixture.cs" />
<Compile Include="Http\HttpHeaderFixture.cs" /> <Compile Include="ExtensionTests\IEnumerableExtensionTests\IntersectByFixture.cs" />
<Compile Include="Http\HttpRequestBuilderFixture.cs" /> <Compile Include="ExtensionTests\Int64ExtensionFixture.cs" />
<Compile Include="Http\HttpRequestFixture.cs" /> <Compile Include="Http\HttpClientFixture.cs" />
<Compile Include="Http\HttpUriFixture.cs" /> <Compile Include="Http\HttpHeaderFixture.cs" />
<Compile Include="InstrumentationTests\CleanseLogMessageFixture.cs" /> <Compile Include="Http\HttpRequestBuilderFixture.cs" />
<Compile Include="LevenshteinDistanceFixture.cs" /> <Compile Include="Http\HttpRequestFixture.cs" />
<Compile Include="OsPathFixture.cs" /> <Compile Include="Http\HttpUriFixture.cs" />
<Compile Include="PathExtensionFixture.cs" /> <Compile Include="InstrumentationTests\CleanseLogMessageFixture.cs" />
<Compile Include="ProcessProviderTests.cs" /> <Compile Include="LevenshteinDistanceFixture.cs" />
<Compile Include="ReflectionExtensions.cs" /> <Compile Include="OsPathFixture.cs" />
<Compile Include="ReflectionTests\ReflectionExtensionFixture.cs" /> <Compile Include="PathExtensionFixture.cs" />
<Compile Include="ServiceFactoryFixture.cs" /> <Compile Include="ProcessProviderTests.cs" />
<Compile Include="ServiceProviderTests.cs" /> <Compile Include="ReflectionExtensions.cs" />
<Compile Include="TPLTests\DebouncerFixture.cs" /> <Compile Include="ReflectionTests\ReflectionExtensionFixture.cs" />
<Compile Include="TPLTests\RateLimitServiceFixture.cs" /> <Compile Include="ServiceFactoryFixture.cs" />
<Compile Include="WebClientTests.cs" /> <Compile Include="ServiceProviderTests.cs" />
</ItemGroup> <Compile Include="TPLTests\DebouncerFixture.cs" />
<ItemGroup> <Compile Include="TPLTests\RateLimitServiceFixture.cs" />
<None Include="..\NzbDrone.Test.Common\App.config"> <Compile Include="WebClientTests.cs" />
<Link>App.config</Link> </ItemGroup>
</None> <ItemGroup>
<None Include="packages.config" /> <None Include="..\NzbDrone.Test.Common\App.config">
</ItemGroup> <Link>App.config</Link>
<ItemGroup> </None>
<ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj"> <None Include="packages.config" />
<Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project> </ItemGroup>
<Name>NzbDrone.Common</Name> <ItemGroup>
</ProjectReference> <ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj">
<ProjectReference Include="..\NzbDrone.Core\NzbDrone.Core.csproj"> <Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project>
<Project>{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}</Project> <Name>NzbDrone.Common</Name>
<Name>NzbDrone.Core</Name> </ProjectReference>
</ProjectReference> <ProjectReference Include="..\NzbDrone.Core\NzbDrone.Core.csproj">
<ProjectReference Include="..\NzbDrone.Host\NzbDrone.Host.csproj"> <Project>{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}</Project>
<Project>{95C11A9E-56ED-456A-8447-2C89C1139266}</Project> <Name>NzbDrone.Core</Name>
<Name>NzbDrone.Host</Name> </ProjectReference>
</ProjectReference> <ProjectReference Include="..\NzbDrone.Host\NzbDrone.Host.csproj">
<ProjectReference Include="..\NzbDrone.Mono\NzbDrone.Mono.csproj"> <Project>{95C11A9E-56ED-456A-8447-2C89C1139266}</Project>
<Project>{15ad7579-a314-4626-b556-663f51d97cd1}</Project> <Name>NzbDrone.Host</Name>
<Name>NzbDrone.Mono</Name> </ProjectReference>
</ProjectReference> <ProjectReference Include="..\NzbDrone.Mono\NzbDrone.Mono.csproj">
<ProjectReference Include="..\NzbDrone.Windows\NzbDrone.Windows.csproj"> <Project>{15ad7579-a314-4626-b556-663f51d97cd1}</Project>
<Project>{911284d3-f130-459e-836c-2430b6fbf21d}</Project> <Name>NzbDrone.Mono</Name>
<Name>NzbDrone.Windows</Name> </ProjectReference>
</ProjectReference> <ProjectReference Include="..\NzbDrone.Windows\NzbDrone.Windows.csproj">
<ProjectReference Include="..\NzbDrone\NzbDrone.csproj"> <Project>{911284d3-f130-459e-836c-2430b6fbf21d}</Project>
<Project>{D12F7F2F-8A3C-415F-88FA-6DD061A84869}</Project> <Name>NzbDrone.Windows</Name>
<Name>NzbDrone</Name> </ProjectReference>
</ProjectReference> <ProjectReference Include="..\NzbDrone\NzbDrone.csproj">
<ProjectReference Include="..\NzbDrone.Test.Common\NzbDrone.Test.Common.csproj"> <Project>{D12F7F2F-8A3C-415F-88FA-6DD061A84869}</Project>
<Project>{CADDFCE0-7509-4430-8364-2074E1EEFCA2}</Project> <Name>NzbDrone</Name>
<Name>NzbDrone.Test.Common</Name> </ProjectReference>
</ProjectReference> <ProjectReference Include="..\NzbDrone.Test.Common\NzbDrone.Test.Common.csproj">
<ProjectReference Include="..\NzbDrone.Test.Dummy\NzbDrone.Test.Dummy.csproj"> <Project>{CADDFCE0-7509-4430-8364-2074E1EEFCA2}</Project>
<Project>{FAFB5948-A222-4CF6-AD14-026BE7564802}</Project> <Name>NzbDrone.Test.Common</Name>
<Name>NzbDrone.Test.Dummy</Name> </ProjectReference>
</ProjectReference> <ProjectReference Include="..\NzbDrone.Test.Dummy\NzbDrone.Test.Dummy.csproj">
</ItemGroup> <Project>{FAFB5948-A222-4CF6-AD14-026BE7564802}</Project>
<ItemGroup> <Name>NzbDrone.Test.Dummy</Name>
<Folder Include="Properties\" /> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> <Folder Include="Properties\" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ItemGroup>
<PropertyGroup> <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
<PostBuildEvent Condition="'$(Configuration)|$(OS)' == 'Debug|Windows_NT'">xcopy /s /y "$(SolutionDir)\ExternalModules\CurlSharp\libs\i386\*" "$(TargetDir)"</PostBuildEvent> </ItemGroup>
</PropertyGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent Condition="'$(Configuration)|$(OS)' == 'Debug|Windows_NT'">xcopy /s /y "$(SolutionDir)\ExternalModules\CurlSharp\libs\i386\*" "$(TargetDir)"</PostBuildEvent>
</PropertyGroup>
<!-- 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>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
+6 -6
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="FluentAssertions" version="4.18.0" targetFramework="net40" /> <package id="FluentAssertions" version="4.18.0" targetFramework="net40" />
<package id="Moq" version="4.0.10827" /> <package id="Moq" version="4.0.10827" />
<package id="NLog" version="4.3.11" targetFramework="net40" /> <package id="NLog" version="4.5.0-rc06" targetFramework="net40" />
<package id="NUnit" version="3.5.0" targetFramework="net40" /> <package id="NUnit" version="3.5.0" targetFramework="net40" />
</packages> </packages>
@@ -294,12 +294,22 @@ namespace NzbDrone.Common.Disk
{ {
Ensure.That(path, () => path).IsValidPath(); Ensure.That(path, () => path).IsValidPath();
if (dateTime.Before(DateTimeExtensions.Epoch))
{
dateTime = DateTimeExtensions.Epoch;
}
Directory.SetLastWriteTimeUtc(path, dateTime); Directory.SetLastWriteTimeUtc(path, dateTime);
} }
public void FileSetLastWriteTime(string path, DateTime dateTime) public void FileSetLastWriteTime(string path, DateTime dateTime)
{ {
Ensure.That(path, () => path).IsValidPath(); Ensure.That(path, () => path).IsValidPath();
if (dateTime.Before(DateTimeExtensions.Epoch))
{
dateTime = DateTimeExtensions.Epoch;
}
File.SetLastWriteTime(path, dateTime); File.SetLastWriteTime(path, dateTime);
} }
@@ -38,5 +38,7 @@ namespace NzbDrone.Common.Extensions
{ {
return dateTime >= afterDateTime && dateTime <= beforeDateTime; return dateTime >= afterDateTime && dateTime <= beforeDateTime;
} }
public static DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
} }
} }
@@ -104,8 +104,8 @@ namespace NzbDrone.Common.Http.Dispatchers
default: default:
throw new NotSupportedException(string.Format("HttpCurl method {0} not supported", request.Method)); throw new NotSupportedException(string.Format("HttpCurl method {0} not supported", request.Method));
} }
curlEasy.FollowLocation = false;
curlEasy.UserAgent = request.UseSimplifiedUserAgent ? UserAgentBuilder.UserAgentSimplified : UserAgentBuilder.UserAgent; ; curlEasy.UserAgent = request.UseSimplifiedUserAgent ? UserAgentBuilder.UserAgentSimplified : UserAgentBuilder.UserAgent; ;
curlEasy.FollowLocation = request.AllowAutoRedirect;
if (request.RequestTimeout != TimeSpan.Zero) if (request.RequestTimeout != TimeSpan.Zero)
{ {
@@ -30,7 +30,7 @@ namespace NzbDrone.Common.Http.Dispatchers
webRequest.Method = request.Method.ToString(); webRequest.Method = request.Method.ToString();
webRequest.UserAgent = request.UseSimplifiedUserAgent ? UserAgentBuilder.UserAgentSimplified : UserAgentBuilder.UserAgent; webRequest.UserAgent = request.UseSimplifiedUserAgent ? UserAgentBuilder.UserAgentSimplified : UserAgentBuilder.UserAgent;
webRequest.KeepAlive = request.ConnectionKeepAlive; webRequest.KeepAlive = request.ConnectionKeepAlive;
webRequest.AllowAutoRedirect = request.AllowAutoRedirect; webRequest.AllowAutoRedirect = false;
webRequest.CookieContainer = cookies; webRequest.CookieContainer = cookies;
if (request.RequestTimeout != TimeSpan.Zero) if (request.RequestTimeout != TimeSpan.Zero)
+50 -23
View File
@@ -7,6 +7,7 @@ using System.Net;
using NLog; using NLog;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http.Dispatchers; using NzbDrone.Common.Http.Dispatchers;
using NzbDrone.Common.TPL; using NzbDrone.Common.TPL;
@@ -43,6 +44,54 @@ namespace NzbDrone.Common.Http
} }
public HttpResponse Execute(HttpRequest request) public HttpResponse Execute(HttpRequest request)
{
var response = ExecuteRequest(request);
if (request.AllowAutoRedirect && response.HasHttpRedirect)
{
var autoRedirectChain = new List<string>();
autoRedirectChain.Add(request.Url.ToString());
do
{
request.Url += new HttpUri(response.Headers.GetSingleValue("Location"));
autoRedirectChain.Add(request.Url.ToString());
_logger.Trace("Redirected to {0}", request.Url);
if (autoRedirectChain.Count > 3)
{
throw new WebException($"Too many automatic redirections were attempted for {string.Join(" -> ", autoRedirectChain)}", WebExceptionStatus.ProtocolError);
}
response = ExecuteRequest(request);
}
while (response.HasHttpRedirect);
}
if (response.HasHttpRedirect && !RuntimeInfoBase.IsProduction)
{
_logger.Error("Server requested a redirect to [{0}] while in developer mode. Update the request URL to avoid this redirect.", response.Headers["Location"]);
}
if (!request.SuppressHttpError && response.HasHttpError)
{
_logger.Warn("HTTP Error - {0}", response);
if ((int)response.StatusCode == 429)
{
throw new TooManyRequestsException(request, response);
}
else
{
throw new HttpException(request, response);
}
}
return response;
}
private HttpResponse ExecuteRequest(HttpRequest request)
{ {
foreach (var interceptor in _requestInterceptors) foreach (var interceptor in _requestInterceptors)
{ {
@@ -78,28 +127,6 @@ namespace NzbDrone.Common.Http
_logger.Trace("Response content ({0} bytes): {1}", response.ResponseData.Length, response.Content); _logger.Trace("Response content ({0} bytes): {1}", response.ResponseData.Length, response.Content);
} }
if (!RuntimeInfoBase.IsProduction &&
(response.StatusCode == HttpStatusCode.Moved ||
response.StatusCode == HttpStatusCode.MovedPermanently ||
response.StatusCode == HttpStatusCode.Found))
{
_logger.Error("Server requested a redirect to [" + response.Headers["Location"] + "]. Update the request URL to avoid this redirect.");
}
if (!request.SuppressHttpError && response.HasHttpError)
{
_logger.Warn("HTTP Error - {0}", response);
if ((int)response.StatusCode == 429)
{
throw new TooManyRequestsException(request, response);
}
else
{
throw new HttpException(request, response);
}
}
return response; return response;
} }
@@ -210,4 +237,4 @@ namespace NzbDrone.Common.Http
return new HttpResponse<T>(response); return new HttpResponse<T>(response);
} }
} }
} }
+6 -2
View File
@@ -35,7 +35,7 @@ namespace NzbDrone.Common.Http
private string _content; private string _content;
public string Content public string Content
{ {
get get
{ {
@@ -51,6 +51,10 @@ namespace NzbDrone.Common.Http
public bool HasHttpError => (int)StatusCode >= 400; public bool HasHttpError => (int)StatusCode >= 400;
public bool HasHttpRedirect => StatusCode == HttpStatusCode.Moved ||
StatusCode == HttpStatusCode.MovedPermanently ||
StatusCode == HttpStatusCode.Found;
public Dictionary<string, string> GetCookies() public Dictionary<string, string> GetCookies()
{ {
var result = new Dictionary<string, string>(); var result = new Dictionary<string, string>();
@@ -95,4 +99,4 @@ namespace NzbDrone.Common.Http
public T Resource { get; private set; } public T Resource { get; private set; }
} }
} }
+258 -256
View File
@@ -1,262 +1,264 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion> <ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</ProjectGuid> <ProjectGuid>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NzbDrone.Common</RootNamespace> <RootNamespace>NzbDrone.Common</RootNamespace>
<AssemblyName>NzbDrone.Common</AssemblyName> <AssemblyName>NzbDrone.Common</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages> <RestorePackages>true</RestorePackages>
<TargetFrameworkProfile> <TargetFrameworkProfile>
</TargetFrameworkProfile> </TargetFrameworkProfile>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>..\..\_output\</OutputPath> <OutputPath>..\..\_output\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<Optimize>false</Optimize> <Optimize>false</Optimize>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>..\..\_output\</OutputPath> <OutputPath>..\..\_output\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<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=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\net40\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\net40\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.3.11\lib\net40\NLog.dll</HintPath> <HintPath>..\packages\NLog.4.5.0-rc06\lib\net40-client\NLog.dll</HintPath>
<Private>True</Private> </Reference>
</Reference> <Reference Include="Org.Mentalis, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<Reference Include="Org.Mentalis, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <HintPath>..\packages\DotNet4.SocksProxy.1.3.2.0\lib\net40\Org.Mentalis.dll</HintPath>
<HintPath>..\packages\DotNet4.SocksProxy.1.3.2.0\lib\net40\Org.Mentalis.dll</HintPath> <Private>True</Private>
<Private>True</Private> </Reference>
</Reference> <Reference Include="SocksWebProxy, Version=1.3.2.0, Culture=neutral, processorArchitecture=MSIL">
<Reference Include="SocksWebProxy, Version=1.3.2.0, Culture=neutral, processorArchitecture=MSIL"> <HintPath>..\packages\DotNet4.SocksProxy.1.3.2.0\lib\net40\SocksWebProxy.dll</HintPath>
<HintPath>..\packages\DotNet4.SocksProxy.1.3.2.0\lib\net40\SocksWebProxy.dll</HintPath> <Private>True</Private>
<Private>True</Private> </Reference>
</Reference> <Reference Include="System" />
<Reference Include="System" /> <Reference Include="System.Configuration" />
<Reference Include="System.Configuration" /> <Reference Include="System.Configuration.Install" />
<Reference Include="System.Configuration.Install" /> <Reference Include="System.Core" />
<Reference Include="System.Core" /> <Reference Include="System.Data" />
<Reference Include="System.Data" /> <Reference Include="System.Drawing" />
<Reference Include="System.Drawing" /> <Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceProcess" /> <Reference Include="System.ServiceModel" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="System.ServiceProcess" />
<Reference Include="ICSharpCode.SharpZipLib"> <Reference Include="Microsoft.CSharp" />
<HintPath>..\packages\ICSharpCode.SharpZipLib.Patched.0.86.5\lib\net20\ICSharpCode.SharpZipLib.dll</HintPath> <Reference Include="ICSharpCode.SharpZipLib">
</Reference> <HintPath>..\packages\ICSharpCode.SharpZipLib.Patched.0.86.5\lib\net20\ICSharpCode.SharpZipLib.dll</HintPath>
<Reference Include="System.Xml" /> </Reference>
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Transactions" />
</ItemGroup> <Reference Include="System.Xml" />
<ItemGroup> <Reference Include="System.Xml.Linq" />
<Compile Include="ArchiveService.cs" /> </ItemGroup>
<Compile Include="Cache\Cached.cs" /> <ItemGroup>
<Compile Include="Cache\CacheManager.cs" /> <Compile Include="ArchiveService.cs" />
<Compile Include="Cache\CachedDictionary.cs" /> <Compile Include="Cache\Cached.cs" />
<Compile Include="Cache\ICached.cs" /> <Compile Include="Cache\CacheManager.cs" />
<Compile Include="Cache\ICachedDictionary.cs" /> <Compile Include="Cache\CachedDictionary.cs" />
<Compile Include="Cloud\SonarrCloudRequestBuilder.cs" /> <Compile Include="Cache\ICached.cs" />
<Compile Include="Composition\Container.cs" /> <Compile Include="Cache\ICachedDictionary.cs" />
<Compile Include="Composition\ContainerBuilderBase.cs" /> <Compile Include="Cloud\SonarrCloudRequestBuilder.cs" />
<Compile Include="Composition\IContainer.cs" /> <Compile Include="Composition\Container.cs" />
<Compile Include="ConsoleService.cs" /> <Compile Include="Composition\ContainerBuilderBase.cs" />
<Compile Include="ConvertBase32.cs" /> <Compile Include="Composition\IContainer.cs" />
<Compile Include="Crypto\HashProvider.cs" /> <Compile Include="ConsoleService.cs" />
<Compile Include="Disk\FileSystemLookupService.cs" /> <Compile Include="ConvertBase32.cs" />
<Compile Include="Disk\DriveInfoMount.cs" /> <Compile Include="Crypto\HashProvider.cs" />
<Compile Include="Disk\IMount.cs" /> <Compile Include="Disk\FileSystemLookupService.cs" />
<Compile Include="Disk\RelativeFileSystemModel.cs" /> <Compile Include="Disk\DriveInfoMount.cs" />
<Compile Include="Disk\FileSystemModel.cs" /> <Compile Include="Disk\IMount.cs" />
<Compile Include="Disk\FileSystemResult.cs" /> <Compile Include="Disk\RelativeFileSystemModel.cs" />
<Compile Include="Extensions\DictionaryExtensions.cs" /> <Compile Include="Disk\FileSystemModel.cs" />
<Compile Include="Disk\GdiPlusInterop.cs" /> <Compile Include="Disk\FileSystemResult.cs" />
<Compile Include="Disk\OsPath.cs" /> <Compile Include="Extensions\DictionaryExtensions.cs" />
<Compile Include="Disk\DiskProviderBase.cs" /> <Compile Include="Disk\GdiPlusInterop.cs" />
<Compile Include="Disk\IDiskProvider.cs" /> <Compile Include="Disk\OsPath.cs" />
<Compile Include="Disk\DiskTransferService.cs" /> <Compile Include="Disk\DiskProviderBase.cs" />
<Compile Include="Disk\TransferMode.cs" /> <Compile Include="Disk\IDiskProvider.cs" />
<Compile Include="EnsureThat\Ensure.cs" /> <Compile Include="Disk\DiskTransferService.cs" />
<Compile Include="EnsureThat\EnsureBoolExtensions.cs" /> <Compile Include="Disk\TransferMode.cs" />
<Compile Include="EnsureThat\EnsureCollectionExtensions.cs" /> <Compile Include="EnsureThat\Ensure.cs" />
<Compile Include="EnsureThat\EnsureDateTimeExtensions.cs" /> <Compile Include="EnsureThat\EnsureBoolExtensions.cs" />
<Compile Include="EnsureThat\EnsureDecimalExtensions.cs" /> <Compile Include="EnsureThat\EnsureCollectionExtensions.cs" />
<Compile Include="EnsureThat\EnsureDoubleExtensions.cs" /> <Compile Include="EnsureThat\EnsureDateTimeExtensions.cs" />
<Compile Include="EnsureThat\EnsureGuidExtensions.cs" /> <Compile Include="EnsureThat\EnsureDecimalExtensions.cs" />
<Compile Include="EnsureThat\EnsureIntExtensions.cs" /> <Compile Include="EnsureThat\EnsureDoubleExtensions.cs" />
<Compile Include="EnsureThat\EnsureLongExtensions.cs" /> <Compile Include="EnsureThat\EnsureGuidExtensions.cs" />
<Compile Include="EnsureThat\EnsureNullableValueTypeExtensions.cs" /> <Compile Include="EnsureThat\EnsureIntExtensions.cs" />
<Compile Include="EnsureThat\EnsureObjectExtensions.cs" /> <Compile Include="EnsureThat\EnsureLongExtensions.cs" />
<Compile Include="EnsureThat\EnsureShortExtensions.cs" /> <Compile Include="EnsureThat\EnsureNullableValueTypeExtensions.cs" />
<Compile Include="EnsureThat\EnsureStringExtensions.cs" /> <Compile Include="EnsureThat\EnsureObjectExtensions.cs" />
<Compile Include="EnsureThat\EnsureTypeExtensions.cs" /> <Compile Include="EnsureThat\EnsureShortExtensions.cs" />
<Compile Include="EnsureThat\ExceptionFactory.cs" /> <Compile Include="EnsureThat\EnsureStringExtensions.cs" />
<Compile Include="EnsureThat\ExpressionExtensions.cs" /> <Compile Include="EnsureThat\EnsureTypeExtensions.cs" />
<Compile Include="EnsureThat\Param.cs" /> <Compile Include="EnsureThat\ExceptionFactory.cs" />
<Compile Include="EnsureThat\Resources\ExceptionMessages.Designer.cs" /> <Compile Include="EnsureThat\ExpressionExtensions.cs" />
<Compile Include="EnsureThat\TypeParam.cs" /> <Compile Include="EnsureThat\Param.cs" />
<Compile Include="EnvironmentInfo\AppFolderFactory.cs" /> <Compile Include="EnsureThat\Resources\ExceptionMessages.Designer.cs" />
<Compile Include="EnvironmentInfo\AppFolderInfo.cs" /> <Compile Include="EnsureThat\TypeParam.cs" />
<Compile Include="EnvironmentInfo\BuildInfo.cs" /> <Compile Include="EnvironmentInfo\AppFolderFactory.cs" />
<Compile Include="EnvironmentInfo\OsInfo.cs" /> <Compile Include="EnvironmentInfo\AppFolderInfo.cs" />
<Compile Include="EnvironmentInfo\IRuntimeInfo.cs" /> <Compile Include="EnvironmentInfo\BuildInfo.cs" />
<Compile Include="EnvironmentInfo\RuntimeInfoBase.cs" /> <Compile Include="EnvironmentInfo\OsInfo.cs" />
<Compile Include="EnvironmentInfo\StartupContext.cs" /> <Compile Include="EnvironmentInfo\IRuntimeInfo.cs" />
<Compile Include="Exceptions\NotParentException.cs" /> <Compile Include="EnvironmentInfo\RuntimeInfoBase.cs" />
<Compile Include="Exceptions\NzbDroneException.cs" /> <Compile Include="EnvironmentInfo\StartupContext.cs" />
<Compile Include="Exceptron\Configuration\ExceptronConfiguration.cs" /> <Compile Include="Exceptions\NotParentException.cs" />
<Compile Include="Exceptron\ExceptionData.cs" /> <Compile Include="Exceptions\NzbDroneException.cs" />
<Compile Include="Exceptron\ExceptionExtentions.cs" /> <Compile Include="Exceptron\Configuration\ExceptronConfiguration.cs" />
<Compile Include="Exceptron\ExceptionSeverity.cs" /> <Compile Include="Exceptron\ExceptionData.cs" />
<Compile Include="Exceptron\ExceptronApiException.cs" /> <Compile Include="Exceptron\ExceptionExtentions.cs" />
<Compile Include="Exceptron\ExceptronClient.cs" /> <Compile Include="Exceptron\ExceptionSeverity.cs" />
<Compile Include="Exceptron\fastJSON\Getters.cs" /> <Compile Include="Exceptron\ExceptronApiException.cs" />
<Compile Include="Exceptron\fastJSON\JSON.cs" /> <Compile Include="Exceptron\ExceptronClient.cs" />
<Compile Include="Exceptron\fastJSON\JsonParser.cs" /> <Compile Include="Exceptron\fastJSON\Getters.cs" />
<Compile Include="Exceptron\fastJSON\JsonSerializer.cs" /> <Compile Include="Exceptron\fastJSON\JSON.cs" />
<Compile Include="Exceptron\fastJSON\SafeDictionary.cs" /> <Compile Include="Exceptron\fastJSON\JsonParser.cs" />
<Compile Include="Exceptron\IExceptronClient.cs" /> <Compile Include="Exceptron\fastJSON\JsonSerializer.cs" />
<Compile Include="Exceptron\IRestClient.cs" /> <Compile Include="Exceptron\fastJSON\SafeDictionary.cs" />
<Compile Include="Exceptron\Message\ExceptionReport.cs" /> <Compile Include="Exceptron\IExceptronClient.cs" />
<Compile Include="Exceptron\Message\ExceptionResponse.cs" /> <Compile Include="Exceptron\IRestClient.cs" />
<Compile Include="Exceptron\Message\Frame.cs" /> <Compile Include="Exceptron\Message\ExceptionReport.cs" />
<Compile Include="Exceptron\RestClient.cs" /> <Compile Include="Exceptron\Message\ExceptionResponse.cs" />
<Compile Include="Expansive\CircularReferenceException.cs" /> <Compile Include="Exceptron\Message\Frame.cs" />
<Compile Include="Expansive\Expansive.cs" /> <Compile Include="Exceptron\RestClient.cs" />
<Compile Include="Expansive\PatternStyle.cs" /> <Compile Include="Expansive\CircularReferenceException.cs" />
<Compile Include="Expansive\Tree.cs" /> <Compile Include="Expansive\Expansive.cs" />
<Compile Include="Expansive\TreeNode.cs" /> <Compile Include="Expansive\PatternStyle.cs" />
<Compile Include="Expansive\TreeNodeList.cs" /> <Compile Include="Expansive\Tree.cs" />
<Compile Include="Extensions\Base64Extensions.cs" /> <Compile Include="Expansive\TreeNode.cs" />
<Compile Include="Extensions\DateTimeExtensions.cs" /> <Compile Include="Expansive\TreeNodeList.cs" />
<Compile Include="Crypto\HashConverter.cs" /> <Compile Include="Extensions\Base64Extensions.cs" />
<Compile Include="Extensions\Int64Extensions.cs" /> <Compile Include="Extensions\DateTimeExtensions.cs" />
<Compile Include="Extensions\ObjectExtensions.cs" /> <Compile Include="Crypto\HashConverter.cs" />
<Compile Include="Extensions\StreamExtensions.cs" /> <Compile Include="Extensions\Int64Extensions.cs" />
<Compile Include="Extensions\UrlExtensions.cs" /> <Compile Include="Extensions\ObjectExtensions.cs" />
<Compile Include="Extensions\XmlExtensions.cs" /> <Compile Include="Extensions\StreamExtensions.cs" />
<Compile Include="HashUtil.cs" /> <Compile Include="Extensions\UrlExtensions.cs" />
<Compile Include="Http\Dispatchers\CurlHttpDispatcher.cs" /> <Compile Include="Extensions\XmlExtensions.cs" />
<Compile Include="Http\Dispatchers\FallbackHttpDispatcher.cs" /> <Compile Include="HashUtil.cs" />
<Compile Include="Http\Dispatchers\IHttpDispatcher.cs" /> <Compile Include="Http\Dispatchers\CurlHttpDispatcher.cs" />
<Compile Include="Http\Dispatchers\ManagedHttpDispatcher.cs" /> <Compile Include="Http\Dispatchers\FallbackHttpDispatcher.cs" />
<Compile Include="Http\Proxy\ManagedWebProxyFactory.cs" /> <Compile Include="Http\Dispatchers\IHttpDispatcher.cs" />
<Compile Include="Http\GZipWebClient.cs"> <Compile Include="Http\Dispatchers\ManagedHttpDispatcher.cs" />
<SubType>Component</SubType> <Compile Include="Http\Proxy\ManagedWebProxyFactory.cs" />
</Compile> <Compile Include="Http\GZipWebClient.cs">
<Compile Include="Http\HttpAccept.cs" /> <SubType>Component</SubType>
<Compile Include="Http\HttpClient.cs" /> </Compile>
<Compile Include="Http\HttpException.cs" /> <Compile Include="Http\HttpAccept.cs" />
<Compile Include="Http\HttpFormData.cs" /> <Compile Include="Http\HttpClient.cs" />
<Compile Include="Http\HttpHeader.cs" /> <Compile Include="Http\HttpException.cs" />
<Compile Include="Http\HttpMethod.cs" /> <Compile Include="Http\HttpFormData.cs" />
<Compile Include="Http\HttpProvider.cs" /> <Compile Include="Http\HttpHeader.cs" />
<Compile Include="Http\HttpRequest.cs" /> <Compile Include="Http\HttpMethod.cs" />
<Compile Include="Http\Proxy\HttpProxySettings.cs" /> <Compile Include="Http\HttpProvider.cs" />
<Compile Include="Http\HttpResponse.cs" /> <Compile Include="Http\HttpRequest.cs" />
<Compile Include="Http\HttpUri.cs" /> <Compile Include="Http\Proxy\HttpProxySettings.cs" />
<Compile Include="Http\Proxy\IHttpProxySettingsProvider.cs" /> <Compile Include="Http\HttpResponse.cs" />
<Compile Include="Http\IHttpRequestInterceptor.cs" /> <Compile Include="Http\HttpUri.cs" />
<Compile Include="Http\JsonRpcRequestBuilder.cs" /> <Compile Include="Http\Proxy\IHttpProxySettingsProvider.cs" />
<Compile Include="Http\JsonRpcResponse.cs" /> <Compile Include="Http\IHttpRequestInterceptor.cs" />
<Compile Include="Http\NzbDroneWebClient.cs"> <Compile Include="Http\JsonRpcRequestBuilder.cs" />
<SubType>Component</SubType> <Compile Include="Http\JsonRpcResponse.cs" />
</Compile> <Compile Include="Http\NzbDroneWebClient.cs">
<Compile Include="Http\HttpRequestBuilder.cs" /> <SubType>Component</SubType>
<Compile Include="Http\HttpRequestBuilderFactory.cs" /> </Compile>
<Compile Include="Http\Proxy\ProxyType.cs" /> <Compile Include="Http\HttpRequestBuilder.cs" />
<Compile Include="Http\TooManyRequestsException.cs" /> <Compile Include="Http\HttpRequestBuilderFactory.cs" />
<Compile Include="Extensions\IEnumerableExtensions.cs" /> <Compile Include="Http\Proxy\ProxyType.cs" />
<Compile Include="Http\UserAgentBuilder.cs" /> <Compile Include="Http\TooManyRequestsException.cs" />
<Compile Include="Instrumentation\CleanseLogMessage.cs" /> <Compile Include="Extensions\IEnumerableExtensions.cs" />
<Compile Include="Instrumentation\ExceptronTarget.cs" /> <Compile Include="Http\UserAgentBuilder.cs" />
<Compile Include="Instrumentation\Extensions\LoggerProgressExtensions.cs" /> <Compile Include="Instrumentation\CleanseLogMessage.cs" />
<Compile Include="Instrumentation\GlobalExceptionHandlers.cs" /> <Compile Include="Instrumentation\ExceptronTarget.cs" />
<Compile Include="Instrumentation\LogEventExtensions.cs" /> <Compile Include="Instrumentation\Extensions\LoggerProgressExtensions.cs" />
<Compile Include="Instrumentation\NzbDroneFileTarget.cs" /> <Compile Include="Instrumentation\GlobalExceptionHandlers.cs" />
<Compile Include="Instrumentation\NzbDroneLogger.cs" /> <Compile Include="Instrumentation\LogEventExtensions.cs" />
<Compile Include="Instrumentation\VersionLayoutRenderer.cs" /> <Compile Include="Instrumentation\NzbDroneFileTarget.cs" />
<Compile Include="Extensions\LevenstheinExtensions.cs" /> <Compile Include="Instrumentation\NzbDroneLogger.cs" />
<Compile Include="Messaging\IEvent.cs" /> <Compile Include="Instrumentation\VersionLayoutRenderer.cs" />
<Compile Include="Messaging\IMessage.cs" /> <Compile Include="Extensions\LevenstheinExtensions.cs" />
<Compile Include="Model\ProcessInfo.cs" /> <Compile Include="Messaging\IEvent.cs" />
<Compile Include="PathEqualityComparer.cs" /> <Compile Include="Messaging\IMessage.cs" />
<Compile Include="Extensions\PathExtensions.cs" /> <Compile Include="Model\ProcessInfo.cs" />
<Compile Include="Processes\PidFileProvider.cs" /> <Compile Include="PathEqualityComparer.cs" />
<Compile Include="Processes\ProcessOutput.cs" /> <Compile Include="Extensions\PathExtensions.cs" />
<Compile Include="Processes\ProcessOutputLine.cs" /> <Compile Include="Processes\PidFileProvider.cs" />
<Compile Include="Processes\ProcessProvider.cs" /> <Compile Include="Processes\ProcessOutput.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Processes\ProcessOutputLine.cs" />
<Compile Include="Properties\SharedAssemblyInfo.cs" /> <Compile Include="Processes\ProcessProvider.cs" />
<Compile Include="Reflection\ReflectionExtensions.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Extensions\ResourceExtensions.cs" /> <Compile Include="Properties\SharedAssemblyInfo.cs" />
<Compile Include="Security\SecurityProtocolPolicy.cs" /> <Compile Include="Reflection\ReflectionExtensions.cs" />
<Compile Include="Security\X509CertificateValidationPolicy.cs" /> <Compile Include="Extensions\ResourceExtensions.cs" />
<Compile Include="Serializer\HttpUriConverter.cs" /> <Compile Include="Security\SecurityProtocolPolicy.cs" />
<Compile Include="Serializer\IntConverter.cs" /> <Compile Include="Security\X509CertificateValidationPolicy.cs" />
<Compile Include="Serializer\Json.cs" /> <Compile Include="Serializer\HttpUriConverter.cs" />
<Compile Include="ServiceFactory.cs" /> <Compile Include="Serializer\IntConverter.cs" />
<Compile Include="ServiceProvider.cs" /> <Compile Include="Serializer\Json.cs" />
<Compile Include="Extensions\StringExtensions.cs" /> <Compile Include="ServiceFactory.cs" />
<Compile Include="TinyIoC.cs" /> <Compile Include="ServiceProvider.cs" />
<Compile Include="TPL\Debouncer.cs" /> <Compile Include="Extensions\StringExtensions.cs" />
<Compile Include="TPL\LimitedConcurrencyLevelTaskScheduler.cs" /> <Compile Include="TinyIoC.cs" />
<Compile Include="TPL\RateLimitService.cs" /> <Compile Include="TPL\Debouncer.cs" />
<Compile Include="TPL\TaskExtensions.cs" /> <Compile Include="TPL\LimitedConcurrencyLevelTaskScheduler.cs" />
<Compile Include="Extensions\TryParseExtensions.cs" /> <Compile Include="TPL\RateLimitService.cs" />
</ItemGroup> <Compile Include="TPL\TaskExtensions.cs" />
<ItemGroup> <Compile Include="Extensions\TryParseExtensions.cs" />
<None Include="app.config" /> </ItemGroup>
<None Include="CurlSharp.dll.config"> <ItemGroup>
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <None Include="app.config" />
</None> <None Include="CurlSharp.dll.config">
<None Include="packages.config"> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
<SubType>Designer</SubType> </None>
</None> <None Include="packages.config">
</ItemGroup> <SubType>Designer</SubType>
<ItemGroup> </None>
<EmbeddedResource Include="EnsureThat\Resources\ExceptionMessages.resx" /> </ItemGroup>
</ItemGroup> <ItemGroup>
<ItemGroup> <EmbeddedResource Include="EnsureThat\Resources\ExceptionMessages.resx" />
<None Include="Exceptron\fastJSON\license.txt" /> </ItemGroup>
<Content Include="Expansive\license.txt" /> <ItemGroup>
</ItemGroup> <None Include="Exceptron\fastJSON\license.txt" />
<ItemGroup> <Content Include="Expansive\license.txt" />
<ProjectReference Include="..\ExternalModules\CurlSharp\CurlSharp\CurlSharp.csproj"> </ItemGroup>
<Project>{74420a79-cc16-442c-8b1e-7c1b913844f0}</Project> <ItemGroup>
<Name>CurlSharp</Name> <ProjectReference Include="..\ExternalModules\CurlSharp\CurlSharp\CurlSharp.csproj">
</ProjectReference> <Project>{74420a79-cc16-442c-8b1e-7c1b913844f0}</Project>
<ProjectReference Include="..\LogentriesNLog\LogentriesNLog.csproj"> <Name>CurlSharp</Name>
<Project>{9DC31DE3-79FF-47A8-96B4-6BA18F6BB1CB}</Project> </ProjectReference>
<Name>LogentriesNLog</Name> <ProjectReference Include="..\LogentriesNLog\LogentriesNLog.csproj">
</ProjectReference> <Project>{9DC31DE3-79FF-47A8-96B4-6BA18F6BB1CB}</Project>
</ItemGroup> <Name>LogentriesNLog</Name>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.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>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
@@ -1,4 +1,4 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
@@ -98,9 +98,9 @@ namespace NzbDrone.Common.Processes
var process = new Process var process = new Process
{ {
StartInfo = new ProcessStartInfo(url) StartInfo = new ProcessStartInfo(url)
{ {
UseShellExecute = true UseShellExecute = true
} }
}; };
process.Start(); process.Start();
@@ -129,16 +129,34 @@ namespace NzbDrone.Common.Processes
{ {
foreach (DictionaryEntry environmentVariable in environmentVariables) foreach (DictionaryEntry environmentVariable in environmentVariables)
{ {
startInfo.EnvironmentVariables.Add(environmentVariable.Key.ToString(), environmentVariable.Value.ToString()); try
{
_logger.Trace("Setting environment variable '{0}' to '{1}'", environmentVariable.Key, environmentVariable.Value);
startInfo.EnvironmentVariables.Add(environmentVariable.Key.ToString(), environmentVariable.Value.ToString());
}
catch (Exception e)
{
if (environmentVariable.Value == null)
{
_logger.Error(e, "Unable to set environment variable '{0}', value is null", environmentVariable.Key);
}
else
{
_logger.Error(e, "Unable to set environment variable '{0}'", environmentVariable.Key);
}
throw;
}
} }
} }
logger.Debug("Starting {0} {1}", path, args); logger.Debug("Starting {0} {1}", path, args);
var process = new Process var process = new Process
{ {
StartInfo = startInfo StartInfo = startInfo
}; };
process.OutputDataReceived += (sender, eventArgs) => process.OutputDataReceived += (sender, eventArgs) =>
{ {
@@ -315,7 +333,7 @@ namespace NzbDrone.Common.Processes
var monoProcesses = Process.GetProcessesByName("mono") var monoProcesses = Process.GetProcessesByName("mono")
.Union(Process.GetProcessesByName("mono-sgen")) .Union(Process.GetProcessesByName("mono-sgen"))
.Union(Process.GetProcessesByName("mono-sgen32")) .Union(Process.GetProcessesByName("mono-sgen32"))
.Where(process => .Where(process =>
process.Modules.Cast<ProcessModule>() process.Modules.Cast<ProcessModule>()
.Any(module => .Any(module =>
+6 -6
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="DotNet4.SocksProxy" version="1.3.2.0" targetFramework="net40" /> <package id="DotNet4.SocksProxy" version="1.3.2.0" targetFramework="net40" />
<package id="ICSharpCode.SharpZipLib.Patched" version="0.86.5" targetFramework="net40" /> <package id="ICSharpCode.SharpZipLib.Patched" version="0.86.5" targetFramework="net40" />
<package id="Newtonsoft.Json" version="6.0.6" targetFramework="net40" /> <package id="Newtonsoft.Json" version="6.0.6" targetFramework="net40" />
<package id="NLog" version="4.3.11" targetFramework="net40" /> <package id="NLog" version="4.5.0-rc06" targetFramework="net40" />
</packages> </packages>
+9 -1
View File
@@ -23,7 +23,15 @@ namespace NzbDrone.Console
try try
{ {
var startupArgs = new StartupContext(args); var startupArgs = new StartupContext(args);
NzbDroneLogger.Register(startupArgs, false, true); try
{
NzbDroneLogger.Register(startupArgs, false, true);
}
catch (Exception ex)
{
System.Console.WriteLine("NLog Exception: " + ex.ToString());
throw;
}
Bootstrap.Start(startupArgs, new ConsoleAlerts()); Bootstrap.Start(startupArgs, new ConsoleAlerts());
} }
catch (SocketException e) catch (SocketException e)
+156 -150
View File
@@ -1,157 +1,163 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion> <ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}</ProjectGuid> <ProjectGuid>{3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}</ProjectGuid>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NzbDrone.Console</RootNamespace> <RootNamespace>NzbDrone.Console</RootNamespace>
<AssemblyName>Radarr.Console</AssemblyName> <AssemblyName>Radarr.Console</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<TargetFrameworkProfile> <TargetFrameworkProfile>
</TargetFrameworkProfile> </TargetFrameworkProfile>
<IsWebBootstrapper>false</IsWebBootstrapper> <IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl> <PublishUrl>publish\</PublishUrl>
<Install>true</Install> <Install>true</Install>
<InstallFrom>Disk</InstallFrom> <InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled> <UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode> <UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval> <UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits> <UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically> <UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired> <UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions> <MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision> <ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion> <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled> <BootstrapperEnabled>true</BootstrapperEnabled>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages> <RestorePackages>true</RestorePackages>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>..\..\_output\</OutputPath> <OutputPath>..\..\_output\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<UseVSHostingProcess>true</UseVSHostingProcess> <UseVSHostingProcess>true</UseVSHostingProcess>
<CodeAnalysisRuleSet>BasicCorrectnessRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>BasicCorrectnessRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<OutputPath>..\..\_output\</OutputPath> <OutputPath>..\..\_output\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<ApplicationIcon>Radarr.ico</ApplicationIcon> <ApplicationIcon>Radarr.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<StartupObject>NzbDrone.Console.ConsoleApp</StartupObject> <StartupObject>NzbDrone.Console.ConsoleApp</StartupObject>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent> <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.Owin, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> <Reference Include="Microsoft.CSharp" />
<SpecificVersion>False</SpecificVersion> <Reference Include="Microsoft.Owin, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Owin.2.1.0\lib\net40\Microsoft.Owin.dll</HintPath> <SpecificVersion>False</SpecificVersion>
</Reference> <HintPath>..\packages\Microsoft.Owin.2.1.0\lib\net40\Microsoft.Owin.dll</HintPath>
<Reference Include="Microsoft.Owin.Hosting, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> </Reference>
<SpecificVersion>False</SpecificVersion> <Reference Include="Microsoft.Owin.Hosting, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Owin.Hosting.2.1.0\lib\net40\Microsoft.Owin.Hosting.dll</HintPath> <SpecificVersion>False</SpecificVersion>
</Reference> <HintPath>..\packages\Microsoft.Owin.Hosting.2.1.0\lib\net40\Microsoft.Owin.Hosting.dll</HintPath>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> </Reference>
<SpecificVersion>False</SpecificVersion> <Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\net40\Newtonsoft.Json.dll</HintPath> <SpecificVersion>False</SpecificVersion>
</Reference> <HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\net40\Newtonsoft.Json.dll</HintPath>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> </Reference>
<HintPath>..\packages\NLog.4.3.11\lib\net40\NLog.dll</HintPath> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<Private>True</Private> <HintPath>..\packages\NLog.4.5.0-rc06\lib\net40-client\NLog.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Configuration" />
<Reference Include="Owin"> <Reference Include="System.Core" />
<HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath> <Reference Include="Owin">
</Reference> <HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
</ItemGroup> </Reference>
<ItemGroup> <Reference Include="System.Data" />
<Compile Include="..\NzbDrone.Common\Properties\SharedAssemblyInfo.cs"> <Reference Include="System.Runtime.Serialization" />
<Link>Properties\SharedAssemblyInfo.cs</Link> <Reference Include="System.ServiceModel" />
</Compile> <Reference Include="System.Transactions" />
<Compile Include="ConsoleAlerts.cs" /> <Reference Include="System.Xml" />
<Compile Include="ConsoleApp.cs" /> </ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" /> <ItemGroup>
</ItemGroup> <Compile Include="..\NzbDrone.Common\Properties\SharedAssemblyInfo.cs">
<ItemGroup> <Link>Properties\SharedAssemblyInfo.cs</Link>
<BootstrapperPackage Include=".NETFramework,Version=v4.0"> </Compile>
<Visible>False</Visible> <Compile Include="ConsoleAlerts.cs" />
<ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName> <Compile Include="ConsoleApp.cs" />
<Install>true</Install> <Compile Include="Properties\AssemblyInfo.cs" />
</BootstrapperPackage> </ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5"> <ItemGroup>
<Visible>False</Visible> <BootstrapperPackage Include=".NETFramework,Version=v4.0">
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName> <Visible>False</Visible>
<Install>false</Install> <ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
</BootstrapperPackage> <Install>true</Install>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> </BootstrapperPackage>
<Visible>False</Visible> <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<ProductName>.NET Framework 3.5 SP1</ProductName> <Visible>False</Visible>
<Install>false</Install> <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
</BootstrapperPackage> <Install>false</Install>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1"> </BootstrapperPackage>
<Visible>False</Visible> <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<ProductName>Windows Installer 3.1</ProductName> <Visible>False</Visible>
<Install>true</Install> <ProductName>.NET Framework 3.5 SP1</ProductName>
</BootstrapperPackage> <Install>false</Install>
</ItemGroup> </BootstrapperPackage>
<ItemGroup> <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<ProjectReference Include="..\Microsoft.AspNet.SignalR.Core\Microsoft.AspNet.SignalR.Core.csproj"> <Visible>False</Visible>
<Project>{1B9A82C4-BCA1-4834-A33E-226F17BE070B}</Project> <ProductName>Windows Installer 3.1</ProductName>
<Name>Microsoft.AspNet.SignalR.Core</Name> <Install>true</Install>
</ProjectReference> </BootstrapperPackage>
<ProjectReference Include="..\Microsoft.AspNet.SignalR.Owin\Microsoft.AspNet.SignalR.Owin.csproj"> </ItemGroup>
<Project>{2B8C6DAD-4D85-41B1-83FD-248D9F347522}</Project> <ItemGroup>
<Name>Microsoft.AspNet.SignalR.Owin</Name> <ProjectReference Include="..\Microsoft.AspNet.SignalR.Core\Microsoft.AspNet.SignalR.Core.csproj">
</ProjectReference> <Project>{1B9A82C4-BCA1-4834-A33E-226F17BE070B}</Project>
<ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj"> <Name>Microsoft.AspNet.SignalR.Core</Name>
<Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project> </ProjectReference>
<Name>NzbDrone.Common</Name> <ProjectReference Include="..\Microsoft.AspNet.SignalR.Owin\Microsoft.AspNet.SignalR.Owin.csproj">
</ProjectReference> <Project>{2B8C6DAD-4D85-41B1-83FD-248D9F347522}</Project>
<ProjectReference Include="..\NzbDrone.Host\NzbDrone.Host.csproj"> <Name>Microsoft.AspNet.SignalR.Owin</Name>
<Project>{95C11A9E-56ED-456A-8447-2C89C1139266}</Project> </ProjectReference>
<Name>NzbDrone.Host</Name> <ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj">
</ProjectReference> <Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project>
</ItemGroup> <Name>NzbDrone.Common</Name>
<ItemGroup> </ProjectReference>
<None Include="..\NzbDrone.Host\app.config"> <ProjectReference Include="..\NzbDrone.Host\NzbDrone.Host.csproj">
<Link>app.config</Link> <Project>{95C11A9E-56ED-456A-8447-2C89C1139266}</Project>
</None> <Name>NzbDrone.Host</Name>
<None Include="packages.config" /> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="Radarr.ico" /> <None Include="..\NzbDrone.Host\app.config">
</ItemGroup> <Link>app.config</Link>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </None>
<PropertyGroup> <None Include="packages.config" />
<PreBuildEvent> </ItemGroup>
</PreBuildEvent> <ItemGroup>
</PropertyGroup> <Content Include="Radarr.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
</PropertyGroup>
<!-- 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>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
+7 -7
View File
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Microsoft.Owin" version="2.1.0" targetFramework="net40" /> <package id="Microsoft.Owin" version="2.1.0" targetFramework="net40" />
<package id="Microsoft.Owin.Hosting" version="2.1.0" targetFramework="net40" /> <package id="Microsoft.Owin.Hosting" version="2.1.0" targetFramework="net40" />
<package id="Newtonsoft.Json" version="6.0.6" targetFramework="net40" /> <package id="Newtonsoft.Json" version="6.0.6" targetFramework="net40" />
<package id="NLog" version="4.3.11" targetFramework="net40" /> <package id="NLog" version="4.5.0-rc06" targetFramework="net40" />
<package id="Owin" version="1.0" targetFramework="net40" /> <package id="Owin" version="1.0" targetFramework="net40" />
</packages> </packages>
@@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
@@ -72,7 +72,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
private void GivenMostRecentForEpisode(int episodeId, string downloadId, QualityModel quality, DateTime date, HistoryEventType eventType) private void GivenMostRecentForEpisode(int episodeId, string downloadId, QualityModel quality, DateTime date, HistoryEventType eventType)
{ {
Mocker.GetMock<IHistoryService>().Setup(s => s.MostRecentForEpisode(episodeId)) Mocker.GetMock<IHistoryService>().Setup(s => s.MostRecentForMovie(episodeId))
.Returns(new History.History { DownloadId = downloadId, Quality = quality, Date = date, EventType = eventType }); .Returns(new History.History { DownloadId = downloadId, Quality = quality, Date = date, EventType = eventType });
} }
@@ -92,7 +92,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_return_true_if_latest_history_item_is_null() public void should_return_true_if_latest_history_item_is_null()
{ {
Mocker.GetMock<IHistoryService>().Setup(s => s.MostRecentForEpisode(It.IsAny<int>())).Returns((History.History)null); Mocker.GetMock<IHistoryService>().Setup(s => s.MostRecentForMovie(It.IsAny<int>())).Returns((History.History)null);
_upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue(); _upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue();
} }
@@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@@ -20,27 +20,27 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
public class DeleteBadMediaCoversFixture : CoreTest<DeleteBadMediaCovers> public class DeleteBadMediaCoversFixture : CoreTest<DeleteBadMediaCovers>
{ {
private List<MetadataFile> _metadata; private List<MetadataFile> _metadata;
private List<Series> _series; private List<Movie> _movies;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_series = Builder<Series>.CreateListOfSize(1) _movies = Builder<Movie>.CreateListOfSize(1)
.All() .All()
.With(c => c.Path = "C:\\TV\\".AsOsAgnostic()) .With(c => c.Path = "C:\\Movie\\".AsOsAgnostic())
.Build().ToList(); .Build().ToList();
_metadata = Builder<MetadataFile>.CreateListOfSize(1) _metadata = Builder<MetadataFile>.CreateListOfSize(1)
.Build().ToList(); .Build().ToList();
Mocker.GetMock<ISeriesService>() Mocker.GetMock<IMovieService>()
.Setup(c => c.GetAllSeries()) .Setup(c => c.GetAllMovies())
.Returns(_series); .Returns(_movies);
Mocker.GetMock<IMetadataFileService>() Mocker.GetMock<IMetadataFileService>()
.Setup(c => c.GetFilesBySeries(_series.First().Id)) .Setup(c => c.GetFilesByMovie(_movies.First().Id))
.Returns(_metadata); .Returns(_metadata);
@@ -51,8 +51,8 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
[Test] [Test]
public void should_not_process_non_image_files() public void should_not_process_non_image_files()
{ {
_metadata.First().RelativePath = "season\\file.xml".AsOsAgnostic(); _metadata.First().RelativePath = "extrafiles\\file.xml".AsOsAgnostic();
_metadata.First().Type = MetadataType.EpisodeMetadata; _metadata.First().Type = MetadataType.MovieMetadata;
Subject.Clean(); Subject.Clean();
@@ -101,10 +101,10 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
public void should_delete_html_images() public void should_delete_html_images()
{ {
var imagePath = "C:\\TV\\Season\\image.jpg".AsOsAgnostic(); var imagePath = "C:\\Movie\\image.jpg".AsOsAgnostic();
_metadata.First().LastUpdated = new DateTime(2014, 12, 29); _metadata.First().LastUpdated = new DateTime(2014, 12, 29);
_metadata.First().RelativePath = "Season\\image.jpg".AsOsAgnostic(); _metadata.First().RelativePath = "image.jpg".AsOsAgnostic();
_metadata.First().Type = MetadataType.SeriesImage; _metadata.First().Type = MetadataType.MovieImage;
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
.Setup(c => c.OpenReadStream(imagePath)) .Setup(c => c.OpenReadStream(imagePath))
@@ -123,10 +123,10 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
public void should_delete_empty_images() public void should_delete_empty_images()
{ {
var imagePath = "C:\\TV\\Season\\image.jpg".AsOsAgnostic(); var imagePath = "C:\\Movie\\image.jpg".AsOsAgnostic();
_metadata.First().LastUpdated = new DateTime(2014, 12, 29); _metadata.First().LastUpdated = new DateTime(2014, 12, 29);
_metadata.First().Type = MetadataType.SeasonImage; _metadata.First().Type = MetadataType.MovieImage;
_metadata.First().RelativePath = "Season\\image.jpg".AsOsAgnostic(); _metadata.First().RelativePath = "image.jpg".AsOsAgnostic();
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
.Setup(c => c.OpenReadStream(imagePath)) .Setup(c => c.OpenReadStream(imagePath))
@@ -144,9 +144,9 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
public void should_not_delete_non_html_files() public void should_not_delete_non_html_files()
{ {
var imagePath = "C:\\TV\\Season\\image.jpg".AsOsAgnostic(); var imagePath = "C:\\Movie\\image.jpg".AsOsAgnostic();
_metadata.First().LastUpdated = new DateTime(2014, 12, 29); _metadata.First().LastUpdated = new DateTime(2014, 12, 29);
_metadata.First().RelativePath = "Season\\image.jpg".AsOsAgnostic(); _metadata.First().RelativePath = "image.jpg".AsOsAgnostic();
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
.Setup(c => c.OpenReadStream(imagePath)) .Setup(c => c.OpenReadStream(imagePath))
@@ -1,4 +1,4 @@
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.History; using NzbDrone.Core.History;
@@ -32,13 +32,13 @@ namespace NzbDrone.Core.Test.HistoryTests
{ {
var historyBluray = Builder<History.History>.CreateNew() var historyBluray = Builder<History.History>.CreateNew()
.With(c => c.Quality = new QualityModel(Quality.Bluray1080p)) .With(c => c.Quality = new QualityModel(Quality.Bluray1080p))
.With(c => c.SeriesId = 12) .With(c => c.MovieId = 12)
.With(c => c.EventType = HistoryEventType.Grabbed) .With(c => c.EventType = HistoryEventType.Grabbed)
.BuildNew(); .BuildNew();
var historyDvd = Builder<History.History>.CreateNew() var historyDvd = Builder<History.History>.CreateNew()
.With(c => c.Quality = new QualityModel(Quality.DVD)) .With(c => c.Quality = new QualityModel(Quality.DVD))
.With(c => c.SeriesId = 12) .With(c => c.MovieId = 12)
.With(c => c.EventType = HistoryEventType.Grabbed) .With(c => c.EventType = HistoryEventType.Grabbed)
.BuildNew(); .BuildNew();
@@ -51,4 +51,4 @@ namespace NzbDrone.Core.Test.HistoryTests
} }
} }
} }
@@ -1,4 +1,4 @@
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using Moq; using Moq;
@@ -68,23 +68,23 @@ namespace NzbDrone.Core.Test.HistoryTests
[Test] [Test]
public void should_use_file_name_for_source_title_if_scene_name_is_null() public void should_use_file_name_for_source_title_if_scene_name_is_null()
{ {
var series = Builder<Series>.CreateNew().Build(); // Test fails becuase Radarr is using movie.title in historyService with no fallback
var episodes = Builder<Episode>.CreateListOfSize(1).Build().ToList();
var episodeFile = Builder<EpisodeFile>.CreateNew() var movie = Builder<Movie>.CreateNew().Build();
var movieFile = Builder<MovieFile>.CreateNew()
.With(f => f.SceneName = null) .With(f => f.SceneName = null)
.Build(); .Build();
var localEpisode = new LocalEpisode var localMovie = new LocalMovie()
{ {
Series = series, Movie = movie,
Episodes = episodes, Path = @"C:\Test\Unsorted\Movie.2011.mkv"
Path = @"C:\Test\Unsorted\Series.s01e01.mkv"
}; };
Subject.Handle(new EpisodeImportedEvent(localEpisode, episodeFile, true, "sab", "abcd", true)); Subject.Handle(new MovieImportedEvent(localMovie, movieFile, true, "sab", "abcd", true));
Mocker.GetMock<IHistoryRepository>() Mocker.GetMock<IHistoryRepository>()
.Verify(v => v.Insert(It.Is<History.History>(h => h.SourceTitle == Path.GetFileNameWithoutExtension(localEpisode.Path)))); .Verify(v => v.Insert(It.Is<History.History>(h => h.SourceTitle == Path.GetFileNameWithoutExtension(localMovie.Path))));
} }
} }
} }
@@ -1,4 +1,4 @@
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.Extras.Metadata; using NzbDrone.Core.Extras.Metadata;
@@ -12,12 +12,12 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
public class CleanupDuplicateMetadataFilesFixture : DbTest<CleanupDuplicateMetadataFiles, MetadataFile> public class CleanupDuplicateMetadataFilesFixture : DbTest<CleanupDuplicateMetadataFiles, MetadataFile>
{ {
[Test] [Test]
public void should_not_delete_metadata_files_when_they_are_for_the_same_series_but_different_consumers() public void should_not_delete_metadata_files_when_they_are_for_the_same_movie_but_different_consumers()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
.With(m => m.Type = MetadataType.SeriesMetadata) .With(m => m.Type = MetadataType.MovieMetadata)
.With(m => m.SeriesId = 1) .With(m => m.MovieId = 1)
.BuildListOfNew(); .BuildListOfNew();
Db.InsertMany(files); Db.InsertMany(files);
@@ -26,11 +26,11 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_for_different_series() public void should_not_delete_metadata_files_for_different_movie()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
.With(m => m.Type = MetadataType.SeriesMetadata) .With(m => m.Type = MetadataType.MovieMetadata)
.With(m => m.Consumer = "XbmcMetadata") .With(m => m.Consumer = "XbmcMetadata")
.BuildListOfNew(); .BuildListOfNew();
@@ -40,12 +40,12 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_metadata_files_when_they_are_for_the_same_series_and_consumer() public void should_delete_metadata_files_when_they_are_for_the_same_movie_and_consumer()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
.With(m => m.Type = MetadataType.SeriesMetadata) .With(m => m.Type = MetadataType.MovieMetadata)
.With(m => m.SeriesId = 1) .With(m => m.MovieId = 1)
.With(m => m.Consumer = "XbmcMetadata") .With(m => m.Consumer = "XbmcMetadata")
.BuildListOfNew(); .BuildListOfNew();
@@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_when_there_is_only_one_for_that_series_and_consumer() public void should_not_delete_metadata_files_when_there_is_only_one_for_that_movie_and_consumer()
{ {
var file = Builder<MetadataFile>.CreateNew() var file = Builder<MetadataFile>.CreateNew()
.BuildNew(); .BuildNew();
@@ -66,12 +66,12 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_when_they_are_for_the_same_episode_but_different_consumers() public void should_not_delete_metadata_files_when_they_are_for_the_same_movie_file_but_different_consumers()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
.With(m => m.Type = MetadataType.EpisodeMetadata) .With(m => m.Type = MetadataType.MovieMetadata)
.With(m => m.EpisodeFileId = 1) .With(m => m.MovieFileId = 1)
.BuildListOfNew(); .BuildListOfNew();
Db.InsertMany(files); Db.InsertMany(files);
@@ -80,11 +80,11 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_for_different_episode() public void should_not_delete_metadata_files_for_different_movie_file()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
.With(m => m.Type = MetadataType.EpisodeMetadata) .With(m => m.Type = MetadataType.MovieMetadata)
.With(m => m.Consumer = "XbmcMetadata") .With(m => m.Consumer = "XbmcMetadata")
.BuildListOfNew(); .BuildListOfNew();
@@ -94,12 +94,12 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_metadata_files_when_they_are_for_the_same_episode_and_consumer() public void should_delete_metadata_files_when_they_are_for_the_same_movie_file_and_consumer()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
.With(m => m.Type = MetadataType.EpisodeMetadata) .With(m => m.Type = MetadataType.MovieMetadata)
.With(m => m.EpisodeFileId = 1) .With(m => m.MovieFileId = 1)
.With(m => m.Consumer = "XbmcMetadata") .With(m => m.Consumer = "XbmcMetadata")
.BuildListOfNew(); .BuildListOfNew();
@@ -109,7 +109,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_when_there_is_only_one_for_that_episode_and_consumer() public void should_not_delete_metadata_files_when_there_is_only_one_for_that_movie_file_and_consumer()
{ {
var file = Builder<MetadataFile>.CreateNew() var file = Builder<MetadataFile>.CreateNew()
.BuildNew(); .BuildNew();
@@ -120,12 +120,12 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_image_when_they_are_for_the_same_episode_but_different_consumers() public void should_not_delete_image_when_they_are_for_the_same_movie_file_but_different_consumers()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
.With(m => m.Type = MetadataType.EpisodeImage) .With(m => m.Type = MetadataType.MovieImage)
.With(m => m.EpisodeFileId = 1) .With(m => m.MovieFileId = 1)
.BuildListOfNew(); .BuildListOfNew();
Db.InsertMany(files); Db.InsertMany(files);
@@ -134,11 +134,11 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_image_for_different_episode() public void should_not_delete_image_for_different_movie_file()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
.With(m => m.Type = MetadataType.EpisodeImage) .With(m => m.Type = MetadataType.MovieImage)
.With(m => m.Consumer = "XbmcMetadata") .With(m => m.Consumer = "XbmcMetadata")
.BuildListOfNew(); .BuildListOfNew();
@@ -148,22 +148,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_image_when_they_are_for_the_same_episode_and_consumer() public void should_not_delete_image_when_there_is_only_one_for_that_movie_file_and_consumer()
{
var files = Builder<MetadataFile>.CreateListOfSize(2)
.All()
.With(m => m.Type = MetadataType.EpisodeImage)
.With(m => m.EpisodeFileId = 1)
.With(m => m.Consumer = "XbmcMetadata")
.BuildListOfNew();
Db.InsertMany(files);
Subject.Clean();
AllStoredModels.Count.Should().Be(1);
}
[Test]
public void should_not_delete_image_when_there_is_only_one_for_that_episode_and_consumer()
{ {
var file = Builder<MetadataFile>.CreateNew() var file = Builder<MetadataFile>.CreateNew()
.BuildNew(); .BuildNew();
@@ -1,4 +1,4 @@
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.Extras.Metadata; using NzbDrone.Core.Extras.Metadata;
@@ -15,10 +15,10 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
public class CleanupOrphanedMetadataFilesFixture : DbTest<CleanupOrphanedMetadataFiles, MetadataFile> public class CleanupOrphanedMetadataFilesFixture : DbTest<CleanupOrphanedMetadataFiles, MetadataFile>
{ {
[Test] [Test]
public void should_delete_metadata_files_that_dont_have_a_coresponding_series() public void should_delete_metadata_files_that_dont_have_a_coresponding_movie()
{ {
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.EpisodeFileId = null) .With(m => m.MovieFileId = null)
.BuildNew(); .BuildNew();
Db.Insert(metadataFile); Db.Insert(metadataFile);
@@ -27,16 +27,16 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_that_have_a_coresponding_series() public void should_not_delete_metadata_files_that_have_a_coresponding_movie()
{ {
var series = Builder<Series>.CreateNew() var movie = Builder<Movie>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(series); Db.Insert(movie);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.SeriesId = series.Id) .With(m => m.MovieId = movie.Id)
.With(m => m.EpisodeFileId = null) .With(m => m.MovieFileId = null)
.BuildNew(); .BuildNew();
Db.Insert(metadataFile); Db.Insert(metadataFile);
@@ -45,16 +45,16 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_metadata_files_that_dont_have_a_coresponding_episode_file() public void should_delete_metadata_files_that_dont_have_a_coresponding_movie_file()
{ {
var series = Builder<Series>.CreateNew() var movie = Builder<Movie>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(series); Db.Insert(movie);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.SeriesId = series.Id) .With(m => m.MovieId = movie.Id)
.With(m => m.EpisodeFileId = 10) .With(m => m.MovieFileId = 10)
.BuildNew(); .BuildNew();
Db.Insert(metadataFile); Db.Insert(metadataFile);
@@ -63,21 +63,21 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_that_have_a_coresponding_episode_file() public void should_not_delete_metadata_files_that_have_a_coresponding_movie_file()
{ {
var series = Builder<Series>.CreateNew() var movie = Builder<Movie>.CreateNew()
.BuildNew(); .BuildNew();
var episodeFile = Builder<EpisodeFile>.CreateNew() var movieFile = Builder<MovieFile>.CreateNew()
.With(h => h.Quality = new QualityModel()) .With(h => h.Quality = new QualityModel())
.BuildNew(); .BuildNew();
Db.Insert(series); Db.Insert(movie);
Db.Insert(episodeFile); Db.Insert(movieFile);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.SeriesId = series.Id) .With(m => m.MovieId = movie.Id)
.With(m => m.EpisodeFileId = episodeFile.Id) .With(m => m.MovieFileId = movieFile.Id)
.BuildNew(); .BuildNew();
Db.Insert(metadataFile); Db.Insert(metadataFile);
@@ -86,17 +86,17 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_episode_metadata_files_that_have_episodefileid_of_zero() public void should_delete_movie_metadata_files_that_have_moviefileid_of_zero()
{ {
var series = Builder<Series>.CreateNew() var movie = Builder<Movie>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(series); Db.Insert(movie);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.SeriesId = series.Id) .With(m => m.MovieId = movie.Id)
.With(m => m.Type = MetadataType.EpisodeMetadata) .With(m => m.Type = MetadataType.MovieMetadata)
.With(m => m.EpisodeFileId = 0) .With(m => m.MovieFileId = 0)
.BuildNew(); .BuildNew();
Db.Insert(metadataFile); Db.Insert(metadataFile);
@@ -105,17 +105,17 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_episode_image_files_that_have_episodefileid_of_zero() public void should_delete_movie_image_files_that_have_moviefileid_of_zero()
{ {
var series = Builder<Series>.CreateNew() var movie = Builder<Movie>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(series); Db.Insert(movie);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.SeriesId = series.Id) .With(m => m.MovieId = movie.Id)
.With(m => m.Type = MetadataType.EpisodeImage) .With(m => m.Type = MetadataType.MovieImage)
.With(m => m.EpisodeFileId = 0) .With(m => m.MovieFileId = 0)
.BuildNew(); .BuildNew();
Db.Insert(metadataFile); Db.Insert(metadataFile);
@@ -0,0 +1,67 @@
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using Marr.Data;
using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.EpisodeImport.Specifications;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Specifications
{
[TestFixture]
public class SameFileSpecificationFixture : CoreTest<SameFileSpecification>
{
private LocalMovie _localMovie;
[SetUp]
public void Setup()
{
_localMovie = Builder<LocalMovie>.CreateNew()
.With(l => l.Size = 150.Megabytes())
.Build();
}
[Test]
public void should_be_accepted_if_no_existing_file()
{
_localMovie.Movie = Builder<Movie>.CreateNew()
.With(e => e.MovieFileId = 0)
.Build();
Subject.IsSatisfiedBy(_localMovie, null).Accepted.Should().BeTrue();
}
[Test]
public void should_be_accepted_if_file_size_is_different()
{
_localMovie.Movie = Builder<Movie>.CreateNew()
.With(e => e.MovieFileId = 1)
.With(e => e.MovieFile = new LazyLoaded<MovieFile>(
new MovieFile
{
Size = _localMovie.Size + 100.Megabytes()
}))
.Build();
Subject.IsSatisfiedBy(_localMovie, null).Accepted.Should().BeTrue();
}
[Test]
public void should_be_reject_if_file_size_is_the_same()
{
_localMovie.Movie = Builder<Movie>.CreateNew()
.With(e => e.MovieFileId = 1)
.With(e => e.MovieFile = new LazyLoaded<MovieFile>(
new MovieFile
{
Size = _localMovie.Size
}))
.Build();
Subject.IsSatisfiedBy(_localMovie, null).Accepted.Should().BeFalse();
}
}
}
@@ -1,4 +1,4 @@
using System.IO; using System.IO;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
@@ -13,66 +13,56 @@ namespace NzbDrone.Core.Test.Metadata.Consumers.Roksbox
[TestFixture] [TestFixture]
public class FindMetadataFileFixture : CoreTest<RoksboxMetadata> public class FindMetadataFileFixture : CoreTest<RoksboxMetadata>
{ {
private Series _series; private Movie _movie;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_series = Builder<Series>.CreateNew() _movie = Builder<Movie>.CreateNew()
.With(s => s.Path = @"C:\Test\TV\The.Series".AsOsAgnostic()) .With(s => s.Path = @"C:\Test\Movies\The.Movie.2011".AsOsAgnostic())
.Build(); .Build();
} }
[Test] [Test]
public void should_return_null_if_filename_is_not_handled() public void should_return_null_if_filename_is_not_handled()
{ {
var path = Path.Combine(_series.Path, "file.jpg"); var path = Path.Combine(_movie.Path, "file.jpg");
Subject.FindMetadataFile(_series, path).Should().BeNull(); Subject.FindMetadataFile(_movie, path).Should().BeNull();
} }
[TestCase("Specials")] [TestCase(".xml", MetadataType.MovieMetadata)]
[TestCase("specials")] [TestCase(".jpg", MetadataType.MovieImage)]
[TestCase("Season 1")] public void should_return_metadata_for_movie_if_valid_file_for_movie(string extension, MetadataType type)
public void should_return_season_image(string folder)
{ {
var path = Path.Combine(_series.Path, folder, folder + ".jpg"); var path = Path.Combine(_movie.Path, "the.movie.2011" + extension);
Subject.FindMetadataFile(_series, path).Type.Should().Be(MetadataType.SeasonImage); Subject.FindMetadataFile(_movie, path).Type.Should().Be(type);
}
[TestCase(".xml", MetadataType.EpisodeMetadata)]
[TestCase(".jpg", MetadataType.EpisodeImage)]
public void should_return_metadata_for_episode_if_valid_file_for_episode(string extension, MetadataType type)
{
var path = Path.Combine(_series.Path, "the.series.s01e01.episode" + extension);
Subject.FindMetadataFile(_series, path).Type.Should().Be(type);
} }
[TestCase(".xml")] [TestCase(".xml")]
[TestCase(".jpg")] [TestCase(".jpg")]
public void should_return_null_if_not_valid_file_for_episode(string extension) public void should_return_null_if_not_valid_file_for_movie(string extension)
{ {
var path = Path.Combine(_series.Path, "the.series.episode" + extension); var path = Path.Combine(_movie.Path, "the.movie.here" + extension);
Subject.FindMetadataFile(_series, path).Should().BeNull(); Subject.FindMetadataFile(_movie, path).Should().BeNull();
} }
[Test] [Test]
public void should_not_return_metadata_if_image_file_is_a_thumb() public void should_not_return_metadata_if_image_file_is_a_thumb()
{ {
var path = Path.Combine(_series.Path, "the.series.s01e01.episode-thumb.jpg"); var path = Path.Combine(_movie.Path, "the.movie.2011-thumb.jpg");
Subject.FindMetadataFile(_series, path).Should().BeNull(); Subject.FindMetadataFile(_movie, path).Should().BeNull();
} }
[Test] [Test]
public void should_return_series_image_for_folder_jpg_in_series_folder() public void should_return_movie_image_for_folder_jpg_in_movie_folder()
{ {
var path = Path.Combine(_series.Path, new DirectoryInfo(_series.Path).Name + ".jpg"); var path = Path.Combine(_movie.Path, new DirectoryInfo(_movie.Path).Name + ".jpg");
Subject.FindMetadataFile(_series, path).Type.Should().Be(MetadataType.SeriesImage); Subject.FindMetadataFile(_movie, path).Type.Should().Be(MetadataType.MovieImage);
} }
} }
} }
@@ -1,4 +1,4 @@
using System.IO; using System.IO;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
@@ -13,58 +13,48 @@ namespace NzbDrone.Core.Test.Metadata.Consumers.Wdtv
[TestFixture] [TestFixture]
public class FindMetadataFileFixture : CoreTest<WdtvMetadata> public class FindMetadataFileFixture : CoreTest<WdtvMetadata>
{ {
private Series _series; private Movie _movie;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_series = Builder<Series>.CreateNew() _movie = Builder<Movie>.CreateNew()
.With(s => s.Path = @"C:\Test\TV\The.Series".AsOsAgnostic()) .With(s => s.Path = @"C:\Test\Movies\The.Movie".AsOsAgnostic())
.Build(); .Build();
} }
[Test] [Test]
public void should_return_null_if_filename_is_not_handled() public void should_return_null_if_filename_is_not_handled()
{ {
var path = Path.Combine(_series.Path, "file.jpg"); var path = Path.Combine(_movie.Path, "file.jpg");
Subject.FindMetadataFile(_series, path).Should().BeNull(); Subject.FindMetadataFile(_movie, path).Should().BeNull();
} }
[TestCase("Specials")] [TestCase(".xml", MetadataType.MovieMetadata)]
[TestCase("specials")] [TestCase(".metathumb", MetadataType.MovieImage)]
[TestCase("Season 1")] public void should_return_metadata_for_movie_if_valid_file_for_movie(string extension, MetadataType type)
public void should_return_season_image(string folder)
{ {
var path = Path.Combine(_series.Path, folder, "folder.jpg"); var path = Path.Combine(_movie.Path, "the.movie.2011" + extension);
Subject.FindMetadataFile(_series, path).Type.Should().Be(MetadataType.SeasonImage); Subject.FindMetadataFile(_movie, path).Type.Should().Be(type);
}
[TestCase(".xml", MetadataType.EpisodeMetadata)]
[TestCase(".metathumb", MetadataType.EpisodeImage)]
public void should_return_metadata_for_episode_if_valid_file_for_episode(string extension, MetadataType type)
{
var path = Path.Combine(_series.Path, "the.series.s01e01.episode" + extension);
Subject.FindMetadataFile(_series, path).Type.Should().Be(type);
} }
[TestCase(".xml")] [TestCase(".xml")]
[TestCase(".metathumb")] [TestCase(".metathumb")]
public void should_return_null_if_not_valid_file_for_episode(string extension) public void should_return_null_if_not_valid_file_for_movie(string extension)
{ {
var path = Path.Combine(_series.Path, "the.series.episode" + extension); var path = Path.Combine(_movie.Path, "the.movie" + extension);
Subject.FindMetadataFile(_series, path).Should().BeNull(); Subject.FindMetadataFile(_movie, path).Should().BeNull();
} }
[Test] [Test]
public void should_return_series_image_for_folder_jpg_in_series_folder() public void should_return_movie_image_for_folder_jpg_in_movie_folder()
{ {
var path = Path.Combine(_series.Path, "folder.jpg"); var path = Path.Combine(_movie.Path, "folder.jpg");
Subject.FindMetadataFile(_series, path).Type.Should().Be(MetadataType.SeriesImage); Subject.FindMetadataFile(_movie, path).Type.Should().Be(MetadataType.MovieImage);
} }
} }
} }
File diff suppressed because it is too large Load Diff
+16 -16
View File
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="AutoMoq" version="1.8.1.0" targetFramework="net40" /> <package id="AutoMoq" version="1.8.1.0" targetFramework="net40" />
<package id="CommonServiceLocator" version="1.0" targetFramework="net40" /> <package id="CommonServiceLocator" version="1.0" targetFramework="net40" />
<package id="FluentAssertions" version="4.18.0" targetFramework="net40" /> <package id="FluentAssertions" version="4.18.0" targetFramework="net40" />
<package id="FluentMigrator" version="1.6.2" targetFramework="net40" /> <package id="FluentMigrator" version="1.6.2" targetFramework="net40" />
<package id="FluentMigrator.Runner" version="1.6.2" targetFramework="net40" /> <package id="FluentMigrator.Runner" version="1.6.2" targetFramework="net40" />
<package id="FluentValidation" version="6.2.1.0" targetFramework="net40" /> <package id="FluentValidation" version="6.2.1.0" targetFramework="net40" />
<package id="Moq" version="4.0.10827" /> <package id="Moq" version="4.0.10827" />
<package id="NBuilder" version="4.0.0" targetFramework="net40" /> <package id="NBuilder" version="4.0.0" targetFramework="net40" />
<package id="NCrunch.Framework" version="1.46.0.9" targetFramework="net40" /> <package id="NCrunch.Framework" version="1.46.0.9" targetFramework="net40" />
<package id="Newtonsoft.Json" version="6.0.6" targetFramework="net40" /> <package id="Newtonsoft.Json" version="6.0.6" targetFramework="net40" />
<package id="NLog" version="4.3.11" targetFramework="net40" /> <package id="NLog" version="4.5.0-rc06" targetFramework="net40" />
<package id="NUnit" version="3.5.0" targetFramework="net40" /> <package id="NUnit" version="3.5.0" targetFramework="net40" />
<package id="Prowlin" version="0.9.4456.26422" targetFramework="net40" /> <package id="Prowlin" version="0.9.4456.26422" targetFramework="net40" />
<package id="Unity" version="2.1.505.2" targetFramework="net40" /> <package id="Unity" version="2.1.505.2" targetFramework="net40" />
</packages> </packages>
+1 -1
View File
@@ -4,7 +4,7 @@ namespace NzbDrone.Core.Backup
{ {
public class Backup public class Backup
{ {
public string Path { get; set; } public string Name { get; set; }
public BackupType Type { get; set; } public BackupType Type { get; set; }
public DateTime Time { get; set; } public DateTime Time { get; set; }
} }

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