mirror of
https://github.com/Radarr/Radarr.git
synced 2026-04-18 21:35:51 -04:00
Compare commits
341 Commits
v0.2.0.299
...
v0.2.0.692
| Author | SHA1 | Date | |
|---|---|---|---|
| a0486b54a6 | |||
| 7ed0db10cb | |||
| e94591a290 | |||
| fccd02a0ca | |||
| b49f0e70ed | |||
| fc1585e900 | |||
| b36ac091fc | |||
| ab28bfead2 | |||
| 3ab3fbfd57 | |||
| d133ee3143 | |||
| 98b6932ffe | |||
| 58e81a916c | |||
| 817f48448c | |||
| 1eca179b4e | |||
| b05d505bce | |||
| ace426e69f | |||
| a57c9917cc | |||
| 9e84b4a782 | |||
| 494ef16735 | |||
| 5a0f02007f | |||
| b1025e7229 | |||
| 446d661345 | |||
| 3eb351823e | |||
| 835a7cffa1 | |||
| e728330ce4 | |||
| 6f3118c142 | |||
| b568072140 | |||
| 7db92c6bcf | |||
| f1e8a9acfc | |||
| dae389ce64 | |||
| 7c3d8c8ff9 | |||
| 8ca66fb61a | |||
| 064844ac0c | |||
| 5540594ecf | |||
| 433ae019de | |||
| 10091b9454 | |||
| 475851775f | |||
| 0fff862fd2 | |||
| 23754c49dc | |||
| fbf790e9fd | |||
| 6d00bd0f7a | |||
| 5bf95e0d9e | |||
| 8bb4b02be7 | |||
| b26a036eed | |||
| ef57882291 | |||
| 32a2407ad1 | |||
| 33b48eec95 | |||
| 3790dc9109 | |||
| 343d849536 | |||
| c36b259fa9 | |||
| 6463913f22 | |||
| e39deb4bdc | |||
| 9ca2c21547 | |||
| f376360611 | |||
| 3e966d4d58 | |||
| e036267c33 | |||
| 7d4378ca7a | |||
| ee1ebfd893 | |||
| 403fd0f0c0 | |||
| fc5ac8219f | |||
| 600a433faa | |||
| 5609facd9d | |||
| 36ea6c6b99 | |||
| 56ac87c760 | |||
| 47753c47a5 | |||
| 712c0eb84a | |||
| 8765155223 | |||
| 63d7596e98 | |||
| 640edf0cce | |||
| 280445e756 | |||
| bae8d5e9a4 | |||
| 07254adf91 | |||
| d33ec334f3 | |||
| a80e9f11f2 | |||
| 4a0ef984fb | |||
| 685012280b | |||
| 6963078669 | |||
| 7182081fca | |||
| 87ee360818 | |||
| ad222570be | |||
| 680681c8bd | |||
| e2ae7536ad | |||
| 98c117a460 | |||
| c54f8806b3 | |||
| 454d5c37f9 | |||
| e9f084fd81 | |||
| d1bbcdc039 | |||
| c17deb7d92 | |||
| 7066b078ab | |||
| b4bb8875d3 | |||
| cb596488f2 | |||
| 3403ddf993 | |||
| 17118cf24d | |||
| 27ab70333c | |||
| f4031f1e5f | |||
| a9154559b8 | |||
| 0f2f2e4b32 | |||
| 6deefbb997 | |||
| 43a71da0a7 | |||
| 499e46e10a | |||
| 3f013271c9 | |||
| 529591bc18 | |||
| 79307d3c25 | |||
| 8f79563cf0 | |||
| 0dc67419be | |||
| 066c746e5f | |||
| 31fcac5bd9 | |||
| 1b29b89bf1 | |||
| c593f4250d | |||
| 59c07cc5f3 | |||
| 2b1023e768 | |||
| f10af08f95 | |||
| 18fcda5fd6 | |||
| 1ccfde334f | |||
| 421a191650 | |||
| 35e046bb87 | |||
| 8ece7e8b4d | |||
| fadc5f0099 | |||
| 680430737d | |||
| 5d3750a295 | |||
| e525f23281 | |||
| 2e41763b92 | |||
| 5b70ecaee0 | |||
| 06ad30397b | |||
| f2218006a1 | |||
| e26fd22540 | |||
| 05a83e4e95 | |||
| 3b3fe197ca | |||
| 149c5292f1 | |||
| 3cf5301e46 | |||
| 4b1f7da317 | |||
| a25c056def | |||
| 0db27d9029 | |||
| e6dfd89300 | |||
| db6e91cd95 | |||
| 1bae7bb623 | |||
| 7cf2a8cb62 | |||
| 1a4fb6e7bb | |||
| ae0fc019e5 | |||
| 3f438563b8 | |||
| 51e0cdf982 | |||
| 3d9fd3ff25 | |||
| 866cec096d | |||
| 71eaa98518 | |||
| 2899bbf330 | |||
| 72f40470a7 | |||
| 7c5c4e7594 | |||
| 77f369caab | |||
| 571730ddec | |||
| 5c22d0b61d | |||
| fe0a54685f | |||
| 2d951bf378 | |||
| 54df46df8c | |||
| b9eab860f5 | |||
| 24a394bf46 | |||
| af2b5c2f1c | |||
| 961a6d89a4 | |||
| b81d8c4678 | |||
| 73f0916fa0 | |||
| 6c10d77721 | |||
| d9a3f303e7 | |||
| 1894d493f3 | |||
| 88140dd3aa | |||
| fb1d13bc58 | |||
| b71031f6d3 | |||
| d03f4a515e | |||
| 0668f12e62 | |||
| 0083e95019 | |||
| c7fcfe04be | |||
| e11455c964 | |||
| 4d0226e0d5 | |||
| 7cfa0531dc | |||
| 5bd008f468 | |||
| f36db9f77b | |||
| 4640519438 | |||
| 597a070383 | |||
| 07d3b1b3a5 | |||
| 665832f0cc | |||
| 0d60375a56 | |||
| d4eeb666e0 | |||
| 593fa4239f | |||
| 3c1b5385ba | |||
| ea22f5db79 | |||
| e32bb6dbbf | |||
| f897591d32 | |||
| cf8f690d7a | |||
| e3dc31cca5 | |||
| ddc6ccbf15 | |||
| 18773bc665 | |||
| 91c71ed6a0 | |||
| f3b5d9a1d6 | |||
| 83deba1c99 | |||
| 9787cf6cdd | |||
| 7433e89467 | |||
| 0aa6066a6f | |||
| 3dd14c72c8 | |||
| 0d85c7435c | |||
| a3c0f4cb3f | |||
| 3f2da1441f | |||
| f49d68ad6a | |||
| f138d4f677 | |||
| aa977eb2d5 | |||
| e0f72e4853 | |||
| 83560ad937 | |||
| 5cace1d857 | |||
| 39322cbbca | |||
| 46daa11c46 | |||
| 98e2bd00ab | |||
| 0f2234bcdc | |||
| 3f05ef810e | |||
| aab425ee5b | |||
| f7bc889723 | |||
| cc4fb5a40b | |||
| bbb4880ba4 | |||
| a2098a5797 | |||
| 93bdac31ea | |||
| 92a588751a | |||
| 272db9d483 | |||
| 9d75fc18a1 | |||
| d8d60c6bb0 | |||
| 8c656626d6 | |||
| b773119193 | |||
| bdc0db3357 | |||
| f3b3c9ff6a | |||
| 7d394dcff2 | |||
| ff11388009 | |||
| b492fece6c | |||
| 5394f1dee9 | |||
| e742371d15 | |||
| d03ee006fc | |||
| 897d76c4a2 | |||
| 349dd12161 | |||
| d84e6c84f5 | |||
| dfcdf8871c | |||
| 7122962dc8 | |||
| 6432928b7d | |||
| ed1d6e59b5 | |||
| 8b2d85aee5 | |||
| 392d63fe57 | |||
| 1c086b057a | |||
| 6bbe55a46c | |||
| 7a269efcbc | |||
| 06bd6db601 | |||
| 3dc9d3a420 | |||
| 91ba503700 | |||
| 28d27dca5c | |||
| e33265b58d | |||
| 22fcb04773 | |||
| f9f67873ad | |||
| b1d345f165 | |||
| 1c6a32b684 | |||
| 55ac2dd1bb | |||
| 997dce288d | |||
| 4d745d3600 | |||
| dbd1080f5c | |||
| 76963d8109 | |||
| 6b106c1b38 | |||
| 0016cc59af | |||
| 8b9d0f7b19 | |||
| 3a4b01cf6f | |||
| 15acb9d204 | |||
| 21fa96f78f | |||
| fe4e11d9c1 | |||
| d22d5fcfc3 | |||
| cdca4a8585 | |||
| 46552785f5 | |||
| 816c62979a | |||
| ca164c2a24 | |||
| bf3c6f95eb | |||
| f07f2e77f6 | |||
| 50fdbd896c | |||
| bab7bd20cd | |||
| 0678908fd9 | |||
| 9d29776e8e | |||
| 140a220340 | |||
| 731e607666 | |||
| 97ee66465d | |||
| a0050fedd3 | |||
| 89e5001bad | |||
| 056fb154a8 | |||
| 3edc2b80cf | |||
| a1745cd02e | |||
| 1c0f9b64ca | |||
| 7d6a518f30 | |||
| 9f2fcebc24 | |||
| 91295f50b0 | |||
| 68bf97f52c | |||
| 363048e68e | |||
| 9c20c0b889 | |||
| 50891e5dd7 | |||
| f393a95501 | |||
| a68dd6d2f7 | |||
| dadf6708ab | |||
| 7a86c78896 | |||
| 81688399c0 | |||
| 1e28a2e5d4 | |||
| c5bb259555 | |||
| 0d5d75d6ea | |||
| 5bae9bbbcc | |||
| a3e681078f | |||
| 758228e159 | |||
| 1b900a006f | |||
| 9b5c5169ef | |||
| e78a55ac6e | |||
| e82cf70399 | |||
| e7d65ee4ae | |||
| 1db3669afa | |||
| 93e55b7575 | |||
| f850c65b56 | |||
| 297348fffe | |||
| 07ff6558d1 | |||
| 85843efcb0 | |||
| 3d4b1c3be5 | |||
| a3f389af5e | |||
| 1aeb3c6fd6 | |||
| 6ab6c016c0 | |||
| a1961603d7 | |||
| 50ac95dec5 | |||
| a16e46cf38 | |||
| ea33b75764 | |||
| 31e657d052 | |||
| fe0dfef83c | |||
| bc1a47ff5a | |||
| 4e8089dd42 | |||
| 6dc9f90a8b | |||
| 1aae3ae2b5 | |||
| 75436bcce4 | |||
| 61df3ef40e | |||
| f45aab27d1 | |||
| f477c46406 | |||
| 2af07d7e0d | |||
| df691488a9 | |||
| 800e7ae508 | |||
| fcf156293e | |||
| 94f44a0eb7 | |||
| 1e2c28f67a | |||
| 62b45f7ea7 | |||
| f577590ad6 | |||
| 0941247f63 | |||
| 3170060f37 | |||
| 35b384439f |
@@ -1,9 +1,16 @@
|
|||||||
|
**Description:**
|
||||||
|
|
||||||
|
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/FAQ
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
**Radarr Version:**
|
||||||
|
|
||||||
|
**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.
|
||||||
Provide a description of the feature request or bug, the more details the better.
|
|
||||||
When possible include a log!
|
|
||||||
|
|
||||||
Please use our [Discord server](https://discord.gg/NWYch8M) for support or longer discussions.
|
|
||||||
|
|||||||
@@ -2,13 +2,11 @@
|
|||||||
YES | NO
|
YES | NO
|
||||||
|
|
||||||
#### Description
|
#### Description
|
||||||
A few sentences describing the overall goals of the pull request's commits.
|
|
||||||
|
|
||||||
#### Todos
|
#### Todos
|
||||||
- [ ] Tests
|
- [ ] Tests
|
||||||
- [ ] Documentation
|
|
||||||
|
|
||||||
|
|
||||||
#### Issues Fixed or Closed by this PR
|
#### Issues Fixed or Closed by this PR
|
||||||
|
|
||||||
*
|
* #
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ addons:
|
|||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
- nodejs
|
- nodejs
|
||||||
- npm
|
# - npm apparently not needed anymore.
|
||||||
script:
|
script:
|
||||||
- ./build.sh
|
- ./build.sh
|
||||||
- chmod +x test.sh
|
- chmod +x test.sh
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
@@ -1,3 +1,41 @@
|
|||||||
|
<p align="center">
|
||||||
|
<img src="/Logo/text256.png" alt="Radarr">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
Radarr is an __independent__ fork of [Sonarr](https://github.com/Sonarr/Sonarr) reworked for automatically downloading movies via Usenet and BitTorrent.
|
||||||
|
|
||||||
|
The project was inspired by other Usenet/BitTorrent movie downloaders such as CouchPotato.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
[](https://github.com/Radarr/Radarr/wiki/Installation)
|
||||||
|
[](https://github.com/Radarr/Radarr/wiki/Docker)
|
||||||
|
[](https://github.com/Radarr/Radarr/wiki/Setup-Guide)
|
||||||
|
[](https://github.com/Radarr/Radarr/wiki/FAQ)
|
||||||
|
|
||||||
|
* [Install Radarr for your desired OS](https://github.com/Radarr/Radarr/wiki/Installation) *or* use [Docker](https://github.com/Radarr/Radarr/wiki/Docker)
|
||||||
|
* *For Linux users*, run `radarr` and *optionally* have [Radarr start automatically](https://github.com/Radarr/Radarr/wiki/Autostart-on-Linux)
|
||||||
|
* Connect to the UI through <http://localhost:7878> or <http://your-ip:7878> in your web browser
|
||||||
|
* See the [Setup Guide](https://github.com/Radarr/Radarr/wiki/Setup-Guide) for further configuration
|
||||||
|
|
||||||
|
## Downloads
|
||||||
|
|
||||||
|
[](https://github.com/Radarr/Radarr/releases)
|
||||||
|
[](https://ci.appveyor.com/project/galli-leo/radarr-usby1/build/artifacts)
|
||||||
|
|
||||||
|
[](https://store.docker.com/community/images/linuxserver/radarr)
|
||||||
|
[](https://store.docker.com/community/images/hotio/radarr)
|
||||||
|
[](https://store.docker.com/community/images/lsioarmhf/radarr)
|
||||||
|
[](https://store.docker.com/community/images/lsioarmhf/radarr-aarch64)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
[](https://discord.gg/AD3UP37)
|
||||||
|
[](https://www.reddit.com/r/radarr)
|
||||||
|
[](http://feathub.com/Radarr/Radarr)
|
||||||
|
[](https://github.com/Radarr/Radarr/issues)
|
||||||
|
[](https://github.com/Radarr/Radarr/wiki)
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
|
|
||||||
[](https://github.com/Radarr/Radarr/issues)
|
[](https://github.com/Radarr/Radarr/issues)
|
||||||
@@ -12,27 +50,9 @@
|
|||||||
| AppVeyor | [](https://ci.appveyor.com/project/galli-leo/Radarr) | [](https://ci.appveyor.com/project/galli-leo/Radarr-usby1) |
|
| AppVeyor | [](https://ci.appveyor.com/project/galli-leo/Radarr) | [](https://ci.appveyor.com/project/galli-leo/Radarr-usby1) |
|
||||||
| Travis | [](https://travis-ci.org/Radarr/Radarr) | [](https://travis-ci.org/Radarr/Radarr) |
|
| Travis | [](https://travis-ci.org/Radarr/Radarr) | [](https://travis-ci.org/Radarr/Radarr) |
|
||||||
|
|
||||||
A fork of [Sonarr](https://github.com/Sonarr/Sonarr) to work with movies à la Couchpotato.
|
**This project works independently of Sonarr and will not interfere with it.**
|
||||||
|
|
||||||
**This fork works independently of Sonarr and will not interfere with it.**
|
Radarr is currently undergoing rapid development and pull requests are actively added into the repository.
|
||||||
|
|
||||||
## Downloads
|
|
||||||
|
|
||||||
[](https://github.com/Radarr/Radarr/releases)
|
|
||||||
|
|
||||||
[](https://ci.appveyor.com/project/galli-leo/radarr-usby1/build/artifacts)
|
|
||||||
|
|
||||||
[](https://store.docker.com/community/images/linuxserver/radarr)
|
|
||||||
[](https://store.docker.com/community/images/lsioarmhf/radarr)
|
|
||||||
[](https://store.docker.com/community/images/lsioarmhf/radarr-aarch64)
|
|
||||||
|
|
||||||
To connect to the UI, fire up your browser and open <http://localhost:7878> or <http://your-ip:7878>.
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
[](https://discord.gg/AD3UP37)
|
|
||||||
[](https://www.reddit.com/r/radarr)
|
|
||||||
[](https://github.com/Radarr/Radarr/issues)
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
@@ -52,19 +72,25 @@ To connect to the UI, fire up your browser and open <http://localhost:7878> or <
|
|||||||
* New PassThePopcorn Indexer
|
* New PassThePopcorn Indexer
|
||||||
* QBittorrent, Deluge, rTorrent, Transmission and uTorrent download client (Other clients are coming)
|
* QBittorrent, Deluge, rTorrent, Transmission and uTorrent download client (Other clients are coming)
|
||||||
* New TorrentPotato Indexer (Works well with [Jackett](https://github.com/Jackett/Jackett))
|
* New TorrentPotato Indexer (Works well with [Jackett](https://github.com/Jackett/Jackett))
|
||||||
|
* Scanning PreDB to know when a new release is available
|
||||||
|
* Importing movies from various online sources, such as IMDb Watchlists (A complete list can be found [here](https://github.com/Radarr/Radarr/issues/114))
|
||||||
|
* Full integration with Kodi, Plex (notification, library update)
|
||||||
* And a beautiful UI
|
* And a beautiful UI
|
||||||
|
|
||||||
### Planned Features
|
### Planned Features
|
||||||
|
|
||||||
* Scanning PreDB to know when a new release is available
|
* Downloading Metadata such as trailers or subtitles (\*)
|
||||||
* Fixing the other Indexers and download clients
|
* Adding metadata such as posters and information for Kodi and others to use (\*)
|
||||||
* Importing movies from various online sources, such as IMDb Watchlists (A complete list can be found [here](https://github.com/Radarr/Radarr/issues/114))
|
* Dynamically renaming folders with quality info, etc. (\*)
|
||||||
* Full integration with Kodi, Plex (notification, library update, metadata)
|
* Supporting custom folder structures, such as all movie files in one folder (\*)
|
||||||
|
* Supporting multiple editions per movies (waiting on The Movie Database to finish their implementation)
|
||||||
|
* Supporting collections of movies, such as James Bond
|
||||||
|
|
||||||
##Feature Requests
|
**Note:** All features marked with (\*) are set to be in the first release of Radarr.
|
||||||
[](http://feathub.com/Radarr/Radarr)
|
|
||||||
|
|
||||||
## Configuring Development Environment
|
#### [Feature Requests](http://feathub.com/Radarr/Radarr)
|
||||||
|
|
||||||
|
## Configuring the Development Environment
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
|
|
||||||
@@ -90,7 +116,7 @@ To connect to the UI, fire up your browser and open <http://localhost:7878> or <
|
|||||||
|
|
||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
[JetBrains](http://www.jetbrains.com) for providing us with free licenses to their great tools:
|
Thanks to [JetBrains](http://www.jetbrains.com) for providing us with free licenses to their great tools:
|
||||||
* [ReSharper](http://www.jetbrains.com/resharper)
|
* [ReSharper](http://www.jetbrains.com/resharper)
|
||||||
* [WebStorm](http://www.jetbrains.com/webstorm)
|
* [WebStorm](http://www.jetbrains.com/webstorm)
|
||||||
* [TeamCity](http://www.jetbrains.com/teamcity)
|
* [TeamCity](http://www.jetbrains.com/teamcity)
|
||||||
|
|||||||
+17
-12
@@ -1,9 +1,5 @@
|
|||||||
version: '0.2.0.{build}'
|
version: '0.2.0.{build}'
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- develop
|
|
||||||
|
|
||||||
assembly_info:
|
assembly_info:
|
||||||
patch: true
|
patch: true
|
||||||
file: 'src\NzbDrone.Common\Properties\SharedAssemblyInfo.cs'
|
file: 'src\NzbDrone.Common\Properties\SharedAssemblyInfo.cs'
|
||||||
@@ -20,17 +16,18 @@ install:
|
|||||||
build_script:
|
build_script:
|
||||||
- ps: ./build-appveyor.ps1
|
- ps: ./build-appveyor.ps1
|
||||||
|
|
||||||
test: off
|
# test: off
|
||||||
# test:
|
test:
|
||||||
# assemblies:
|
assemblies:
|
||||||
# - '_tests\*Test.dll'
|
- '_tests\*Test.dll'
|
||||||
# categories:
|
categories:
|
||||||
# except:
|
except:
|
||||||
# - IntegrationTest
|
- IntegrationTest
|
||||||
# - AutomationTest
|
- AutomationTest
|
||||||
|
|
||||||
artifacts:
|
artifacts:
|
||||||
- path: '_artifacts\*.zip'
|
- path: '_artifacts\*.zip'
|
||||||
|
- path: '_artifacts\*.exe'
|
||||||
- path: '_artifacts\*.tar.gz'
|
- path: '_artifacts\*.tar.gz'
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
@@ -40,9 +37,17 @@ cache:
|
|||||||
pull_requests:
|
pull_requests:
|
||||||
do_not_increment_build_number: true
|
do_not_increment_build_number: true
|
||||||
|
|
||||||
|
on_failure:
|
||||||
|
- ps: Get-ChildItem .\_artifacts\*.zip | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
|
||||||
|
- ps: Get-ChildItem .\_artifacts\*.exe | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
|
||||||
|
- ps: Get-ChildItem .\_artifacts\*.tar.gz | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
|
||||||
|
|
||||||
only_commits:
|
only_commits:
|
||||||
files:
|
files:
|
||||||
- src/
|
- src/
|
||||||
- osx/
|
- osx/
|
||||||
- gulp/
|
- gulp/
|
||||||
- logo/
|
- logo/
|
||||||
|
- setup/
|
||||||
|
- appveyor.yml
|
||||||
|
- build-appveyor.cake
|
||||||
|
|||||||
+18
-8
@@ -104,11 +104,13 @@ Task("Compile").Does(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
Task("Gulp").Does(() => {
|
Task("Gulp").Does(() => {
|
||||||
Npm
|
NpmInstall(new NpmInstallSettings {
|
||||||
.WithLogLevel(NpmLogLevel.Silent)
|
LogLevel = NpmLogLevel.Silent,
|
||||||
.FromPath(".")
|
WorkingDirectory = "./",
|
||||||
.Install()
|
Production = true
|
||||||
.RunScript("build");
|
});
|
||||||
|
|
||||||
|
NpmRunScript("build");
|
||||||
});
|
});
|
||||||
|
|
||||||
Task("PackageMono").Does(() => {
|
Task("PackageMono").Does(() => {
|
||||||
@@ -167,7 +169,7 @@ Task("PackageOsx").Does(() => {
|
|||||||
CopyFiles(sourceFolder + "/Libraries/MediaInfo/*.dylib", outputFolderOsx);
|
CopyFiles(sourceFolder + "/Libraries/MediaInfo/*.dylib", outputFolderOsx);
|
||||||
|
|
||||||
// Adding Startup script
|
// Adding Startup script
|
||||||
CopyFile("./osx/Sonarr", outputFolderOsx + "/Sonarr");
|
CopyFile("./osx/Radarr", outputFolderOsx + "/Radarr");
|
||||||
});
|
});
|
||||||
|
|
||||||
Task("PackageOsxApp").Does(() => {
|
Task("PackageOsxApp").Does(() => {
|
||||||
@@ -264,6 +266,13 @@ Task("ArtifactsWindows").Does(() => {
|
|||||||
CopyDirectory(outputFolder, artifactsFolderWindows + "/Radarr");
|
CopyDirectory(outputFolder, artifactsFolderWindows + "/Radarr");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Task("ArtifactsWindowsInstaller").Does(() => {
|
||||||
|
InnoSetup("./setup/nzbdrone.iss", new InnoSetupSettings {
|
||||||
|
OutputDirectory = artifactsFolder,
|
||||||
|
ToolPath = "./setup/inno/ISCC.exe"
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
Task("ArtifactsLinux").Does(() => {
|
Task("ArtifactsLinux").Does(() => {
|
||||||
CopyDirectory(outputFolderMono, artifactsFolderLinux + "/Radarr");
|
CopyDirectory(outputFolderMono, artifactsFolderLinux + "/Radarr");
|
||||||
});
|
});
|
||||||
@@ -280,7 +289,7 @@ Task("CompressArtifacts").Does(() => {
|
|||||||
var prefix = "";
|
var prefix = "";
|
||||||
|
|
||||||
if (AppVeyor.IsRunningOnAppVeyor) {
|
if (AppVeyor.IsRunningOnAppVeyor) {
|
||||||
prefix += AppVeyor.Environment.Repository.Branch + ".";
|
prefix += AppVeyor.Environment.Repository.Branch.Replace("/", "-") + ".";
|
||||||
prefix += AppVeyor.Environment.Build.Version + ".";
|
prefix += AppVeyor.Environment.Build.Version + ".";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,6 +302,7 @@ Task("CompressArtifacts").Does(() => {
|
|||||||
Task("Artifacts")
|
Task("Artifacts")
|
||||||
.IsDependentOn("CleanArtifacts")
|
.IsDependentOn("CleanArtifacts")
|
||||||
.IsDependentOn("ArtifactsWindows")
|
.IsDependentOn("ArtifactsWindows")
|
||||||
|
.IsDependentOn("ArtifactsWindowsInstaller")
|
||||||
.IsDependentOn("ArtifactsLinux")
|
.IsDependentOn("ArtifactsLinux")
|
||||||
.IsDependentOn("ArtifactsOsx")
|
.IsDependentOn("ArtifactsOsx")
|
||||||
.IsDependentOn("ArtifactsOsxApp")
|
.IsDependentOn("ArtifactsOsxApp")
|
||||||
@@ -300,4 +310,4 @@ Task("Artifacts")
|
|||||||
|
|
||||||
// Run
|
// Run
|
||||||
RunTarget("Build");
|
RunTarget("Build");
|
||||||
RunTarget("Artifacts");
|
RunTarget("Artifacts");
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ PackageOsx()
|
|||||||
cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderOsx
|
cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderOsx
|
||||||
|
|
||||||
echo "Adding Startup script"
|
echo "Adding Startup script"
|
||||||
cp ./osx/Sonarr $outputFolderOsx
|
cp ./osx/Radarr $outputFolderOsx
|
||||||
|
|
||||||
echo "##teamcity[progressFinish 'Creating OS X Package']"
|
echo "##teamcity[progressFinish 'Creating OS X Package']"
|
||||||
}
|
}
|
||||||
@@ -208,9 +208,9 @@ PackageTests()
|
|||||||
find $sourceFolder -path $testSearchPattern -exec cp -r -u -T "{}" $testPackageFolder \;
|
find $sourceFolder -path $testSearchPattern -exec cp -r -u -T "{}" $testPackageFolder \;
|
||||||
|
|
||||||
if [ $runtime = "dotnet" ] ; then
|
if [ $runtime = "dotnet" ] ; then
|
||||||
$nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
|
$nuget install NUnit.Runners -Version 3.2.1 -Output $testPackageFolder
|
||||||
else
|
else
|
||||||
mono $nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
|
mono $nuget install NUnit.Runners -Version 3.2.1 -Output $testPackageFolder
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cp $outputFolder/*.dll $testPackageFolder
|
cp $outputFolder/*.dll $testPackageFolder
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
input1 = """Prometheus.Special.Edition.Fan Edit.2012..BRRip.x264.AAC-m2g
|
||||||
|
Star Wars Episode IV - A New Hope (Despecialized) 1999.mkv
|
||||||
|
Prometheus.(Special.Edition.Remastered).2012.[Bluray-1080p].mkv
|
||||||
|
Prometheus Extended 2012
|
||||||
|
Prometheus Extended Directors Cut Fan Edit 2012
|
||||||
|
Prometheus Director's Cut 2012
|
||||||
|
Prometheus Directors Cut 2012
|
||||||
|
Prometheus.(Extended.Theatrical.Version.IMAX).BluRay.1080p.2012.asdf
|
||||||
|
2001 A Space Odyssey Director's Cut (1968).mkv
|
||||||
|
2001: A Space Odyssey (Extended Directors Cut FanEdit) Bluray 1080p 1968
|
||||||
|
A Fake Movie 2035 Directors 2012.mkv
|
||||||
|
Blade Runner Director's Cut 2049.mkv
|
||||||
|
Prometheus 50th Anniversary Edition 2012.mkv
|
||||||
|
Movie 2in1 2012.mkv
|
||||||
|
Movie IMAX 2012.mkv"""
|
||||||
|
|
||||||
|
output1 = """Special.Edition.Fan Edit BRRip.x264.AAC-m2g
|
||||||
|
Despecialized mkv
|
||||||
|
Special.Edition.Remastered Bluray-1080p].mkv
|
||||||
|
Extended mkv
|
||||||
|
Extended Directors Cut Fan Edit mkv
|
||||||
|
Director's Cut mkv
|
||||||
|
Directors Cut mkv
|
||||||
|
Extended.Theatrical.Version.IMAX asdf
|
||||||
|
Director's Cut mkv
|
||||||
|
Extended Directors Cut FanEdit mkv
|
||||||
|
Directors mkv
|
||||||
|
Director's Cut mkv
|
||||||
|
50th Anniversary Edition mkv
|
||||||
|
2in1 mkv
|
||||||
|
IMAX mkv"""
|
||||||
|
|
||||||
|
inputs = input1.split("\n")
|
||||||
|
outputs = output1.split("\n")
|
||||||
|
real_o = []
|
||||||
|
for output in outputs:
|
||||||
|
real_o.append(output.split(" ")[0].replace(".", " ").strip())
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
|
||||||
|
for inp in inputs:
|
||||||
|
o = real_o[count]
|
||||||
|
print "[TestCase(\"{0}\", \"{1}\")]".format(inp, o)
|
||||||
|
count += 1
|
||||||
@@ -5,7 +5,7 @@ DIR=$(cd "$(dirname "$0")"; pwd)
|
|||||||
|
|
||||||
#change these values to match your app
|
#change these values to match your app
|
||||||
EXE_PATH="$DIR/Radarr.exe"
|
EXE_PATH="$DIR/Radarr.exe"
|
||||||
APPNAME="Sonarr"
|
APPNAME="Radarr"
|
||||||
|
|
||||||
#set up environment
|
#set up environment
|
||||||
if [[ -x '/opt/local/bin/mono' ]]; then
|
if [[ -x '/opt/local/bin/mono' ]]; then
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>English</string>
|
<string>English</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>Sonarr</string>
|
<string>Radarr</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>radarr.icns</string>
|
<string>radarr.icns</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
"run-sequence": "1.1.1",
|
"run-sequence": "1.1.1",
|
||||||
"streamqueue": "1.1.0",
|
"streamqueue": "1.1.0",
|
||||||
"tar.gz": "0.1.1",
|
"tar.gz": "0.1.1",
|
||||||
|
"url-search-params": "^0.6.1",
|
||||||
"webpack": "1.12.0",
|
"webpack": "1.12.0",
|
||||||
"webpack-stream": "2.1.0"
|
"webpack-stream": "2.1.0"
|
||||||
}
|
}
|
||||||
|
|||||||
+38
-29
@@ -23,20 +23,19 @@ if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
|
|||||||
DAY="`date +%d`"
|
DAY="`date +%d`"
|
||||||
else
|
else
|
||||||
VERSION=$1
|
VERSION=$1
|
||||||
|
BRANCH=$2
|
||||||
|
BRANCH=${BRANCH#refs\/heads\/}
|
||||||
|
BRANCH=${BRANCH//\//-}
|
||||||
fi
|
fi
|
||||||
outputFolder='./_output'
|
outputFolder='./_output'
|
||||||
outputFolderMono='./_output_mono'
|
outputFolderMono='./_output_mono'
|
||||||
outputFolderOsx='./_output_osx'
|
outputFolderOsx='./_output_osx'
|
||||||
outputFolderOsxApp='./_output_osx_app'
|
outputFolderOsxApp='./_output_osx_app'
|
||||||
|
|
||||||
tr -d "\r" < $outputFolderOsxApp/Radarr.app/Contents/MacOS/Sonarr > $outputFolderOsxApp/Radarr.app/Contents/MacOS/Sonarr2
|
tr -d "\r" < $outputFolderOsxApp/Radarr.app/Contents/MacOS/Radarr > $outputFolderOsxApp/Radarr.app/Contents/MacOS/Radarr2
|
||||||
rm $outputFolderOsxApp/Radarr.app/Contents/MacOS/Sonarr
|
rm $outputFolderOsxApp/Radarr.app/Contents/MacOS/Radarr
|
||||||
chmod +x $outputFolderOsxApp/Radarr.app/Contents/MacOS/Sonarr2
|
chmod +x $outputFolderOsxApp/Radarr.app/Contents/MacOS/Radarr2
|
||||||
mv $outputFolderOsxApp/Radarr.app/Contents/MacOS/Sonarr2 $outputFolderOsxApp/Radarr.app/Contents/MacOS/Sonarr >& error.log
|
mv $outputFolderOsxApp/Radarr.app/Contents/MacOS/Radarr2 $outputFolderOsxApp/Radarr.app/Contents/MacOS/Radarr >& error.log
|
||||||
|
|
||||||
cp -r $outputFolder/ Radarr_Windows_$VERSION
|
|
||||||
cp -r $outputFolderMono/ Radarr_Mono_$VERSION
|
|
||||||
cp -r $outputFolderOsxApp/ Radarr_OSX_$VERSION
|
|
||||||
|
|
||||||
if [ $runtime = "dotnet" ] ; then
|
if [ $runtime = "dotnet" ] ; then
|
||||||
./7za.exe a Radarr_Windows_$VERSION.zip ./Radarr_Windows_$VERSION/*
|
./7za.exe a Radarr_Windows_$VERSION.zip ./Radarr_Windows_$VERSION/*
|
||||||
@@ -44,25 +43,35 @@ if [ $runtime = "dotnet" ] ; then
|
|||||||
./7za.exe a -ttar -so Radarr_OSX_$VERSION.tar ./_output_osx/* | ./7za.exe a -si Radarr_OSX_$VERSION.tar.gz
|
./7za.exe a -ttar -so Radarr_OSX_$VERSION.tar ./_output_osx/* | ./7za.exe a -si Radarr_OSX_$VERSION.tar.gz
|
||||||
./7za.exe a -ttar -so Radarr_OSX_App_$VERSION.tar ./_output_osx_app/* | ./7za.exe a -si Radarr_OSX_App_$VERSION.tar.gz
|
./7za.exe a -ttar -so Radarr_OSX_App_$VERSION.tar ./_output_osx_app/* | ./7za.exe a -si Radarr_OSX_App_$VERSION.tar.gz
|
||||||
else
|
else
|
||||||
zip -r Radarr_Windows_$VERSION.zip Radarr_Windows_$VERSION/* >& /dev/null
|
cp -r $outputFolder/ Radarr
|
||||||
zip -r Radarr_Mono_$VERSION.zip Radarr_Mono_$VERSION/* >& /dev/null #TODO update for tar.gz
|
zip -r Radarr.$BRANCH.$VERSION.windows.zip Radarr
|
||||||
zip -r Radarr_OSX_$VERSION_App.zip Radarr_OSX_$VERSION/* >& /dev/null
|
rm -rf Radarr
|
||||||
|
cp -r $outputFolderMono/ Radarr
|
||||||
|
tar -zcvf Radarr.$BRANCH.$VERSION.linux.tar.gz Radarr
|
||||||
|
rm -rf Radarr
|
||||||
|
cp -r $outputFolderOsx/ Radarr
|
||||||
|
tar -zcvf Radarr.$BRANCH.$VERSION.osx.tar.gz Radarr
|
||||||
|
rm -rf Radarr
|
||||||
|
#TODO update for tar.gz
|
||||||
|
|
||||||
|
cd _output_osx_app/
|
||||||
|
zip -r ../Radarr.$BRANCH.$VERSION.osx-app.zip *
|
||||||
fi
|
fi
|
||||||
ftp -n ftp.leonardogalli.ch << END_SCRIPT
|
# ftp -n ftp.leonardogalli.ch << END_SCRIPT
|
||||||
passive
|
# passive
|
||||||
quote USER $FTP_USER
|
# quote USER $FTP_USER
|
||||||
quote PASS $FTP_PASS
|
# quote PASS $FTP_PASS
|
||||||
mkdir builds
|
# mkdir builds
|
||||||
cd builds
|
# cd builds
|
||||||
mkdir $YEAR
|
# mkdir $YEAR
|
||||||
cd $YEAR
|
# cd $YEAR
|
||||||
mkdir $MONTH
|
# mkdir $MONTH
|
||||||
cd $MONTH
|
# cd $MONTH
|
||||||
mkdir $DAY
|
# mkdir $DAY
|
||||||
cd $DAY
|
# cd $DAY
|
||||||
binary
|
# binary
|
||||||
put Radarr_Windows_$VERSION.zip
|
# put Radarr_Windows_$VERSION.zip
|
||||||
put Radarr_Mono_$VERSION.zip
|
# put Radarr_Mono_$VERSION.zip
|
||||||
put Radarr_OSX_$VERSION.zip
|
# put Radarr_OSX_$VERSION.zip
|
||||||
quit
|
# quit
|
||||||
END_SCRIPT
|
# END_SCRIPT
|
||||||
|
|||||||
+16
-16
@@ -1,35 +1,35 @@
|
|||||||
; Script generated by the Inno Setup Script Wizard.
|
; Script generated by the Inno Setup Script Wizard.
|
||||||
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
|
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
|
||||||
|
|
||||||
#define AppName "Sonarr"
|
#define AppName "Radarr"
|
||||||
#define AppPublisher "Team Sonarr"
|
#define AppPublisher "Team Radarr"
|
||||||
#define AppURL "https://sonarr.tv/"
|
#define AppURL "https://radarr.video/"
|
||||||
#define ForumsURL "https://forums.sonarr.tv/"
|
#define ForumsURL "https://github.com/Radarr/Radarr/issues"
|
||||||
#define AppExeName "NzbDrone.exe"
|
#define AppExeName "Radarr.exe"
|
||||||
#define BuildNumber "2.0"
|
#define BuildNumber "2.0"
|
||||||
#define BuildNumber GetEnv('BUILD_NUMBER')
|
#define BuildVersion GetEnv('APPVEYOR_BUILD_VERSION')
|
||||||
#define BranchName GetEnv('branch')
|
#define BranchName GetEnv('APPVEYOR_REPO_BRANCH')
|
||||||
|
|
||||||
[Setup]
|
[Setup]
|
||||||
; NOTE: The value of AppId uniquely identifies this application.
|
; NOTE: The value of AppId uniquely identifies this application.
|
||||||
; Do not use the same AppId value in installers for other applications.
|
; Do not use the same AppId value in installers for other applications.
|
||||||
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
|
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
|
||||||
AppId={{56C1065D-3523-4025-B76D-6F73F67F7F71}
|
AppId={{56C1065D-3523-4025-B76D-6F73F67F7F82}
|
||||||
AppName={#AppName}
|
AppName={#AppName}
|
||||||
AppVersion=2.0
|
AppVersion=0.2
|
||||||
AppPublisher={#AppPublisher}
|
AppPublisher={#AppPublisher}
|
||||||
AppPublisherURL={#AppURL}
|
AppPublisherURL={#AppURL}
|
||||||
AppSupportURL={#ForumsURL}
|
AppSupportURL={#ForumsURL}
|
||||||
AppUpdatesURL={#AppURL}
|
AppUpdatesURL={#AppURL}
|
||||||
DefaultDirName={commonappdata}\NzbDrone\bin
|
DefaultDirName={commonappdata}\Radarr\bin
|
||||||
DisableDirPage=yes
|
DisableDirPage=yes
|
||||||
DefaultGroupName={#AppName}
|
DefaultGroupName={#AppName}
|
||||||
DisableProgramGroupPage=yes
|
DisableProgramGroupPage=yes
|
||||||
OutputBaseFilename=NzbDrone.{#BranchName}.{#BuildNumber}
|
OutputBaseFilename=Radarr.{#BranchName}.{#BuildVersion}.installer
|
||||||
SolidCompression=yes
|
SolidCompression=yes
|
||||||
AppCopyright=Creative Commons 3.0 License
|
AppCopyright=Creative Commons 3.0 License
|
||||||
AllowUNCPath=False
|
AllowUNCPath=False
|
||||||
UninstallDisplayIcon={app}\NzbDrone.exe
|
UninstallDisplayIcon={app}\Radarr.exe
|
||||||
DisableReadyPage=True
|
DisableReadyPage=True
|
||||||
CompressionThreads=2
|
CompressionThreads=2
|
||||||
Compression=lzma2/normal
|
Compression=lzma2/normal
|
||||||
@@ -44,7 +44,7 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
|
|||||||
Name: "windowsService"; Description: "Install as a Windows Service"
|
Name: "windowsService"; Description: "Install as a Windows Service"
|
||||||
|
|
||||||
[Files]
|
[Files]
|
||||||
Source: "..\_output\NzbDrone.exe"; DestDir: "{app}"; Flags: ignoreversion
|
Source: "..\_output\Radarr.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||||
Source: "..\_output\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
Source: "..\_output\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||||||
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
||||||
|
|
||||||
@@ -53,8 +53,8 @@ Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Parameters: "/icon"
|
|||||||
Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Parameters: "/icon"
|
Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Parameters: "/icon"
|
||||||
|
|
||||||
[Run]
|
[Run]
|
||||||
Filename: "{app}\nzbdrone.console.exe"; Parameters: "/u"; Flags: waituntilterminated;
|
Filename: "{app}\radarr.console.exe"; Parameters: "/u"; Flags: waituntilterminated;
|
||||||
Filename: "{app}\nzbdrone.console.exe"; Parameters: "/i"; Flags: waituntilterminated; Tasks: windowsService
|
Filename: "{app}\radarr.console.exe"; Parameters: "/i"; Flags: waituntilterminated; Tasks: windowsService
|
||||||
|
|
||||||
[UninstallRun]
|
[UninstallRun]
|
||||||
Filename: "{app}\nzbdrone.console.exe"; Parameters: "/u"; Flags: waituntilterminated skipifdoesntexist
|
Filename: "{app}\radarr.console.exe"; Parameters: "/u"; Flags: waituntilterminated skipifdoesntexist
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -33,12 +33,12 @@ namespace NzbDrone.Api.Authentication
|
|||||||
{
|
{
|
||||||
if (_configFileProvider.AuthenticationMethod == AuthenticationType.Forms)
|
if (_configFileProvider.AuthenticationMethod == AuthenticationType.Forms)
|
||||||
{
|
{
|
||||||
RegisterFormsAuth(pipelines);
|
RegisterFormsAuth(pipelines);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (_configFileProvider.AuthenticationMethod == AuthenticationType.Basic)
|
else if (_configFileProvider.AuthenticationMethod == AuthenticationType.Basic)
|
||||||
{
|
{
|
||||||
pipelines.EnableBasicAuthentication(new BasicAuthenticationConfiguration(_authenticationService, "Sonarr"));
|
pipelines.EnableBasicAuthentication(new BasicAuthenticationConfiguration(_authenticationService, "Radarr"));
|
||||||
}
|
}
|
||||||
|
|
||||||
pipelines.BeforeRequest.AddItemToEndOfPipeline((Func<NancyContext, Response>) RequiresAuthentication);
|
pipelines.BeforeRequest.AddItemToEndOfPipeline((Func<NancyContext, Response>) RequiresAuthentication);
|
||||||
@@ -70,6 +70,7 @@ namespace NzbDrone.Api.Authentication
|
|||||||
{
|
{
|
||||||
RedirectUrl = _configFileProvider.UrlBase + "/login",
|
RedirectUrl = _configFileProvider.UrlBase + "/login",
|
||||||
UserMapper = _authenticationService,
|
UserMapper = _authenticationService,
|
||||||
|
Path = _configFileProvider.UrlBase,
|
||||||
CryptographyConfiguration = cryptographyConfiguration
|
CryptographyConfiguration = cryptographyConfiguration
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,13 +16,13 @@ namespace NzbDrone.Api.Calendar
|
|||||||
{
|
{
|
||||||
public class CalendarFeedModule : NzbDroneFeedModule
|
public class CalendarFeedModule : NzbDroneFeedModule
|
||||||
{
|
{
|
||||||
private readonly IEpisodeService _episodeService;
|
private readonly IMovieService _movieService;
|
||||||
private readonly ITagService _tagService;
|
private readonly ITagService _tagService;
|
||||||
|
|
||||||
public CalendarFeedModule(IEpisodeService episodeService, ITagService tagService)
|
public CalendarFeedModule(IMovieService movieService, ITagService tagService)
|
||||||
: base("calendar")
|
: base("calendar")
|
||||||
{
|
{
|
||||||
_episodeService = episodeService;
|
_movieService = movieService;
|
||||||
_tagService = tagService;
|
_tagService = tagService;
|
||||||
|
|
||||||
Get["/NzbDrone.ics"] = options => GetCalendarFeed();
|
Get["/NzbDrone.ics"] = options => GetCalendarFeed();
|
||||||
@@ -37,7 +37,7 @@ namespace NzbDrone.Api.Calendar
|
|||||||
var start = DateTime.Today.AddDays(-pastDays);
|
var start = DateTime.Today.AddDays(-pastDays);
|
||||||
var end = DateTime.Today.AddDays(futureDays);
|
var end = DateTime.Today.AddDays(futureDays);
|
||||||
var unmonitored = false;
|
var unmonitored = false;
|
||||||
var premiersOnly = false;
|
//var premiersOnly = false;
|
||||||
var tags = new List<int>();
|
var tags = new List<int>();
|
||||||
|
|
||||||
// TODO: Remove start/end parameters in v3, they don't work well for iCal
|
// TODO: Remove start/end parameters in v3, they don't work well for iCal
|
||||||
@@ -46,7 +46,7 @@ namespace NzbDrone.Api.Calendar
|
|||||||
var queryPastDays = Request.Query.PastDays;
|
var queryPastDays = Request.Query.PastDays;
|
||||||
var queryFutureDays = Request.Query.FutureDays;
|
var queryFutureDays = Request.Query.FutureDays;
|
||||||
var queryUnmonitored = Request.Query.Unmonitored;
|
var queryUnmonitored = Request.Query.Unmonitored;
|
||||||
var queryPremiersOnly = Request.Query.PremiersOnly;
|
// var queryPremiersOnly = Request.Query.PremiersOnly;
|
||||||
var queryTags = Request.Query.Tags;
|
var queryTags = Request.Query.Tags;
|
||||||
|
|
||||||
if (queryStart.HasValue) start = DateTime.Parse(queryStart.Value);
|
if (queryStart.HasValue) start = DateTime.Parse(queryStart.Value);
|
||||||
@@ -69,10 +69,10 @@ namespace NzbDrone.Api.Calendar
|
|||||||
unmonitored = bool.Parse(queryUnmonitored.Value);
|
unmonitored = bool.Parse(queryUnmonitored.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (queryPremiersOnly.HasValue)
|
//if (queryPremiersOnly.HasValue)
|
||||||
{
|
//{
|
||||||
premiersOnly = bool.Parse(queryPremiersOnly.Value);
|
// premiersOnly = bool.Parse(queryPremiersOnly.Value);
|
||||||
}
|
//}
|
||||||
|
|
||||||
if (queryTags.HasValue)
|
if (queryTags.HasValue)
|
||||||
{
|
{
|
||||||
@@ -80,43 +80,56 @@ namespace NzbDrone.Api.Calendar
|
|||||||
tags.AddRange(tagInput.Split(',').Select(_tagService.GetTag).Select(t => t.Id));
|
tags.AddRange(tagInput.Split(',').Select(_tagService.GetTag).Select(t => t.Id));
|
||||||
}
|
}
|
||||||
|
|
||||||
var episodes = _episodeService.EpisodesBetweenDates(start, end, unmonitored);
|
var movies = _movieService.GetMoviesBetweenDates(start, end, unmonitored);
|
||||||
var calendar = new Ical.Net.Calendar
|
var calendar = new Ical.Net.Calendar
|
||||||
{
|
{
|
||||||
ProductId = "-//sonarr.tv//Sonarr//EN"
|
ProductId = "-//radarr.video//Radarr//EN"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
foreach (var movie in movies.OrderBy(v => v.Added))
|
||||||
|
|
||||||
foreach (var episode in episodes.OrderBy(v => v.AirDateUtc.Value))
|
|
||||||
{
|
{
|
||||||
if (premiersOnly && (episode.SeasonNumber == 0 || episode.EpisodeNumber != 1))
|
if (tags.Any() && tags.None(movie.Tags.Contains))
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tags.Any() && tags.None(episode.Series.Tags.Contains))
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var occurrence = calendar.Create<Event>();
|
var occurrence = calendar.Create<Event>();
|
||||||
occurrence.Uid = "NzbDrone_episode_" + episode.Id;
|
occurrence.Uid = "NzbDrone_movie_" + movie.Id;
|
||||||
occurrence.Status = episode.HasFile ? EventStatus.Confirmed : EventStatus.Tentative;
|
occurrence.Status = movie.HasFile ? EventStatus.Confirmed : EventStatus.Tentative;
|
||||||
occurrence.Start = new CalDateTime(episode.AirDateUtc.Value) { HasTime = true };
|
|
||||||
occurrence.End = new CalDateTime(episode.AirDateUtc.Value.AddMinutes(episode.Series.Runtime)) { HasTime = true };
|
|
||||||
occurrence.Description = episode.Overview;
|
|
||||||
occurrence.Categories = new List<string>() { episode.Series.Network };
|
|
||||||
|
|
||||||
switch (episode.Series.SeriesType)
|
switch (movie.Status)
|
||||||
{
|
{
|
||||||
case SeriesTypes.Daily:
|
case MovieStatusType.PreDB:
|
||||||
occurrence.Summary = $"{episode.Series.Title} - {episode.Title}";
|
if (movie.PhysicalRelease != null)
|
||||||
|
{
|
||||||
|
occurrence.Start = new CalDateTime(movie.PhysicalRelease.Value) { HasTime = true };
|
||||||
|
occurrence.End = new CalDateTime(movie.PhysicalRelease.Value.AddMinutes(movie.Runtime)) { HasTime = true };
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MovieStatusType.InCinemas:
|
||||||
|
if (movie.InCinemas != null)
|
||||||
|
{
|
||||||
|
occurrence.Start = new CalDateTime(movie.InCinemas.Value) { HasTime = true };
|
||||||
|
occurrence.End = new CalDateTime(movie.InCinemas.Value.AddMinutes(movie.Runtime)) { HasTime = true };
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MovieStatusType.Announced:
|
||||||
|
continue; // no date
|
||||||
default:
|
default:
|
||||||
occurrence.Summary =$"{episode.Series.Title} - {episode.SeasonNumber}x{episode.EpisodeNumber:00} - {episode.Title}";
|
if (movie.PhysicalRelease != null)
|
||||||
|
{
|
||||||
|
occurrence.Start = new CalDateTime(movie.PhysicalRelease.Value) { HasTime = true };
|
||||||
|
occurrence.End = new CalDateTime(movie.PhysicalRelease.Value.AddMinutes(movie.Runtime)) { HasTime = true };
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
occurrence.Description = movie.Overview;
|
||||||
|
occurrence.Categories = new List<string>() { movie.Studio };
|
||||||
|
|
||||||
|
occurrence.Summary = $"{movie.Title}";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var serializer = (IStringSerializer) new SerializerFactory().Build(calendar.GetType(), new SerializationContext());
|
var serializer = (IStringSerializer) new SerializerFactory().Build(calendar.GetType(), new SerializationContext());
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Nancy;
|
||||||
using NzbDrone.Api.Episodes;
|
using NzbDrone.Api.Episodes;
|
||||||
using NzbDrone.Api.Movie;
|
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;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using NLog;
|
||||||
using NzbDrone.Api.Extensions;
|
using NzbDrone.Api.Extensions;
|
||||||
using NzbDrone.Api.Validation;
|
using NzbDrone.Api.Validation;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
@@ -17,14 +18,17 @@ namespace NzbDrone.Api.Commands
|
|||||||
{
|
{
|
||||||
private readonly IManageCommandQueue _commandQueueManager;
|
private readonly IManageCommandQueue _commandQueueManager;
|
||||||
private readonly IServiceFactory _serviceFactory;
|
private readonly IServiceFactory _serviceFactory;
|
||||||
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public CommandModule(IManageCommandQueue commandQueueManager,
|
public CommandModule(IManageCommandQueue commandQueueManager,
|
||||||
IBroadcastSignalRMessage signalRBroadcaster,
|
IBroadcastSignalRMessage signalRBroadcaster,
|
||||||
IServiceFactory serviceFactory)
|
IServiceFactory serviceFactory,
|
||||||
|
Logger logger)
|
||||||
: base(signalRBroadcaster)
|
: base(signalRBroadcaster)
|
||||||
{
|
{
|
||||||
_commandQueueManager = commandQueueManager;
|
_commandQueueManager = commandQueueManager;
|
||||||
_serviceFactory = serviceFactory;
|
_serviceFactory = serviceFactory;
|
||||||
|
_logger = logger;
|
||||||
|
|
||||||
GetResourceById = GetCommand;
|
GetResourceById = GetCommand;
|
||||||
CreateResource = StartCommand;
|
CreateResource = StartCommand;
|
||||||
@@ -41,7 +45,13 @@ namespace NzbDrone.Api.Commands
|
|||||||
private int StartCommand(CommandResource commandResource)
|
private int StartCommand(CommandResource commandResource)
|
||||||
{
|
{
|
||||||
var commandType = _serviceFactory.GetImplementations(typeof(Command))
|
var commandType = _serviceFactory.GetImplementations(typeof(Command))
|
||||||
.Single(c => c.Name.Replace("Command", "").Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
|
.SingleOrDefault(c => c.Name.Replace("Command", "").Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
|
||||||
|
if (commandType == null)
|
||||||
|
{
|
||||||
|
_logger.Error("Found no matching command for {0}", commandResource.Name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
dynamic command = Request.Body.FromJson(commandType);
|
dynamic command = Request.Body.FromJson(commandType);
|
||||||
command.Trigger = CommandTrigger.Manual;
|
command.Trigger = CommandTrigger.Manual;
|
||||||
|
|||||||
@@ -12,13 +12,13 @@ namespace NzbDrone.Api.Config
|
|||||||
MappedNetworkDriveValidator mappedNetworkDriveValidator)
|
MappedNetworkDriveValidator mappedNetworkDriveValidator)
|
||||||
: base(configService)
|
: base(configService)
|
||||||
{
|
{
|
||||||
SharedValidator.RuleFor(c => c.DownloadedEpisodesFolder)
|
SharedValidator.RuleFor(c => c.DownloadedMoviesFolder)
|
||||||
.Cascade(CascadeMode.StopOnFirstFailure)
|
.Cascade(CascadeMode.StopOnFirstFailure)
|
||||||
.IsValidPath()
|
.IsValidPath()
|
||||||
.SetValidator(rootFolderValidator)
|
.SetValidator(rootFolderValidator)
|
||||||
.SetValidator(mappedNetworkDriveValidator)
|
.SetValidator(mappedNetworkDriveValidator)
|
||||||
.SetValidator(pathExistsValidator)
|
.SetValidator(pathExistsValidator)
|
||||||
.When(c => !string.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder));
|
.When(c => !string.IsNullOrWhiteSpace(c.DownloadedMoviesFolder));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override DownloadClientConfigResource ToResource(IConfigService model)
|
protected override DownloadClientConfigResource ToResource(IConfigService model)
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ namespace NzbDrone.Api.Config
|
|||||||
{
|
{
|
||||||
public class DownloadClientConfigResource : RestResource
|
public class DownloadClientConfigResource : RestResource
|
||||||
{
|
{
|
||||||
public string DownloadedEpisodesFolder { get; set; }
|
public string DownloadedMoviesFolder { get; set; }
|
||||||
public string DownloadClientWorkingFolders { get; set; }
|
public string DownloadClientWorkingFolders { get; set; }
|
||||||
public int DownloadedEpisodesScanInterval { get; set; }
|
public int DownloadedMoviesScanInterval { get; set; }
|
||||||
|
|
||||||
public bool EnableCompletedDownloadHandling { get; set; }
|
public bool EnableCompletedDownloadHandling { get; set; }
|
||||||
public bool RemoveCompletedDownloads { get; set; }
|
public bool RemoveCompletedDownloads { get; set; }
|
||||||
@@ -22,9 +22,9 @@ namespace NzbDrone.Api.Config
|
|||||||
{
|
{
|
||||||
return new DownloadClientConfigResource
|
return new DownloadClientConfigResource
|
||||||
{
|
{
|
||||||
DownloadedEpisodesFolder = model.DownloadedEpisodesFolder,
|
DownloadedMoviesFolder = model.DownloadedMoviesFolder,
|
||||||
DownloadClientWorkingFolders = model.DownloadClientWorkingFolders,
|
DownloadClientWorkingFolders = model.DownloadClientWorkingFolders,
|
||||||
DownloadedEpisodesScanInterval = model.DownloadedEpisodesScanInterval,
|
DownloadedMoviesScanInterval = model.DownloadedMoviesScanInterval,
|
||||||
|
|
||||||
EnableCompletedDownloadHandling = model.EnableCompletedDownloadHandling,
|
EnableCompletedDownloadHandling = model.EnableCompletedDownloadHandling,
|
||||||
RemoveCompletedDownloads = model.RemoveCompletedDownloads,
|
RemoveCompletedDownloads = model.RemoveCompletedDownloads,
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ namespace NzbDrone.Api.Config
|
|||||||
public int MinimumAge { get; set; }
|
public int MinimumAge { get; set; }
|
||||||
public int Retention { get; set; }
|
public int Retention { get; set; }
|
||||||
public int RssSyncInterval { get; set; }
|
public int RssSyncInterval { get; set; }
|
||||||
|
public bool PreferIndexerFlags { get; set; }
|
||||||
|
public int AvailabilityDelay { get; set; }
|
||||||
|
public bool AllowHardcodedSubs { get; set; }
|
||||||
|
public string WhitelistedHardcodedSubs { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class IndexerConfigResourceMapper
|
public static class IndexerConfigResourceMapper
|
||||||
@@ -19,6 +23,11 @@ namespace NzbDrone.Api.Config
|
|||||||
MinimumAge = model.MinimumAge,
|
MinimumAge = model.MinimumAge,
|
||||||
Retention = model.Retention,
|
Retention = model.Retention,
|
||||||
RssSyncInterval = model.RssSyncInterval,
|
RssSyncInterval = model.RssSyncInterval,
|
||||||
|
PreferIndexerFlags = model.PreferIndexerFlags,
|
||||||
|
AvailabilityDelay = model.AvailabilityDelay,
|
||||||
|
AllowHardcodedSubs = model.AllowHardcodedSubs,
|
||||||
|
WhitelistedHardcodedSubs = model.WhitelistedHardcodedSubs,
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ namespace NzbDrone.Api.Config
|
|||||||
public bool AutoDownloadPropers { get; set; }
|
public bool AutoDownloadPropers { get; set; }
|
||||||
public bool CreateEmptySeriesFolders { get; set; }
|
public bool CreateEmptySeriesFolders { get; set; }
|
||||||
public FileDateType FileDate { get; set; }
|
public FileDateType FileDate { get; set; }
|
||||||
|
public bool AutoRenameFolders { get; set; }
|
||||||
|
public bool PathsDefaultStatic { get; set; }
|
||||||
|
|
||||||
public bool SetPermissionsLinux { get; set; }
|
public bool SetPermissionsLinux { get; set; }
|
||||||
public string FileChmod { get; set; }
|
public string FileChmod { get; set; }
|
||||||
@@ -35,6 +37,8 @@ namespace NzbDrone.Api.Config
|
|||||||
AutoDownloadPropers = model.AutoDownloadPropers,
|
AutoDownloadPropers = model.AutoDownloadPropers,
|
||||||
CreateEmptySeriesFolders = model.CreateEmptySeriesFolders,
|
CreateEmptySeriesFolders = model.CreateEmptySeriesFolders,
|
||||||
FileDate = model.FileDate,
|
FileDate = model.FileDate,
|
||||||
|
AutoRenameFolders = model.AutoRenameFolders,
|
||||||
|
PathsDefaultStatic = model.PathsDefaultStatic,
|
||||||
|
|
||||||
SetPermissionsLinux = model.SetPermissionsLinux,
|
SetPermissionsLinux = model.SetPermissionsLinux,
|
||||||
FileChmod = model.FileChmod,
|
FileChmod = model.FileChmod,
|
||||||
|
|||||||
@@ -6,6 +6,11 @@ namespace NzbDrone.Api.Config
|
|||||||
public class NetImportConfigResource : RestResource
|
public class NetImportConfigResource : RestResource
|
||||||
{
|
{
|
||||||
public int NetImportSyncInterval { get; set; }
|
public int NetImportSyncInterval { get; set; }
|
||||||
|
public string ListSyncLevel { get; set; }
|
||||||
|
public string ImportExclusions { get; set; }
|
||||||
|
public string TraktAuthToken { get; set; }
|
||||||
|
public string TraktRefreshToken { get; set; }
|
||||||
|
public int TraktTokenExpiry { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class NetImportConfigResourceMapper
|
public static class NetImportConfigResourceMapper
|
||||||
@@ -14,7 +19,12 @@ namespace NzbDrone.Api.Config
|
|||||||
{
|
{
|
||||||
return new NetImportConfigResource
|
return new NetImportConfigResource
|
||||||
{
|
{
|
||||||
NetImportSyncInterval = model.NetImportSyncInterval
|
NetImportSyncInterval = model.NetImportSyncInterval,
|
||||||
|
ListSyncLevel = model.ListSyncLevel,
|
||||||
|
ImportExclusions = model.ImportExclusions,
|
||||||
|
TraktAuthToken = model.TraktAuthToken,
|
||||||
|
TraktRefreshToken = model.TraktRefreshToken,
|
||||||
|
TraktTokenExpiry = model.TraktTokenExpiry,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ namespace NzbDrone.Api.EpisodeFiles
|
|||||||
|
|
||||||
private void DeleteEpisodeFile(int id)
|
private void DeleteEpisodeFile(int id)
|
||||||
{
|
{
|
||||||
var episodeFile = _mediaFileService.Get(id);
|
var episodeFile = _mediaFileService.Get(id);
|
||||||
var series = _seriesService.GetSeries(episodeFile.SeriesId);
|
var series = _seriesService.GetSeries(episodeFile.SeriesId);
|
||||||
var fullPath = Path.Combine(series.Path, episodeFile.RelativePath);
|
var fullPath = Path.Combine(series.Path, episodeFile.RelativePath);
|
||||||
|
|
||||||
|
|||||||
@@ -66,13 +66,9 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
private Response LogError(NancyContext context, Exception exception)
|
private Response LogError(NancyContext context, Exception exception)
|
||||||
{
|
{
|
||||||
var response = _errorPipeline.HandleException(context, exception);
|
var response = _errorPipeline.HandleException(context, exception);
|
||||||
|
|
||||||
context.Response = response;
|
context.Response = response;
|
||||||
|
|
||||||
LogEnd(context);
|
LogEnd(context);
|
||||||
|
|
||||||
context.Response = null;
|
context.Response = null;
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,12 +76,9 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
{
|
{
|
||||||
if (request.Url.Query.IsNotNullOrWhiteSpace())
|
if (request.Url.Query.IsNotNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
return string.Concat(request.Url.Path, "?", request.Url.Query);
|
return string.Concat(request.Url.Path, request.Url.Query);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return request.Url.Path;
|
|
||||||
}
|
}
|
||||||
|
return request.Url.Path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using Nancy;
|
using Nancy;
|
||||||
using NzbDrone.Api.Episodes;
|
|
||||||
using NzbDrone.Api.Extensions;
|
using NzbDrone.Api.Extensions;
|
||||||
using NzbDrone.Api.Series;
|
|
||||||
using NzbDrone.Api.Movie;
|
using NzbDrone.Api.Movie;
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
using NzbDrone.Core.DecisionEngine;
|
using NzbDrone.Core.DecisionEngine;
|
||||||
@@ -32,16 +30,8 @@ namespace NzbDrone.Api.History
|
|||||||
protected HistoryResource MapToResource(Core.History.History model)
|
protected HistoryResource MapToResource(Core.History.History model)
|
||||||
{
|
{
|
||||||
var resource = model.ToResource();
|
var resource = model.ToResource();
|
||||||
|
|
||||||
resource.Series = model.Series.ToResource();
|
|
||||||
resource.Episode = model.Episode.ToResource();
|
|
||||||
resource.Movie = model.Movie.ToResource();
|
resource.Movie = model.Movie.ToResource();
|
||||||
|
|
||||||
if (model.Series != null)
|
|
||||||
{
|
|
||||||
resource.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(model.Series.Profile.Value, model.Quality);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (model.Movie != null)
|
if (model.Movie != null)
|
||||||
{
|
{
|
||||||
resource.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(model.Movie.Profile.Value, model.Quality);
|
resource.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(model.Movie.Profile.Value, model.Quality);
|
||||||
@@ -52,8 +42,6 @@ namespace NzbDrone.Api.History
|
|||||||
|
|
||||||
private PagingResource<HistoryResource> GetHistory(PagingResource<HistoryResource> pagingResource)
|
private PagingResource<HistoryResource> GetHistory(PagingResource<HistoryResource> pagingResource)
|
||||||
{
|
{
|
||||||
var episodeId = Request.Query.EpisodeId;
|
|
||||||
|
|
||||||
var movieId = Request.Query.MovieId;
|
var movieId = Request.Query.MovieId;
|
||||||
|
|
||||||
var pagingSpec = pagingResource.MapToPagingSpec<HistoryResource, Core.History.History>("date", SortDirection.Descending);
|
var pagingSpec = pagingResource.MapToPagingSpec<HistoryResource, Core.History.History>("date", SortDirection.Descending);
|
||||||
@@ -64,12 +52,6 @@ namespace NzbDrone.Api.History
|
|||||||
pagingSpec.FilterExpression = v => v.EventType == filterValue;
|
pagingSpec.FilterExpression = v => v.EventType == filterValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (episodeId.HasValue)
|
|
||||||
{
|
|
||||||
int i = (int)episodeId;
|
|
||||||
pagingSpec.FilterExpression = h => h.EpisodeId == i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (movieId.HasValue)
|
if (movieId.HasValue)
|
||||||
{
|
{
|
||||||
int i = (int)movieId;
|
int i = (int)movieId;
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ namespace NzbDrone.Api.Indexers
|
|||||||
public bool DownloadAllowed { get; set; }
|
public bool DownloadAllowed { get; set; }
|
||||||
public int ReleaseWeight { get; set; }
|
public int ReleaseWeight { get; set; }
|
||||||
|
|
||||||
|
public IEnumerable<string> IndexerFlags { get; set; }
|
||||||
|
|
||||||
public string MagnetUrl { get; set; }
|
public string MagnetUrl { get; set; }
|
||||||
public string InfoHash { get; set; }
|
public string InfoHash { get; set; }
|
||||||
@@ -132,7 +133,7 @@ namespace NzbDrone.Api.Indexers
|
|||||||
Seeders = torrentInfo.Seeders,
|
Seeders = torrentInfo.Seeders,
|
||||||
Leechers = (torrentInfo.Peers.HasValue && torrentInfo.Seeders.HasValue) ? (torrentInfo.Peers.Value - torrentInfo.Seeders.Value) : (int?)null,
|
Leechers = (torrentInfo.Peers.HasValue && torrentInfo.Seeders.HasValue) ? (torrentInfo.Peers.Value - torrentInfo.Seeders.Value) : (int?)null,
|
||||||
Protocol = releaseInfo.DownloadProtocol,
|
Protocol = releaseInfo.DownloadProtocol,
|
||||||
|
IndexerFlags = torrentInfo.IndexerFlags.ToString().Split(new string[] { ", " }, StringSplitOptions.None),
|
||||||
Edition = parsedMovieInfo.Edition,
|
Edition = parsedMovieInfo.Edition,
|
||||||
|
|
||||||
IsDaily = false,
|
IsDaily = false,
|
||||||
|
|||||||
@@ -0,0 +1,175 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Nancy;
|
||||||
|
using NzbDrone.Api.Extensions;
|
||||||
|
using NzbDrone.Core.MediaCover;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
|
using NzbDrone.Core.Parser;
|
||||||
|
using System.Linq;
|
||||||
|
using System;
|
||||||
|
using Marr.Data;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.MediaFiles;
|
||||||
|
using NzbDrone.Core.MediaFiles.EpisodeImport;
|
||||||
|
using NzbDrone.Core.RootFolders;
|
||||||
|
using NzbDrone.Common.Cache;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
|
namespace NzbDrone.Api.Movie
|
||||||
|
{
|
||||||
|
|
||||||
|
public class UnmappedComparer : IComparer<UnmappedFolder>
|
||||||
|
{
|
||||||
|
public int Compare(UnmappedFolder a, UnmappedFolder b)
|
||||||
|
{
|
||||||
|
return a.Name.CompareTo(b.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MovieBulkImportModule : NzbDroneRestModule<MovieResource>
|
||||||
|
{
|
||||||
|
private readonly ISearchForNewMovie _searchProxy;
|
||||||
|
private readonly IRootFolderService _rootFolderService;
|
||||||
|
private readonly IMakeImportDecision _importDecisionMaker;
|
||||||
|
private readonly IDiskScanService _diskScanService;
|
||||||
|
private readonly ICached<Core.Tv.Movie> _mappedMovies;
|
||||||
|
private readonly IMovieService _movieService;
|
||||||
|
|
||||||
|
public MovieBulkImportModule(ISearchForNewMovie searchProxy, IRootFolderService rootFolderService, IMakeImportDecision importDecisionMaker,
|
||||||
|
IDiskScanService diskScanService, ICacheManager cacheManager, IMovieService movieService)
|
||||||
|
: base("/movies/bulkimport")
|
||||||
|
{
|
||||||
|
_searchProxy = searchProxy;
|
||||||
|
_rootFolderService = rootFolderService;
|
||||||
|
_importDecisionMaker = importDecisionMaker;
|
||||||
|
_diskScanService = diskScanService;
|
||||||
|
_mappedMovies = cacheManager.GetCache<Core.Tv.Movie>(GetType(), "mappedMoviesCache");
|
||||||
|
_movieService = movieService;
|
||||||
|
Get["/"] = x => Search();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Response Search()
|
||||||
|
{
|
||||||
|
if (Request.Query.Id == 0)
|
||||||
|
{
|
||||||
|
//Todo error handling
|
||||||
|
}
|
||||||
|
|
||||||
|
RootFolder rootFolder = _rootFolderService.Get(Request.Query.Id);
|
||||||
|
|
||||||
|
int page = Request.Query.page;
|
||||||
|
int per_page = Request.Query.per_page;
|
||||||
|
|
||||||
|
int min = (page - 1) * per_page;
|
||||||
|
|
||||||
|
int max = page * per_page;
|
||||||
|
|
||||||
|
var unmapped = rootFolder.UnmappedFolders.OrderBy(f => f.Name).ToList();
|
||||||
|
|
||||||
|
int total_count = unmapped.Count;
|
||||||
|
|
||||||
|
if (Request.Query.total_entries.HasValue)
|
||||||
|
{
|
||||||
|
total_count = Request.Query.total_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
max = total_count >= max ? max : total_count;
|
||||||
|
|
||||||
|
var paged = unmapped.GetRange(min, max-min);
|
||||||
|
|
||||||
|
var mapped = paged.Select(f =>
|
||||||
|
{
|
||||||
|
Core.Tv.Movie m = null;
|
||||||
|
|
||||||
|
var mappedMovie = _mappedMovies.Find(f.Name);
|
||||||
|
|
||||||
|
if (mappedMovie != null)
|
||||||
|
{
|
||||||
|
return mappedMovie;
|
||||||
|
}
|
||||||
|
|
||||||
|
var parsedTitle = Parser.ParseMoviePath(f.Name);
|
||||||
|
if (parsedTitle == null)
|
||||||
|
{
|
||||||
|
m = new Core.Tv.Movie
|
||||||
|
{
|
||||||
|
Title = f.Name.Replace(".", " ").Replace("-", " "),
|
||||||
|
Path = f.Path,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m = new Core.Tv.Movie
|
||||||
|
{
|
||||||
|
Title = parsedTitle.MovieTitle,
|
||||||
|
Year = parsedTitle.Year,
|
||||||
|
ImdbId = parsedTitle.ImdbId,
|
||||||
|
Path = f.Path
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var files = _diskScanService.GetVideoFiles(f.Path);
|
||||||
|
|
||||||
|
var decisions = _importDecisionMaker.GetImportDecisions(files.ToList(), m, true);
|
||||||
|
|
||||||
|
var decision = decisions.Where(d => d.Approved && !d.Rejections.Any()).FirstOrDefault();
|
||||||
|
|
||||||
|
if (decision != null)
|
||||||
|
{
|
||||||
|
var local = decision.LocalMovie;
|
||||||
|
|
||||||
|
m.MovieFile = new LazyLoaded<MovieFile>(new MovieFile
|
||||||
|
{
|
||||||
|
Path = local.Path,
|
||||||
|
Edition = local.ParsedMovieInfo.Edition,
|
||||||
|
Quality = local.Quality,
|
||||||
|
MediaInfo = local.MediaInfo,
|
||||||
|
ReleaseGroup = local.ParsedMovieInfo.ReleaseGroup,
|
||||||
|
RelativePath = f.Path.GetRelativePath(local.Path)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
mappedMovie = _searchProxy.MapMovieToTmdbMovie(m);
|
||||||
|
|
||||||
|
if (mappedMovie != null)
|
||||||
|
{
|
||||||
|
mappedMovie.Monitored = true;
|
||||||
|
|
||||||
|
_mappedMovies.Set(f.Name, mappedMovie, TimeSpan.FromDays(2));
|
||||||
|
|
||||||
|
return mappedMovie;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
return new PagingResource<MovieResource>
|
||||||
|
{
|
||||||
|
Page = page,
|
||||||
|
PageSize = per_page,
|
||||||
|
SortDirection = SortDirection.Ascending,
|
||||||
|
SortKey = Request.Query.sort_by,
|
||||||
|
TotalRecords = total_count - mapped.Where(m => m == null).Count(),
|
||||||
|
Records = MapToResource(mapped.Where(m => m != null)).ToList()
|
||||||
|
}.AsResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static IEnumerable<MovieResource> MapToResource(IEnumerable<Core.Tv.Movie> movies)
|
||||||
|
{
|
||||||
|
foreach (var currentMovie in movies)
|
||||||
|
{
|
||||||
|
var resource = currentMovie.ToResource();
|
||||||
|
var poster = currentMovie.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
|
||||||
|
if (poster != null)
|
||||||
|
{
|
||||||
|
resource.RemotePoster = poster.Url;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return resource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,77 +13,63 @@ using NzbDrone.SignalR;
|
|||||||
|
|
||||||
namespace NzbDrone.Api.EpisodeFiles
|
namespace NzbDrone.Api.EpisodeFiles
|
||||||
{
|
{
|
||||||
public class MovieFileModule : NzbDroneRestModuleWithSignalR<MovieFileResource, MovieFile>
|
public class MovieFileModule : NzbDroneRestModuleWithSignalR<MovieFileResource, MovieFile>, IHandle<MovieFileAddedEvent>
|
||||||
//IHandle<EpisodeFileAddedEvent>
|
|
||||||
{
|
{
|
||||||
private readonly IMediaFileService _mediaFileService;
|
private readonly IMediaFileService _mediaFileService;
|
||||||
private readonly IRecycleBinProvider _recycleBinProvider;
|
private readonly IRecycleBinProvider _recycleBinProvider;
|
||||||
private readonly IMovieService _seriesService;
|
private readonly IMovieService _movieService;
|
||||||
private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification;
|
private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification;
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public MovieFileModule(IBroadcastSignalRMessage signalRBroadcaster,
|
public MovieFileModule(IBroadcastSignalRMessage signalRBroadcaster,
|
||||||
IMediaFileService mediaFileService,
|
IMediaFileService mediaFileService,
|
||||||
IRecycleBinProvider recycleBinProvider,
|
IRecycleBinProvider recycleBinProvider,
|
||||||
IMovieService seriesService,
|
IMovieService movieService,
|
||||||
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(signalRBroadcaster)
|
: base(signalRBroadcaster)
|
||||||
{
|
{
|
||||||
_mediaFileService = mediaFileService;
|
_mediaFileService = mediaFileService;
|
||||||
_recycleBinProvider = recycleBinProvider;
|
_recycleBinProvider = recycleBinProvider;
|
||||||
_seriesService = seriesService;
|
_movieService = movieService;
|
||||||
_qualityUpgradableSpecification = qualityUpgradableSpecification;
|
_qualityUpgradableSpecification = qualityUpgradableSpecification;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
GetResourceById = GetMovieFile;
|
GetResourceById = GetMovieFile;
|
||||||
/*GetResourceAll = GetEpisodeFiles;
|
|
||||||
UpdateResource = SetQuality;*/
|
|
||||||
UpdateResource = SetQuality;
|
UpdateResource = SetQuality;
|
||||||
DeleteResource = DeleteEpisodeFile;
|
DeleteResource = DeleteMovieFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MovieFileResource GetMovieFile(int id)
|
private MovieFileResource GetMovieFile(int id)
|
||||||
{
|
{
|
||||||
var episodeFile = _mediaFileService.GetMovie(id);
|
var movie = _mediaFileService.GetMovie(id);
|
||||||
|
|
||||||
return episodeFile.ToResource();
|
return movie.ToResource();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*private List<EpisodeFileResource> GetEpisodeFiles()
|
|
||||||
{
|
|
||||||
if (!Request.Query.SeriesId.HasValue)
|
|
||||||
{
|
|
||||||
throw new BadRequestException("seriesId is missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
var seriesId = (int)Request.Query.SeriesId;
|
private void SetQuality(MovieFileResource movieFileResource)
|
||||||
|
{
|
||||||
|
var movieFile = _mediaFileService.GetMovie(movieFileResource.Id);
|
||||||
|
movieFile.Quality = movieFileResource.Quality;
|
||||||
|
_mediaFileService.Update(movieFile);
|
||||||
|
|
||||||
var series = _seriesService.GetSeries(seriesId);
|
BroadcastResourceChange(ModelAction.Updated, movieFile.Id);
|
||||||
|
|
||||||
return _mediaFileService.GetFilesBySeries(seriesId).ConvertAll(f => f.ToResource(series, _qualityUpgradableSpecification));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
private void SetQuality(MovieFileResource episodeFileResource)
|
|
||||||
{
|
|
||||||
var episodeFile = _mediaFileService.GetMovie(episodeFileResource.Id);
|
|
||||||
episodeFile.Quality = episodeFileResource.Quality;
|
|
||||||
_mediaFileService.Update(episodeFile);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeleteEpisodeFile(int id)
|
private void DeleteMovieFile(int id)
|
||||||
{
|
{
|
||||||
var episodeFile = _mediaFileService.GetMovie(id);
|
var movieFile = _mediaFileService.GetMovie(id);
|
||||||
var series = _seriesService.GetMovie(episodeFile.MovieId);
|
var movie = _movieService.GetMovie(movieFile.MovieId);
|
||||||
var fullPath = Path.Combine(series.Path, episodeFile.RelativePath);
|
var fullPath = Path.Combine(movie.Path, movieFile.RelativePath);
|
||||||
|
|
||||||
_logger.Info("Deleting episode file: {0}", fullPath);
|
_logger.Info("Deleting movie file: {0}", fullPath);
|
||||||
_recycleBinProvider.DeleteFile(fullPath);
|
_recycleBinProvider.DeleteFile(fullPath);
|
||||||
_mediaFileService.Delete(episodeFile, DeleteMediaFileReason.Manual);
|
_mediaFileService.Delete(movieFile, DeleteMediaFileReason.Manual);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Handle(EpisodeFileAddedEvent message)
|
public void Handle(MovieFileAddedEvent message)
|
||||||
{
|
{
|
||||||
BroadcastResourceChange(ModelAction.Updated, message.EpisodeFile.Id);
|
BroadcastResourceChange(ModelAction.Updated, message.MovieFile.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
using NzbDrone.Api.Movie;
|
||||||
|
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.Movies
|
||||||
|
{
|
||||||
|
public abstract class MovieModuleWithSignalR : NzbDroneRestModuleWithSignalR<MovieResource, Core.Tv.Movie>,
|
||||||
|
IHandle<MovieGrabbedEvent>,
|
||||||
|
IHandle<MovieDownloadedEvent>
|
||||||
|
{
|
||||||
|
protected readonly IMovieService _movieService;
|
||||||
|
protected readonly IQualityUpgradableSpecification _qualityUpgradableSpecification;
|
||||||
|
|
||||||
|
protected MovieModuleWithSignalR(IMovieService movieService,
|
||||||
|
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
||||||
|
IBroadcastSignalRMessage signalRBroadcaster)
|
||||||
|
: base(signalRBroadcaster)
|
||||||
|
{
|
||||||
|
_movieService = movieService;
|
||||||
|
_qualityUpgradableSpecification = qualityUpgradableSpecification;
|
||||||
|
|
||||||
|
GetResourceById = GetMovie;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected MovieModuleWithSignalR(IMovieService movieService,
|
||||||
|
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
||||||
|
IBroadcastSignalRMessage signalRBroadcaster,
|
||||||
|
string resource)
|
||||||
|
: base(signalRBroadcaster, resource)
|
||||||
|
{
|
||||||
|
_movieService = movieService;
|
||||||
|
_qualityUpgradableSpecification = qualityUpgradableSpecification;
|
||||||
|
|
||||||
|
GetResourceById = GetMovie;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected MovieResource GetMovie(int id)
|
||||||
|
{
|
||||||
|
var movie = _movieService.GetMovie(id);
|
||||||
|
var resource = MapToResource(movie, true);
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected MovieResource MapToResource(Core.Tv.Movie episode, bool includeSeries)
|
||||||
|
{
|
||||||
|
var resource = episode.ToResource();
|
||||||
|
|
||||||
|
if (includeSeries)
|
||||||
|
{
|
||||||
|
var series = episode ?? _movieService.GetMovie(episode.Id);
|
||||||
|
resource = series.ToResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Handle(MovieGrabbedEvent message)
|
||||||
|
{
|
||||||
|
var resource = message.Movie.Movie.ToResource();
|
||||||
|
|
||||||
|
//add a grabbed field in MovieResource?
|
||||||
|
//resource.Grabbed = true;
|
||||||
|
|
||||||
|
BroadcastResourceChange(ModelAction.Updated, resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Handle(MovieDownloadedEvent message)
|
||||||
|
{
|
||||||
|
var resource = message.Movie.Movie.ToResource();
|
||||||
|
BroadcastResourceChange(ModelAction.Updated, resource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using FluentValidation;
|
||||||
|
using NzbDrone.Api.ClientSchema;
|
||||||
|
using NzbDrone.Core.NetImport;
|
||||||
|
using NzbDrone.Core.NetImport.ImportExclusions;
|
||||||
|
using NzbDrone.Core.Validation.Paths;
|
||||||
|
|
||||||
|
namespace NzbDrone.Api.NetImport
|
||||||
|
{
|
||||||
|
public class ImportExclusionsModule : NzbDroneRestModule<ImportExclusionsResource>
|
||||||
|
{
|
||||||
|
private readonly IImportExclusionsService _exclusionService;
|
||||||
|
|
||||||
|
public ImportExclusionsModule(NetImportFactory netImportFactory, IImportExclusionsService exclusionService) : base("exclusions")
|
||||||
|
{
|
||||||
|
_exclusionService = exclusionService;
|
||||||
|
GetResourceAll = GetAll;
|
||||||
|
CreateResource = AddExclusion;
|
||||||
|
DeleteResource = RemoveExclusion;
|
||||||
|
GetResourceById = GetById;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ImportExclusionsResource> GetAll()
|
||||||
|
{
|
||||||
|
return _exclusionService.GetAllExclusions().ToResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImportExclusionsResource GetById(int id)
|
||||||
|
{
|
||||||
|
return _exclusionService.GetById(id).ToResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int AddExclusion(ImportExclusionsResource exclusionResource)
|
||||||
|
{
|
||||||
|
var model = exclusionResource.ToModel();
|
||||||
|
|
||||||
|
return _exclusionService.AddExclusion(model).Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveExclusion (int id)
|
||||||
|
{
|
||||||
|
_exclusionService.RemoveExclusion(new ImportExclusion { Id = id });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using NzbDrone.Core.NetImport;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
|
namespace NzbDrone.Api.NetImport
|
||||||
|
{
|
||||||
|
public class ImportExclusionsResource : ProviderResource
|
||||||
|
{
|
||||||
|
//public int Id { get; set; }
|
||||||
|
public int TmdbId { get; set; }
|
||||||
|
public string MovieTitle { get; set; }
|
||||||
|
public int MovieYear { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ImportExclusionsResourceMapper
|
||||||
|
{
|
||||||
|
public static ImportExclusionsResource ToResource(this Core.NetImport.ImportExclusions.ImportExclusion model)
|
||||||
|
{
|
||||||
|
if (model == null) return null;
|
||||||
|
|
||||||
|
return new ImportExclusionsResource
|
||||||
|
{
|
||||||
|
Id = model.Id,
|
||||||
|
TmdbId = model.TmdbId,
|
||||||
|
MovieTitle = model.MovieTitle,
|
||||||
|
MovieYear = model.MovieYear
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<ImportExclusionsResource> ToResource(this IEnumerable<Core.NetImport.ImportExclusions.ImportExclusion> exclusions)
|
||||||
|
{
|
||||||
|
return exclusions.Select(ToResource).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Core.NetImport.ImportExclusions.ImportExclusion ToModel(this ImportExclusionsResource resource)
|
||||||
|
{
|
||||||
|
return new Core.NetImport.ImportExclusions.ImportExclusion
|
||||||
|
{
|
||||||
|
TmdbId = resource.TmdbId,
|
||||||
|
MovieTitle = resource.MovieTitle,
|
||||||
|
MovieYear = resource.MovieYear
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,16 +1,17 @@
|
|||||||
using NzbDrone.Api.ClientSchema;
|
using FluentValidation;
|
||||||
|
using NzbDrone.Api.ClientSchema;
|
||||||
using NzbDrone.Core.NetImport;
|
using NzbDrone.Core.NetImport;
|
||||||
using NzbDrone.Core.Profiles;
|
using NzbDrone.Core.Validation.Paths;
|
||||||
|
|
||||||
namespace NzbDrone.Api.NetImport
|
namespace NzbDrone.Api.NetImport
|
||||||
{
|
{
|
||||||
public class NetImportModule : ProviderModuleBase<NetImportResource, INetImport, NetImportDefinition>
|
public class NetImportModule : ProviderModuleBase<NetImportResource, INetImport, NetImportDefinition>
|
||||||
{
|
{
|
||||||
private readonly IProfileService _profileService;
|
public NetImportModule(NetImportFactory netImportFactory) : base(netImportFactory, "netimport")
|
||||||
public NetImportModule(NetImportFactory indexerFactory, IProfileService profileService)
|
|
||||||
: base(indexerFactory, "netimport")
|
|
||||||
{
|
{
|
||||||
_profileService = profileService;
|
PostValidator.RuleFor(c => c.RootFolderPath).NotNull();
|
||||||
|
PostValidator.RuleFor(c => c.MinimumAvailability).NotNull();
|
||||||
|
PostValidator.RuleFor(c => c.ProfileId).NotNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void MapToResource(NetImportResource resource, NetImportDefinition definition)
|
protected override void MapToResource(NetImportResource resource, NetImportDefinition definition)
|
||||||
@@ -22,6 +23,7 @@ namespace NzbDrone.Api.NetImport
|
|||||||
resource.ProfileId = definition.ProfileId;
|
resource.ProfileId = definition.ProfileId;
|
||||||
resource.RootFolderPath = definition.RootFolderPath;
|
resource.RootFolderPath = definition.RootFolderPath;
|
||||||
resource.ShouldMonitor = definition.ShouldMonitor;
|
resource.ShouldMonitor = definition.ShouldMonitor;
|
||||||
|
resource.MinimumAvailability = definition.MinimumAvailability;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void MapToModel(NetImportDefinition definition, NetImportResource resource)
|
protected override void MapToModel(NetImportDefinition definition, NetImportResource resource)
|
||||||
@@ -33,6 +35,7 @@ namespace NzbDrone.Api.NetImport
|
|||||||
definition.ProfileId = resource.ProfileId;
|
definition.ProfileId = resource.ProfileId;
|
||||||
definition.RootFolderPath = resource.RootFolderPath;
|
definition.RootFolderPath = resource.RootFolderPath;
|
||||||
definition.ShouldMonitor = resource.ShouldMonitor;
|
definition.ShouldMonitor = resource.ShouldMonitor;
|
||||||
|
definition.MinimumAvailability = resource.MinimumAvailability;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Validate(NetImportDefinition definition, bool includeWarnings)
|
protected override void Validate(NetImportDefinition definition, bool includeWarnings)
|
||||||
@@ -41,4 +44,4 @@ namespace NzbDrone.Api.NetImport
|
|||||||
base.Validate(definition, includeWarnings);
|
base.Validate(definition, includeWarnings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using NzbDrone.Core.NetImport;
|
using NzbDrone.Core.NetImport;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
namespace NzbDrone.Api.NetImport
|
namespace NzbDrone.Api.NetImport
|
||||||
{
|
{
|
||||||
@@ -9,5 +10,6 @@ namespace NzbDrone.Api.NetImport
|
|||||||
public bool ShouldMonitor { get; set; }
|
public bool ShouldMonitor { get; set; }
|
||||||
public string RootFolderPath { get; set; }
|
public string RootFolderPath { get; set; }
|
||||||
public int ProfileId { get; set; }
|
public int ProfileId { get; set; }
|
||||||
|
public MovieStatusType MinimumAvailability { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,8 +118,10 @@
|
|||||||
<Compile Include="Frontend\Mappers\RobotsTxtMapper.cs" />
|
<Compile Include="Frontend\Mappers\RobotsTxtMapper.cs" />
|
||||||
<Compile Include="Indexers\ReleaseModuleBase.cs" />
|
<Compile Include="Indexers\ReleaseModuleBase.cs" />
|
||||||
<Compile Include="Indexers\ReleasePushModule.cs" />
|
<Compile Include="Indexers\ReleasePushModule.cs" />
|
||||||
|
<Compile Include="Movies\MovieModuleWithSignalR.cs" />
|
||||||
|
<Compile Include="Movies\MovieBulkImportModule.cs" />
|
||||||
<Compile Include="Movies\MovieFileModule.cs" />
|
<Compile Include="Movies\MovieFileModule.cs" />
|
||||||
<Compile Include="Movies\MovieModule.cs" />
|
<Compile Include="Series\MovieModule.cs" />
|
||||||
<Compile Include="Movies\RenameMovieModule.cs" />
|
<Compile Include="Movies\RenameMovieModule.cs" />
|
||||||
<Compile Include="Movies\RenameMovieResource.cs" />
|
<Compile Include="Movies\RenameMovieResource.cs" />
|
||||||
<Compile Include="Movies\MovieEditorModule.cs" />
|
<Compile Include="Movies\MovieEditorModule.cs" />
|
||||||
@@ -245,7 +247,6 @@
|
|||||||
<Compile Include="Series\SeriesEditorModule.cs" />
|
<Compile Include="Series\SeriesEditorModule.cs" />
|
||||||
<Compile Include="Series\MovieLookupModule.cs" />
|
<Compile Include="Series\MovieLookupModule.cs" />
|
||||||
<Compile Include="Series\SeriesLookupModule.cs" />
|
<Compile Include="Series\SeriesLookupModule.cs" />
|
||||||
<Compile Include="Series\MovieModule.cs" />
|
|
||||||
<Compile Include="Series\SeriesModule.cs" />
|
<Compile Include="Series\SeriesModule.cs" />
|
||||||
<Compile Include="Series\MovieResource.cs" />
|
<Compile Include="Series\MovieResource.cs" />
|
||||||
<Compile Include="Series\SeriesResource.cs" />
|
<Compile Include="Series\SeriesResource.cs" />
|
||||||
@@ -267,7 +268,11 @@
|
|||||||
<Compile Include="Wanted\CutoffModule.cs" />
|
<Compile Include="Wanted\CutoffModule.cs" />
|
||||||
<Compile Include="Wanted\LegacyMissingModule.cs" />
|
<Compile Include="Wanted\LegacyMissingModule.cs" />
|
||||||
<Compile Include="Wanted\MissingModule.cs" />
|
<Compile Include="Wanted\MissingModule.cs" />
|
||||||
|
<Compile Include="Wanted\MovieCutoffModule.cs" />
|
||||||
<Compile Include="Wanted\MovieMissingModule.cs" />
|
<Compile Include="Wanted\MovieMissingModule.cs" />
|
||||||
|
<Compile Include="Series\MovieDiscoverModule.cs" />
|
||||||
|
<Compile Include="NetImport\ImportExclusionsModule.cs" />
|
||||||
|
<Compile Include="NetImport\ImportExclusionsResource.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="app.config" />
|
<None Include="app.config" />
|
||||||
@@ -295,11 +300,11 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<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,6 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq.Expressions;
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
|
||||||
namespace NzbDrone.Api
|
namespace NzbDrone.Api
|
||||||
@@ -11,6 +13,7 @@ namespace NzbDrone.Api
|
|||||||
public SortDirection SortDirection { get; set; }
|
public SortDirection SortDirection { get; set; }
|
||||||
public string FilterKey { get; set; }
|
public string FilterKey { get; set; }
|
||||||
public string FilterValue { get; set; }
|
public string FilterValue { get; set; }
|
||||||
|
public string FilterType { get; set; }
|
||||||
public int TotalRecords { get; set; }
|
public int TotalRecords { get; set; }
|
||||||
public List<TResource> Records { get; set; }
|
public List<TResource> Records { get; set; }
|
||||||
}
|
}
|
||||||
@@ -38,5 +41,14 @@ namespace NzbDrone.Api
|
|||||||
|
|
||||||
return pagingSpec;
|
return pagingSpec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*public static Expression<Func<TModel, object>> CreateFilterExpression<TModel>(string filterKey, string filterValue)
|
||||||
|
{
|
||||||
|
Type type = typeof(TModel);
|
||||||
|
ParameterExpression parameterExpression = Expression.Parameter(type, "x");
|
||||||
|
Expression expressionBody = parameterExpression;
|
||||||
|
|
||||||
|
return expressionBody;
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ namespace NzbDrone.Api
|
|||||||
|
|
||||||
resource.Fields = SchemaBuilder.ToSchema(definition.Settings);
|
resource.Fields = SchemaBuilder.ToSchema(definition.Settings);
|
||||||
|
|
||||||
resource.InfoLink = string.Format("https://github.com/Sonarr/Sonarr/wiki/Supported-{0}#{1}",
|
resource.InfoLink = string.Format("https://github.com/Radarr/Radarr/wiki/Supported-{0}#{1}",
|
||||||
typeof(TProviderResource).Name.Replace("Resource", "s"),
|
typeof(TProviderResource).Name.Replace("Resource", "s"),
|
||||||
definition.Implementation.ToLower());
|
definition.Implementation.ToLower());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ namespace NzbDrone.Api.Queue
|
|||||||
throw new NotFoundException();
|
throw new NotFoundException();
|
||||||
}
|
}
|
||||||
|
|
||||||
_downloadService.DownloadReport(pendingRelease.RemoteEpisode);
|
_downloadService.DownloadReport(pendingRelease.RemoteMovie);
|
||||||
|
|
||||||
return resource.AsResponse();
|
return resource.AsResponse();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,7 +123,13 @@ namespace NzbDrone.Api.REST
|
|||||||
|
|
||||||
Get[ROOT_ROUTE] = options =>
|
Get[ROOT_ROUTE] = options =>
|
||||||
{
|
{
|
||||||
var resource = GetResourcePaged(ReadPagingResourceFromRequest());
|
var pagingSpec = ReadPagingResourceFromRequest();
|
||||||
|
if (pagingSpec.Page == 0 && pagingSpec.PageSize == 0)
|
||||||
|
{
|
||||||
|
var all = GetResourceAll();
|
||||||
|
return all.AsResponse();
|
||||||
|
}
|
||||||
|
var resource = GetResourcePaged(pagingSpec);
|
||||||
return resource.AsResponse();
|
return resource.AsResponse();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -214,12 +220,10 @@ namespace NzbDrone.Api.REST
|
|||||||
private PagingResource<TResource> ReadPagingResourceFromRequest()
|
private PagingResource<TResource> ReadPagingResourceFromRequest()
|
||||||
{
|
{
|
||||||
int pageSize;
|
int pageSize;
|
||||||
int.TryParse(Request.Query.PageSize.ToString(), out pageSize);
|
int.TryParse(Request.Query.PageSize.ToString(), out pageSize);
|
||||||
if (pageSize == 0) pageSize = 10;
|
|
||||||
|
|
||||||
int page;
|
int page;
|
||||||
int.TryParse(Request.Query.Page.ToString(), out page);
|
int.TryParse(Request.Query.Page.ToString(), out page);
|
||||||
if (page == 0) page = 1;
|
|
||||||
|
|
||||||
|
|
||||||
var pagingResource = new PagingResource<TResource>
|
var pagingResource = new PagingResource<TResource>
|
||||||
@@ -249,9 +253,16 @@ namespace NzbDrone.Api.REST
|
|||||||
{
|
{
|
||||||
pagingResource.FilterValue = Request.Query.FilterValue.ToString();
|
pagingResource.FilterValue = Request.Query.FilterValue.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Request.Query.FilterType != null)
|
||||||
|
{
|
||||||
|
pagingResource.FilterType = Request.Query.FilterType.ToString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return pagingResource;
|
return pagingResource;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Nancy;
|
||||||
|
using NzbDrone.Api.Extensions;
|
||||||
|
using NzbDrone.Core.MediaCover;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
|
using System.Linq;
|
||||||
|
using System;
|
||||||
|
using NzbDrone.Api.REST;
|
||||||
|
|
||||||
|
namespace NzbDrone.Api.Movie
|
||||||
|
{
|
||||||
|
public class MovieDiscoverModule : NzbDroneRestModule<MovieResource>
|
||||||
|
{
|
||||||
|
private readonly IDiscoverNewMovies _searchProxy;
|
||||||
|
|
||||||
|
public MovieDiscoverModule(IDiscoverNewMovies searchProxy)
|
||||||
|
: base("/movies/discover")
|
||||||
|
{
|
||||||
|
_searchProxy = searchProxy;
|
||||||
|
Get["/{action?recommendations}"] = x => Search(x.action);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Response Search(string action)
|
||||||
|
{
|
||||||
|
var imdbResults = _searchProxy.DiscoverNewMovies(action);
|
||||||
|
return MapToResource(imdbResults).AsResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<MovieResource> MapToResource(IEnumerable<Core.Tv.Movie> movies)
|
||||||
|
{
|
||||||
|
foreach (var currentSeries in movies)
|
||||||
|
{
|
||||||
|
var resource = currentSeries.ToResource();
|
||||||
|
var poster = currentSeries.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
|
||||||
|
if (poster != null)
|
||||||
|
{
|
||||||
|
resource.RemotePoster = poster.Url;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return resource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,20 +4,44 @@ using NzbDrone.Api.Extensions;
|
|||||||
using NzbDrone.Core.MediaCover;
|
using NzbDrone.Core.MediaCover;
|
||||||
using NzbDrone.Core.MetadataSource;
|
using NzbDrone.Core.MetadataSource;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System;
|
||||||
|
using NzbDrone.Api.REST;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Movie
|
namespace NzbDrone.Api.Movie
|
||||||
{
|
{
|
||||||
public class MovieLookupModule : NzbDroneRestModule<MovieResource>
|
public class MovieLookupModule : NzbDroneRestModule<MovieResource>
|
||||||
{
|
{
|
||||||
private readonly ISearchForNewMovie _searchProxy;
|
private readonly ISearchForNewMovie _searchProxy;
|
||||||
|
private readonly IProvideMovieInfo _movieInfo;
|
||||||
|
|
||||||
public MovieLookupModule(ISearchForNewMovie searchProxy)
|
public MovieLookupModule(ISearchForNewMovie searchProxy, IProvideMovieInfo movieInfo)
|
||||||
: base("/movies/lookup")
|
: base("/movies/lookup")
|
||||||
{
|
{
|
||||||
|
_movieInfo = movieInfo;
|
||||||
_searchProxy = searchProxy;
|
_searchProxy = searchProxy;
|
||||||
Get["/"] = x => Search();
|
Get["/"] = x => Search();
|
||||||
|
Get["/tmdb"] = x => SearchByTmdbId();
|
||||||
|
Get["/imdb"] = x => SearchByImdbId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Response SearchByTmdbId()
|
||||||
|
{
|
||||||
|
int tmdbId = -1;
|
||||||
|
if(Int32.TryParse(Request.Query.tmdbId, out tmdbId))
|
||||||
|
{
|
||||||
|
var result = _movieInfo.GetMovieInfo(tmdbId, null, true);
|
||||||
|
return result.ToResource().AsResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new BadRequestException("Tmdb Id was not valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Response SearchByImdbId()
|
||||||
|
{
|
||||||
|
string imdbId = Request.Query.imdbId;
|
||||||
|
var result = _movieInfo.GetMovieInfo(imdbId);
|
||||||
|
return result.ToResource().AsResponse();
|
||||||
|
}
|
||||||
|
|
||||||
private Response Search()
|
private Response Search()
|
||||||
{
|
{
|
||||||
@@ -25,7 +49,6 @@ namespace NzbDrone.Api.Movie
|
|||||||
return MapToResource(imdbResults).AsResponse();
|
return MapToResource(imdbResults).AsResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static IEnumerable<MovieResource> MapToResource(IEnumerable<Core.Tv.Movie> movies)
|
private static IEnumerable<MovieResource> MapToResource(IEnumerable<Core.Tv.Movie> movies)
|
||||||
{
|
{
|
||||||
foreach (var currentSeries in movies)
|
foreach (var currentSeries in movies)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
|
using NzbDrone.Api.Extensions;
|
||||||
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;
|
||||||
@@ -15,6 +16,9 @@ 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.SignalR;
|
using NzbDrone.SignalR;
|
||||||
|
using NzbDrone.Core.Datastore;
|
||||||
|
using Microsoft.CSharp.RuntimeBinder;
|
||||||
|
using Nancy;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Movie
|
namespace NzbDrone.Api.Movie
|
||||||
{
|
{
|
||||||
@@ -32,6 +36,8 @@ namespace NzbDrone.Api.Movie
|
|||||||
private readonly IMovieStatisticsService _moviesStatisticsService;
|
private readonly IMovieStatisticsService _moviesStatisticsService;
|
||||||
private readonly IMapCoversToLocal _coverMapper;
|
private readonly IMapCoversToLocal _coverMapper;
|
||||||
|
|
||||||
|
private const string TITLE_SLUG_ROUTE = "/titleslug/(?<slug>[^/]+)";
|
||||||
|
|
||||||
public MovieModule(IBroadcastSignalRMessage signalRBroadcaster,
|
public MovieModule(IBroadcastSignalRMessage signalRBroadcaster,
|
||||||
IMovieService moviesService,
|
IMovieService moviesService,
|
||||||
IMovieStatisticsService moviesStatisticsService,
|
IMovieStatisticsService moviesStatisticsService,
|
||||||
@@ -52,7 +58,14 @@ namespace NzbDrone.Api.Movie
|
|||||||
_coverMapper = coverMapper;
|
_coverMapper = coverMapper;
|
||||||
|
|
||||||
GetResourceAll = AllMovie;
|
GetResourceAll = AllMovie;
|
||||||
|
GetResourcePaged = GetMoviePaged;
|
||||||
GetResourceById = GetMovie;
|
GetResourceById = GetMovie;
|
||||||
|
Get[TITLE_SLUG_ROUTE] = GetByTitleSlug; /*(options) => {
|
||||||
|
return ReqResExtensions.AsResponse(GetByTitleSlug(options.slug), Nancy.HttpStatusCode.OK);
|
||||||
|
};*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CreateResource = AddMovie;
|
CreateResource = AddMovie;
|
||||||
UpdateResource = UpdateMovie;
|
UpdateResource = UpdateMovie;
|
||||||
DeleteResource = DeleteMovie;
|
DeleteResource = DeleteMovie;
|
||||||
@@ -104,6 +117,15 @@ namespace NzbDrone.Api.Movie
|
|||||||
return MapToResource(movies);
|
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)
|
protected MovieResource MapToResource(Core.Tv.Movie movies)
|
||||||
{
|
{
|
||||||
if (movies == null) return null;
|
if (movies == null) return null;
|
||||||
@@ -128,6 +150,29 @@ namespace NzbDrone.Api.Movie
|
|||||||
return 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)
|
private int AddMovie(MovieResource moviesResource)
|
||||||
{
|
{
|
||||||
var model = moviesResource.ToModel();
|
var model = moviesResource.ToModel();
|
||||||
@@ -147,14 +192,20 @@ namespace NzbDrone.Api.Movie
|
|||||||
private void DeleteMovie(int id)
|
private void DeleteMovie(int id)
|
||||||
{
|
{
|
||||||
var deleteFiles = false;
|
var deleteFiles = false;
|
||||||
|
var addExclusion = false;
|
||||||
var deleteFilesQuery = Request.Query.deleteFiles;
|
var deleteFilesQuery = Request.Query.deleteFiles;
|
||||||
|
var addExclusionQuery = Request.Query.addExclusion;
|
||||||
|
|
||||||
if (deleteFilesQuery.HasValue)
|
if (deleteFilesQuery.HasValue)
|
||||||
{
|
{
|
||||||
deleteFiles = Convert.ToBoolean(deleteFilesQuery.Value);
|
deleteFiles = Convert.ToBoolean(deleteFilesQuery.Value);
|
||||||
}
|
}
|
||||||
|
if (addExclusionQuery.HasValue)
|
||||||
|
{
|
||||||
|
addExclusion = Convert.ToBoolean(addExclusionQuery.Value);
|
||||||
|
}
|
||||||
|
|
||||||
_moviesService.DeleteMovie(id, deleteFiles);
|
_moviesService.DeleteMovie(id, deleteFiles, addExclusion);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MapCoversToLocal(params MovieResource[] movies)
|
private void MapCoversToLocal(params MovieResource[] movies)
|
||||||
@@ -185,7 +236,7 @@ namespace NzbDrone.Api.Movie
|
|||||||
|
|
||||||
private void LinkMovieStatistics(MovieResource resource, MovieStatistics moviesStatistics)
|
private void LinkMovieStatistics(MovieResource resource, MovieStatistics moviesStatistics)
|
||||||
{
|
{
|
||||||
resource.SizeOnDisk = moviesStatistics.SizeOnDisk;
|
//resource.SizeOnDisk = 0;//TODO: incorporate movie statistics moviesStatistics.SizeOnDisk;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PopulateAlternateTitles(List<MovieResource> resources)
|
private void PopulateAlternateTitles(List<MovieResource> resources)
|
||||||
|
|||||||
@@ -40,9 +40,14 @@ namespace NzbDrone.Api.Movie
|
|||||||
//View & Edit
|
//View & Edit
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
public int ProfileId { get; set; }
|
public int ProfileId { get; set; }
|
||||||
|
public MoviePathState PathState { get; set; }
|
||||||
|
|
||||||
//Editing Only
|
//Editing Only
|
||||||
public bool Monitored { get; set; }
|
public bool Monitored { get; set; }
|
||||||
|
public MovieStatusType MinimumAvailability { get; set; }
|
||||||
|
public bool IsAvailable { get; set; }
|
||||||
|
public string FolderName { get; set; }
|
||||||
|
|
||||||
public int Runtime { get; set; }
|
public int Runtime { get; set; }
|
||||||
public DateTime? LastInfoSync { get; set; }
|
public DateTime? LastInfoSync { get; set; }
|
||||||
public string CleanTitle { get; set; }
|
public string CleanTitle { get; set; }
|
||||||
@@ -116,7 +121,7 @@ namespace NzbDrone.Api.Movie
|
|||||||
//TotalEpisodeCount
|
//TotalEpisodeCount
|
||||||
//EpisodeCount
|
//EpisodeCount
|
||||||
//EpisodeFileCount
|
//EpisodeFileCount
|
||||||
//SizeOnDisk
|
SizeOnDisk = size,
|
||||||
Status = model.Status,
|
Status = model.Status,
|
||||||
Overview = model.Overview,
|
Overview = model.Overview,
|
||||||
//NextAiring
|
//NextAiring
|
||||||
@@ -127,10 +132,15 @@ namespace NzbDrone.Api.Movie
|
|||||||
|
|
||||||
Path = model.Path,
|
Path = model.Path,
|
||||||
ProfileId = model.ProfileId,
|
ProfileId = model.ProfileId,
|
||||||
|
PathState = model.PathState,
|
||||||
|
|
||||||
Monitored = model.Monitored,
|
Monitored = model.Monitored,
|
||||||
|
MinimumAvailability = model.MinimumAvailability,
|
||||||
|
|
||||||
|
IsAvailable = model.IsAvailable(),
|
||||||
|
FolderName = model.FolderName(),
|
||||||
|
|
||||||
SizeOnDisk = size,
|
//SizeOnDisk = size,
|
||||||
|
|
||||||
Runtime = model.Runtime,
|
Runtime = model.Runtime,
|
||||||
LastInfoSync = model.LastInfoSync,
|
LastInfoSync = model.LastInfoSync,
|
||||||
@@ -179,9 +189,11 @@ namespace NzbDrone.Api.Movie
|
|||||||
|
|
||||||
Path = resource.Path,
|
Path = resource.Path,
|
||||||
ProfileId = resource.ProfileId,
|
ProfileId = resource.ProfileId,
|
||||||
|
PathState = resource.PathState,
|
||||||
|
|
||||||
Monitored = resource.Monitored,
|
Monitored = resource.Monitored,
|
||||||
|
MinimumAvailability = resource.MinimumAvailability,
|
||||||
|
|
||||||
Runtime = resource.Runtime,
|
Runtime = resource.Runtime,
|
||||||
LastInfoSync = resource.LastInfoSync,
|
LastInfoSync = resource.LastInfoSync,
|
||||||
CleanTitle = resource.CleanTitle,
|
CleanTitle = resource.CleanTitle,
|
||||||
@@ -208,9 +220,11 @@ namespace NzbDrone.Api.Movie
|
|||||||
|
|
||||||
movie.Path = resource.Path;
|
movie.Path = resource.Path;
|
||||||
movie.ProfileId = resource.ProfileId;
|
movie.ProfileId = resource.ProfileId;
|
||||||
|
movie.PathState = resource.PathState;
|
||||||
|
|
||||||
movie.Monitored = resource.Monitored;
|
movie.Monitored = resource.Monitored;
|
||||||
|
movie.MinimumAvailability = resource.MinimumAvailability;
|
||||||
|
|
||||||
movie.RootFolderPath = resource.RootFolderPath;
|
movie.RootFolderPath = resource.RootFolderPath;
|
||||||
movie.Tags = resource.Tags;
|
movie.Tags = resource.Tags;
|
||||||
movie.AddOptions = resource.AddOptions;
|
movie.AddOptions = resource.AddOptions;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace NzbDrone.Api.Wanted
|
|||||||
ISeriesService seriesService,
|
ISeriesService seriesService,
|
||||||
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
||||||
IBroadcastSignalRMessage signalRBroadcaster)
|
IBroadcastSignalRMessage signalRBroadcaster)
|
||||||
: base(episodeService, seriesService, qualityUpgradableSpecification, signalRBroadcaster, "wanted/cutoff")
|
: base(episodeService, seriesService, qualityUpgradableSpecification, signalRBroadcaster, "wanted/cutoff-old")
|
||||||
{
|
{
|
||||||
_episodeCutoffService = episodeCutoffService;
|
_episodeCutoffService = episodeCutoffService;
|
||||||
GetResourcePaged = GetCutoffUnmetEpisodes;
|
GetResourcePaged = GetCutoffUnmetEpisodes;
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using NzbDrone.Api.Movie;
|
||||||
|
using NzbDrone.Api.Movies;
|
||||||
|
using NzbDrone.Core.DecisionEngine;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.SignalR;
|
||||||
|
|
||||||
|
namespace NzbDrone.Api.Wanted
|
||||||
|
{
|
||||||
|
public class MovieCutoffModule : MovieModuleWithSignalR
|
||||||
|
{
|
||||||
|
private readonly IMovieCutoffService _movieCutoffService;
|
||||||
|
|
||||||
|
public MovieCutoffModule(IMovieCutoffService movieCutoffService,
|
||||||
|
IMovieService movieService,
|
||||||
|
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
||||||
|
IBroadcastSignalRMessage signalRBroadcaster)
|
||||||
|
: base(movieService, qualityUpgradableSpecification, signalRBroadcaster, "wanted/cutoff")
|
||||||
|
{
|
||||||
|
_movieCutoffService = movieCutoffService;
|
||||||
|
GetResourcePaged = GetCutoffUnmetMovies;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PagingResource<MovieResource> GetCutoffUnmetMovies(PagingResource<MovieResource> pagingResource)
|
||||||
|
{
|
||||||
|
var pagingSpec = pagingResource.MapToPagingSpec<MovieResource, Core.Tv.Movie>("title", SortDirection.Ascending);
|
||||||
|
|
||||||
|
pagingSpec.FilterExpression = _movieService.ConstructFilterExpression(pagingResource.FilterKey, pagingResource.FilterValue);
|
||||||
|
|
||||||
|
var resource = ApplyToPage(_movieCutoffService.MoviesWhereCutoffUnmet, pagingSpec, v => MapToResource(v, true));
|
||||||
|
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,16 +12,14 @@ using NzbDrone.Core.Datastore.Events;
|
|||||||
|
|
||||||
namespace NzbDrone.Api.Wanted
|
namespace NzbDrone.Api.Wanted
|
||||||
{
|
{
|
||||||
class MovieMissingModule : NzbDroneRestModuleWithSignalR<MovieResource, Core.Tv.Movie>,
|
class MovieMissingModule : MovieModuleWithSignalR
|
||||||
IHandle<MovieGrabbedEvent>,
|
|
||||||
IHandle<MovieDownloadedEvent>
|
|
||||||
{
|
{
|
||||||
protected readonly IMovieService _movieService;
|
protected readonly IMovieService _movieService;
|
||||||
|
|
||||||
public MovieMissingModule(IMovieService movieService,
|
public MovieMissingModule(IMovieService movieService,
|
||||||
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
||||||
IBroadcastSignalRMessage signalRBroadcaster)
|
IBroadcastSignalRMessage signalRBroadcaster)
|
||||||
: base(signalRBroadcaster, "wanted/missing")
|
: base(movieService, qualityUpgradableSpecification, signalRBroadcaster, "wanted/missing")
|
||||||
{
|
{
|
||||||
|
|
||||||
_movieService = movieService;
|
_movieService = movieService;
|
||||||
@@ -30,48 +28,13 @@ namespace NzbDrone.Api.Wanted
|
|||||||
|
|
||||||
private PagingResource<MovieResource> GetMissingMovies(PagingResource<MovieResource> pagingResource)
|
private PagingResource<MovieResource> GetMissingMovies(PagingResource<MovieResource> pagingResource)
|
||||||
{
|
{
|
||||||
var pagingSpec = pagingResource.MapToPagingSpec<MovieResource, Core.Tv.Movie>("physicalRelease", SortDirection.Descending);
|
var pagingSpec = pagingResource.MapToPagingSpec<MovieResource, Core.Tv.Movie>("title", SortDirection.Descending);
|
||||||
|
|
||||||
if (pagingResource.FilterKey == "monitored" && pagingResource.FilterValue == "false")
|
pagingSpec.FilterExpression = _movieService.ConstructFilterExpression(pagingResource.FilterKey, pagingResource.FilterValue);
|
||||||
{
|
|
||||||
pagingSpec.FilterExpression = v => v.Monitored == false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pagingSpec.FilterExpression = v => v.Monitored == true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var resource = ApplyToPage(_movieService.MoviesWithoutFiles, pagingSpec, v => MapToResource(v, false));
|
var resource = ApplyToPage(_movieService.MoviesWithoutFiles, pagingSpec, v => MapToResource(v, true));
|
||||||
|
|
||||||
return resource;
|
return resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MovieResource GetMovie(int id)
|
|
||||||
{
|
|
||||||
var movie = _movieService.GetMovie(id);
|
|
||||||
var resource = MapToResource(movie, true);
|
|
||||||
return resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
private MovieResource MapToResource(Core.Tv.Movie movie, bool includeMovieFile)
|
|
||||||
{
|
|
||||||
var resource = movie.ToResource();
|
|
||||||
return resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Handle(MovieGrabbedEvent message)
|
|
||||||
{
|
|
||||||
var resource = message.Movie.Movie.ToResource();
|
|
||||||
|
|
||||||
//add a grabbed field in MovieResource?
|
|
||||||
//resource.Grabbed = true;
|
|
||||||
|
|
||||||
BroadcastResourceChange(ModelAction.Updated, resource);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Handle(MovieDownloadedEvent message)
|
|
||||||
{
|
|
||||||
BroadcastResourceChange(ModelAction.Updated, message.Movie.Movie.Id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ namespace NzbDrone.App.Test
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Ignore("Shit appveyor")]
|
||||||
public void should_return_same_instance_of_singletons()
|
public void should_return_same_instance_of_singletons()
|
||||||
{
|
{
|
||||||
var first = _container.ResolveAll<IHandle<ApplicationShutdownRequested>>().OfType<Scheduler>().Single();
|
var first = _container.ResolveAll<IHandle<ApplicationShutdownRequested>>().OfType<Scheduler>().Single();
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace NzbDrone.Common.Test.DiskTests
|
|||||||
public void should_be_able_to_check_space_on_ramdrive()
|
public void should_be_able_to_check_space_on_ramdrive()
|
||||||
{
|
{
|
||||||
MonoOnly();
|
MonoOnly();
|
||||||
Subject.GetAvailableSpace("/run/").Should().NotBe(0);
|
Subject.GetAvailableSpace("/").Should().NotBe(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ namespace NzbDrone.Common.Test.Http
|
|||||||
|
|
||||||
var userAgent = response.Resource.Headers["User-Agent"].ToString();
|
var userAgent = response.Resource.Headers["User-Agent"].ToString();
|
||||||
|
|
||||||
userAgent.Should().Contain("Sonarr");
|
userAgent.Should().Contain("Radarr");
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestCase("Accept", "text/xml, text/rss+xml, application/rss+xml")]
|
[TestCase("Accept", "text/xml, text/rss+xml, application/rss+xml")]
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using System;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using System.Collections.Specialized;
|
using System.Collections.Specialized;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace NzbDrone.Common.Test.Http
|
namespace NzbDrone.Common.Test.Http
|
||||||
{
|
{
|
||||||
@@ -36,5 +37,17 @@ namespace NzbDrone.Common.Test.Http
|
|||||||
Action action = () => httpheader.GetEncodingFromContentType();
|
Action action = () => httpheader.GetEncodingFromContentType();
|
||||||
action.ShouldThrow<ArgumentException>();
|
action.ShouldThrow<ArgumentException>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_parse_cookie_with_trailing_semi_colon()
|
||||||
|
{
|
||||||
|
var cookies = HttpHeader.ParseCookies("uid=123456; pass=123456b2f3abcde42ac3a123f3f1fc9f;");
|
||||||
|
|
||||||
|
cookies.Count.Should().Be(2);
|
||||||
|
cookies.First().Key.Should().Be("uid");
|
||||||
|
cookies.First().Value.Should().Be("123456");
|
||||||
|
cookies.Last().Key.Should().Be("pass");
|
||||||
|
cookies.Last().Value.Should().Be("123456b2f3abcde42ac3a123f3f1fc9f");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace NzbDrone.Common.Test
|
|||||||
{
|
{
|
||||||
var fakeEnvironment = new Mock<IAppFolderInfo>();
|
var fakeEnvironment = new Mock<IAppFolderInfo>();
|
||||||
|
|
||||||
fakeEnvironment.SetupGet(c => c.AppDataFolder).Returns(@"C:\NzbDrone\".AsOsAgnostic());
|
fakeEnvironment.SetupGet(c => c.AppDataFolder).Returns(@"C:\Radarr\".AsOsAgnostic());
|
||||||
|
|
||||||
fakeEnvironment.SetupGet(c => c.TempFolder).Returns(@"C:\Temp\".AsOsAgnostic());
|
fakeEnvironment.SetupGet(c => c.TempFolder).Returns(@"C:\Temp\".AsOsAgnostic());
|
||||||
|
|
||||||
@@ -233,43 +233,43 @@ namespace NzbDrone.Common.Test
|
|||||||
[Test]
|
[Test]
|
||||||
public void AppDataDirectory_path_test()
|
public void AppDataDirectory_path_test()
|
||||||
{
|
{
|
||||||
GetIAppDirectoryInfo().GetAppDataPath().Should().BeEquivalentTo(@"C:\NzbDrone\".AsOsAgnostic());
|
GetIAppDirectoryInfo().GetAppDataPath().Should().BeEquivalentTo(@"C:\Radarr\".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Config_path_test()
|
public void Config_path_test()
|
||||||
{
|
{
|
||||||
GetIAppDirectoryInfo().GetConfigPath().Should().BeEquivalentTo(@"C:\NzbDrone\Config.xml".AsOsAgnostic());
|
GetIAppDirectoryInfo().GetConfigPath().Should().BeEquivalentTo(@"C:\Radarr\Config.xml".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Sandbox()
|
public void Sandbox()
|
||||||
{
|
{
|
||||||
GetIAppDirectoryInfo().GetUpdateSandboxFolder().Should().BeEquivalentTo(@"C:\Temp\nzbdrone_update\".AsOsAgnostic());
|
GetIAppDirectoryInfo().GetUpdateSandboxFolder().Should().BeEquivalentTo(@"C:\Temp\radarr_update\".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void GetUpdatePackageFolder()
|
public void GetUpdatePackageFolder()
|
||||||
{
|
{
|
||||||
GetIAppDirectoryInfo().GetUpdatePackageFolder().Should().BeEquivalentTo(@"C:\Temp\nzbdrone_update\NzbDrone\".AsOsAgnostic());
|
GetIAppDirectoryInfo().GetUpdatePackageFolder().Should().BeEquivalentTo(@"C:\Temp\radarr_update\Radarr\".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void GetUpdateClientFolder()
|
public void GetUpdateClientFolder()
|
||||||
{
|
{
|
||||||
GetIAppDirectoryInfo().GetUpdateClientFolder().Should().BeEquivalentTo(@"C:\Temp\nzbdrone_update\NzbDrone\NzbDrone.Update\".AsOsAgnostic());
|
GetIAppDirectoryInfo().GetUpdateClientFolder().Should().BeEquivalentTo(@"C:\Temp\radarr_update\Radarr\NzbDrone.Update\".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void GetUpdateClientExePath()
|
public void GetUpdateClientExePath()
|
||||||
{
|
{
|
||||||
GetIAppDirectoryInfo().GetUpdateClientExePath().Should().BeEquivalentTo(@"C:\Temp\nzbdrone_update\Radarr.Update.exe".AsOsAgnostic());
|
GetIAppDirectoryInfo().GetUpdateClientExePath().Should().BeEquivalentTo(@"C:\Temp\radarr_update\Radarr.Update.exe".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void GetUpdateLogFolder()
|
public void GetUpdateLogFolder()
|
||||||
{
|
{
|
||||||
GetIAppDirectoryInfo().GetUpdateLogFolder().Should().BeEquivalentTo(@"C:\NzbDrone\UpdateLogs\".AsOsAgnostic());
|
GetIAppDirectoryInfo().GetUpdateLogFolder().Should().BeEquivalentTo(@"C:\Radarr\UpdateLogs\".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using NzbDrone.Common.Model;
|
|||||||
using NzbDrone.Common.Processes;
|
using NzbDrone.Common.Processes;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
using NzbDrone.Test.Dummy;
|
using NzbDrone.Test.Dummy;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace NzbDrone.Common.Test
|
namespace NzbDrone.Common.Test
|
||||||
{
|
{
|
||||||
@@ -64,9 +65,18 @@ namespace NzbDrone.Common.Test
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Ignore("Shit appveyor")]
|
||||||
public void Should_be_able_to_start_process()
|
public void Should_be_able_to_start_process()
|
||||||
{
|
{
|
||||||
var process = Subject.Start(Path.Combine(Directory.GetCurrentDirectory(), DummyApp.DUMMY_PROCCESS_NAME + ".exe"));
|
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
|
||||||
|
UriBuilder uri = new UriBuilder(codeBase);
|
||||||
|
string path = Uri.UnescapeDataString(uri.Path);
|
||||||
|
var rPath = Path.GetDirectoryName(path);
|
||||||
|
|
||||||
|
var root = Directory.GetParent(rPath).Parent.Parent.Parent;
|
||||||
|
var DummyAppDir = Path.Combine(root.FullName, "NzbDrone.Test.Dummy", "bin", "Release");
|
||||||
|
|
||||||
|
var process = Subject.Start(Path.Combine(DummyAppDir, DummyApp.DUMMY_PROCCESS_NAME + ".exe"));
|
||||||
|
|
||||||
Subject.Exists(DummyApp.DUMMY_PROCCESS_NAME).Should()
|
Subject.Exists(DummyApp.DUMMY_PROCCESS_NAME).Should()
|
||||||
.BeTrue("excepted one dummy process to be already running");
|
.BeTrue("excepted one dummy process to be already running");
|
||||||
@@ -79,6 +89,7 @@ namespace NzbDrone.Common.Test
|
|||||||
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Ignore("Shit appveyor")]
|
||||||
public void kill_all_should_kill_all_process_with_name()
|
public void kill_all_should_kill_all_process_with_name()
|
||||||
{
|
{
|
||||||
var dummy1 = StartDummyProcess();
|
var dummy1 = StartDummyProcess();
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ namespace NzbDrone.Common.Test
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Ignore("Shit appveyor")]
|
||||||
public void should_throw_if_starting_a_running_serivce()
|
public void should_throw_if_starting_a_running_serivce()
|
||||||
{
|
{
|
||||||
Subject.GetService(ALWAYS_INSTALLED_SERVICE).Status
|
Subject.GetService(ALWAYS_INSTALLED_SERVICE).Status
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ namespace NzbDrone.Common.Test
|
|||||||
}
|
}
|
||||||
|
|
||||||
[TestCase("")]
|
[TestCase("")]
|
||||||
[TestCase("http://")]
|
|
||||||
public void DownloadString_should_throw_on_error(string url)
|
public void DownloadString_should_throw_on_error(string url)
|
||||||
{
|
{
|
||||||
Assert.Throws<ArgumentException>(() => Subject.DownloadString(url));
|
Assert.Throws<ArgumentException>(() => Subject.DownloadString(url));
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using NzbDrone.Common.EnsureThat;
|
|||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Instrumentation;
|
using NzbDrone.Common.Instrumentation;
|
||||||
|
using System.Drawing;
|
||||||
|
|
||||||
namespace NzbDrone.Common.Disk
|
namespace NzbDrone.Common.Disk
|
||||||
{
|
{
|
||||||
@@ -107,6 +108,41 @@ namespace NzbDrone.Common.Disk
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool CanUseGDIPlus()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
GdiPlusInterop.CheckGdiPlus();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (DllNotFoundException ex)
|
||||||
|
{
|
||||||
|
Logger.Trace(ex, "System does not have libgdiplus.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsValidGDIPlusImage(string filename)
|
||||||
|
{
|
||||||
|
if (!CanUseGDIPlus())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (var bmp = new Bitmap(filename))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.Debug(ex, "Corrupted image found at: {0}.", filename);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool FolderWritable(string path)
|
public bool FolderWritable(string path)
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
|
|
||||||
namespace NzbDrone.Core.MediaCover
|
namespace NzbDrone.Common.Disk
|
||||||
{
|
{
|
||||||
public static class GdiPlusInterop
|
public static class GdiPlusInterop
|
||||||
{
|
{
|
||||||
@@ -19,6 +19,8 @@ namespace NzbDrone.Common.Disk
|
|||||||
bool FolderExists(string path);
|
bool FolderExists(string path);
|
||||||
bool FileExists(string path);
|
bool FileExists(string path);
|
||||||
bool FileExists(string path, StringComparison stringComparison);
|
bool FileExists(string path, StringComparison stringComparison);
|
||||||
|
bool CanUseGDIPlus();
|
||||||
|
bool IsValidGDIPlusImage(string path);
|
||||||
bool FolderWritable(string path);
|
bool FolderWritable(string path);
|
||||||
string[] GetDirectories(string path);
|
string[] GetDirectories(string path);
|
||||||
string[] GetFiles(string path, SearchOption searchOption);
|
string[] GetFiles(string path, SearchOption searchOption);
|
||||||
|
|||||||
+2
-2
@@ -2,7 +2,7 @@ using System;
|
|||||||
|
|
||||||
namespace NzbDrone.Common.Extensions
|
namespace NzbDrone.Common.Extensions
|
||||||
{
|
{
|
||||||
public static class Base64Extentions
|
public static class Base64Extensions
|
||||||
{
|
{
|
||||||
public static string ToBase64(this byte[] bytes)
|
public static string ToBase64(this byte[] bytes)
|
||||||
{
|
{
|
||||||
@@ -14,4 +14,4 @@ namespace NzbDrone.Common.Extensions
|
|||||||
return BitConverter.GetBytes(input).ToBase64();
|
return BitConverter.GetBytes(input).ToBase64();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
@@ -80,5 +80,30 @@ namespace NzbDrone.Common.Extensions
|
|||||||
{
|
{
|
||||||
return source.Select(predicate).ToList();
|
return source.Select(predicate).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<T> DropLast<T>(this IEnumerable<T> source, int n)
|
||||||
|
{
|
||||||
|
if (source == null)
|
||||||
|
throw new ArgumentNullException("source");
|
||||||
|
|
||||||
|
if (n < 0)
|
||||||
|
throw new ArgumentOutOfRangeException("n",
|
||||||
|
"Argument n should be non-negative.");
|
||||||
|
|
||||||
|
return InternalDropLast(source, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<T> InternalDropLast<T>(IEnumerable<T> source, int n)
|
||||||
|
{
|
||||||
|
Queue<T> buffer = new Queue<T>(n + 1);
|
||||||
|
|
||||||
|
foreach (T x in source)
|
||||||
|
{
|
||||||
|
buffer.Enqueue(x);
|
||||||
|
|
||||||
|
if (buffer.Count == n + 1)
|
||||||
|
yield return buffer.Dequeue();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-2
@@ -5,11 +5,11 @@ using System.Xml.Linq;
|
|||||||
|
|
||||||
namespace NzbDrone.Common.Extensions
|
namespace NzbDrone.Common.Extensions
|
||||||
{
|
{
|
||||||
public static class XmlExtentions
|
public static class XmlExtensions
|
||||||
{
|
{
|
||||||
public static IEnumerable<XElement> FindDecendants(this XContainer container, string localName)
|
public static IEnumerable<XElement> FindDecendants(this XContainer container, string localName)
|
||||||
{
|
{
|
||||||
return container.Descendants().Where(c => c.Name.LocalName.Equals(localName, StringComparison.InvariantCultureIgnoreCase));
|
return container.Descendants().Where(c => c.Name.LocalName.Equals(localName, StringComparison.InvariantCultureIgnoreCase));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
{
|
{
|
||||||
public static readonly HttpAccept Rss = new HttpAccept("application/rss+xml, text/rss+xml, application/xml, text/xml");
|
public static readonly HttpAccept Rss = new HttpAccept("application/rss+xml, text/rss+xml, application/xml, text/xml");
|
||||||
public static readonly HttpAccept Json = new HttpAccept("application/json");
|
public static readonly HttpAccept Json = new HttpAccept("application/json");
|
||||||
|
public static readonly HttpAccept JsonCharset = new HttpAccept("application/json;charset=utf-8");
|
||||||
public static readonly HttpAccept Html = new HttpAccept("text/html");
|
public static readonly HttpAccept Html = new HttpAccept("text/html");
|
||||||
|
|
||||||
public string Value { get; private set; }
|
public string Value { get; private set; }
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Specialized;
|
using System.Collections.Specialized;
|
||||||
@@ -169,7 +169,7 @@ namespace NzbDrone.Common.Http
|
|||||||
|
|
||||||
public static List<KeyValuePair<string, string>> ParseCookies(string cookies)
|
public static List<KeyValuePair<string, string>> ParseCookies(string cookies)
|
||||||
{
|
{
|
||||||
return cookies.Split(';')
|
return cookies.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries)
|
||||||
.Select(v => v.Trim().Split('='))
|
.Select(v => v.Trim().Split('='))
|
||||||
.Select(v => new KeyValuePair<string, string>(v[0], v[1]))
|
.Select(v => new KeyValuePair<string, string>(v[0], v[1]))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace NzbDrone.Common.Http
|
|||||||
public class JsonRpcRequestBuilder : HttpRequestBuilder
|
public class JsonRpcRequestBuilder : HttpRequestBuilder
|
||||||
{
|
{
|
||||||
public static HttpAccept JsonRpcHttpAccept = new HttpAccept("application/json-rpc, application/json");
|
public static HttpAccept JsonRpcHttpAccept = new HttpAccept("application/json-rpc, application/json");
|
||||||
public static string JsonRpcContentType = "application/json-rpc";
|
public static string JsonRpcContentType = "application/json";
|
||||||
|
|
||||||
public string JsonMethod { get; private set; }
|
public string JsonMethod { get; private set; }
|
||||||
public List<object> JsonParameters { get; private set; }
|
public List<object> JsonParameters { get; private set; }
|
||||||
|
|||||||
@@ -60,6 +60,7 @@
|
|||||||
<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.ServiceProcess" />
|
<Reference Include="System.ServiceProcess" />
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="ICSharpCode.SharpZipLib">
|
<Reference Include="ICSharpCode.SharpZipLib">
|
||||||
@@ -89,6 +90,7 @@
|
|||||||
<Compile Include="Disk\FileSystemModel.cs" />
|
<Compile Include="Disk\FileSystemModel.cs" />
|
||||||
<Compile Include="Disk\FileSystemResult.cs" />
|
<Compile Include="Disk\FileSystemResult.cs" />
|
||||||
<Compile Include="Extensions\DictionaryExtensions.cs" />
|
<Compile Include="Extensions\DictionaryExtensions.cs" />
|
||||||
|
<Compile Include="Disk\GdiPlusInterop.cs" />
|
||||||
<Compile Include="Disk\OsPath.cs" />
|
<Compile Include="Disk\OsPath.cs" />
|
||||||
<Compile Include="Disk\DiskProviderBase.cs" />
|
<Compile Include="Disk\DiskProviderBase.cs" />
|
||||||
<Compile Include="Disk\IDiskProvider.cs" />
|
<Compile Include="Disk\IDiskProvider.cs" />
|
||||||
@@ -145,14 +147,14 @@
|
|||||||
<Compile Include="Expansive\Tree.cs" />
|
<Compile Include="Expansive\Tree.cs" />
|
||||||
<Compile Include="Expansive\TreeNode.cs" />
|
<Compile Include="Expansive\TreeNode.cs" />
|
||||||
<Compile Include="Expansive\TreeNodeList.cs" />
|
<Compile Include="Expansive\TreeNodeList.cs" />
|
||||||
<Compile Include="Extensions\Base64Extentions.cs" />
|
<Compile Include="Extensions\Base64Extensions.cs" />
|
||||||
<Compile Include="Extensions\DateTimeExtensions.cs" />
|
<Compile Include="Extensions\DateTimeExtensions.cs" />
|
||||||
<Compile Include="Crypto\HashConverter.cs" />
|
<Compile Include="Crypto\HashConverter.cs" />
|
||||||
<Compile Include="Extensions\Int64Extensions.cs" />
|
<Compile Include="Extensions\Int64Extensions.cs" />
|
||||||
<Compile Include="Extensions\ObjectExtensions.cs" />
|
<Compile Include="Extensions\ObjectExtensions.cs" />
|
||||||
<Compile Include="Extensions\StreamExtensions.cs" />
|
<Compile Include="Extensions\StreamExtensions.cs" />
|
||||||
<Compile Include="Extensions\UrlExtensions.cs" />
|
<Compile Include="Extensions\UrlExtensions.cs" />
|
||||||
<Compile Include="Extensions\XmlExtentions.cs" />
|
<Compile Include="Extensions\XmlExtensions.cs" />
|
||||||
<Compile Include="HashUtil.cs" />
|
<Compile Include="HashUtil.cs" />
|
||||||
<Compile Include="Http\Dispatchers\CurlHttpDispatcher.cs" />
|
<Compile Include="Http\Dispatchers\CurlHttpDispatcher.cs" />
|
||||||
<Compile Include="Http\Dispatchers\FallbackHttpDispatcher.cs" />
|
<Compile Include="Http\Dispatchers\FallbackHttpDispatcher.cs" />
|
||||||
@@ -257,4 +259,4 @@
|
|||||||
<Target Name="AfterBuild">
|
<Target Name="AfterBuild">
|
||||||
</Target>
|
</Target>
|
||||||
-->
|
-->
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -315,6 +315,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"))
|
||||||
.Where(process =>
|
.Where(process =>
|
||||||
process.Modules.Cast<ProcessModule>()
|
process.Modules.Cast<ProcessModule>()
|
||||||
.Any(module =>
|
.Any(module =>
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ namespace NzbDrone.Core.Test.Blacklisting
|
|||||||
_blacklist = new Blacklist
|
_blacklist = new Blacklist
|
||||||
{
|
{
|
||||||
SeriesId = 12345,
|
SeriesId = 12345,
|
||||||
|
MovieId = 1234,
|
||||||
EpisodeIds = new List<int> { 1 },
|
EpisodeIds = new List<int> { 1 },
|
||||||
Quality = new QualityModel(Quality.Bluray720p),
|
Quality = new QualityModel(Quality.Bluray720p),
|
||||||
SourceTitle = "series.title.s01e01",
|
SourceTitle = "series.title.s01e01",
|
||||||
@@ -47,7 +48,7 @@ namespace NzbDrone.Core.Test.Blacklisting
|
|||||||
{
|
{
|
||||||
Subject.Insert(_blacklist);
|
Subject.Insert(_blacklist);
|
||||||
|
|
||||||
Subject.BlacklistedByTitle(_blacklist.SeriesId, _blacklist.SourceTitle.ToUpperInvariant()).Should().HaveCount(1);
|
Subject.BlacklistedByTitle(_blacklist.MovieId, _blacklist.SourceTitle.ToUpperInvariant()).Should().HaveCount(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ namespace NzbDrone.Core.Test.Blacklisting
|
|||||||
{
|
{
|
||||||
_event = new DownloadFailedEvent
|
_event = new DownloadFailedEvent
|
||||||
{
|
{
|
||||||
SeriesId = 12345,
|
SeriesId = 0,
|
||||||
EpisodeIds = new List<int> {1},
|
MovieId = 69,
|
||||||
|
EpisodeIds = null,
|
||||||
Quality = new QualityModel(Quality.Bluray720p),
|
Quality = new QualityModel(Quality.Bluray720p),
|
||||||
SourceTitle = "series.title.s01e01",
|
SourceTitle = "series.title.s01e01",
|
||||||
DownloadClient = "SabnzbdClient",
|
DownloadClient = "SabnzbdClient",
|
||||||
@@ -40,7 +41,7 @@ namespace NzbDrone.Core.Test.Blacklisting
|
|||||||
Subject.Handle(_event);
|
Subject.Handle(_event);
|
||||||
|
|
||||||
Mocker.GetMock<IBlacklistRepository>()
|
Mocker.GetMock<IBlacklistRepository>()
|
||||||
.Verify(v => v.Insert(It.Is<Blacklist>(b => b.EpisodeIds == _event.EpisodeIds)), Times.Once());
|
.Verify(v => v.Insert(It.Is<Blacklist>(b => b.MovieId == _event.MovieId)), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -52,7 +53,7 @@ namespace NzbDrone.Core.Test.Blacklisting
|
|||||||
_event.Data.Remove("protocol");
|
_event.Data.Remove("protocol");
|
||||||
|
|
||||||
Mocker.GetMock<IBlacklistRepository>()
|
Mocker.GetMock<IBlacklistRepository>()
|
||||||
.Verify(v => v.Insert(It.Is<Blacklist>(b => b.EpisodeIds == _event.EpisodeIds)), Times.Once());
|
.Verify(v => v.Insert(It.Is<Blacklist>(b => b.MovieId == _event.MovieId)), Times.Once());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
using FizzWare.NBuilder;
|
||||||
|
using FluentAssertions;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using Moq;
|
||||||
|
using NzbDrone.Core.Organizer;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Core.Tv.Events;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.BulkImport
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class AddMultiMoviesFixture : CoreTest<MovieService>
|
||||||
|
{
|
||||||
|
private List<Movie> fakeMovies;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
fakeMovies = Builder<Movie>.CreateListOfSize(3).BuildList();
|
||||||
|
fakeMovies.ForEach(m =>
|
||||||
|
{
|
||||||
|
m.Path = null;
|
||||||
|
m.RootFolderPath = @"C:\Test\TV";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void movies_added_event_should_have_proper_path()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IBuildFileNames>()
|
||||||
|
.Setup(s => s.GetMovieFolder(It.IsAny<Movie>(), null))
|
||||||
|
.Returns((Movie m, NamingConfig n) => m.Title);
|
||||||
|
|
||||||
|
var movies = Subject.AddMovies(fakeMovies);
|
||||||
|
|
||||||
|
foreach (Movie movie in movies)
|
||||||
|
{
|
||||||
|
movie.Path.Should().NotBeNullOrEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Subject.GetAllMovies().Should().HaveCount(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void movies_added_should_ignore_already_added()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IBuildFileNames>()
|
||||||
|
.Setup(s => s.GetMovieFolder(It.IsAny<Movie>(), null))
|
||||||
|
.Returns((Movie m, NamingConfig n) => m.Title);
|
||||||
|
|
||||||
|
Mocker.GetMock<IMovieRepository>().Setup(s => s.All()).Returns(new List<Movie> { fakeMovies[0] });
|
||||||
|
|
||||||
|
var movies = Subject.AddMovies(fakeMovies);
|
||||||
|
|
||||||
|
Mocker.GetMock<IMovieRepository>().Verify(v => v.InsertMany(It.Is<List<Movie>>(l => l.Count == 2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void movies_added_should_ignore_duplicates()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IBuildFileNames>()
|
||||||
|
.Setup(s => s.GetMovieFolder(It.IsAny<Movie>(), null))
|
||||||
|
.Returns((Movie m, NamingConfig n) => m.Title);
|
||||||
|
|
||||||
|
fakeMovies[2].TmdbId = fakeMovies[0].TmdbId;
|
||||||
|
|
||||||
|
var movies = Subject.AddMovies(fakeMovies);
|
||||||
|
|
||||||
|
Mocker.GetMock<IMovieRepository>().Verify(v => v.InsertMany(It.Is<List<Movie>>(l => l.Count == 2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,6 +17,7 @@ namespace NzbDrone.Core.Test.DataAugmentation.DailySeries
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Ignore("Series")]
|
||||||
public void should_get_list_of_daily_series()
|
public void should_get_list_of_daily_series()
|
||||||
{
|
{
|
||||||
var list = Subject.GetDailySeriesIds();
|
var list = Subject.GetDailySeriesIds();
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using NzbDrone.Test.Common.Categories;
|
|||||||
namespace NzbDrone.Core.Test.DataAugmentation.Scene
|
namespace NzbDrone.Core.Test.DataAugmentation.Scene
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("Series")]
|
||||||
[IntegrationTest]
|
[IntegrationTest]
|
||||||
public class SceneMappingProxyFixture : CoreTest<SceneMappingProxy>
|
public class SceneMappingProxyFixture : CoreTest<SceneMappingProxy>
|
||||||
{
|
{
|
||||||
@@ -18,6 +19,7 @@ namespace NzbDrone.Core.Test.DataAugmentation.Scene
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|
||||||
public void fetch_should_return_list_of_mappings()
|
public void fetch_should_return_list_of_mappings()
|
||||||
{
|
{
|
||||||
var mappings = Subject.Fetch();
|
var mappings = Subject.Fetch();
|
||||||
|
|||||||
@@ -1,312 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using FizzWare.NBuilder;
|
|
||||||
using FluentAssertions;
|
|
||||||
using Moq;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using NzbDrone.Core.DataAugmentation.Xem;
|
|
||||||
using NzbDrone.Core.DataAugmentation.Xem.Model;
|
|
||||||
using NzbDrone.Core.Test.Framework;
|
|
||||||
using NzbDrone.Core.Tv;
|
|
||||||
using NzbDrone.Core.Tv.Events;
|
|
||||||
using NzbDrone.Test.Common;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Test.DataAugmentation.SceneNumbering
|
|
||||||
{
|
|
||||||
[TestFixture]
|
|
||||||
public class XemServiceFixture : CoreTest<XemService>
|
|
||||||
{
|
|
||||||
private Series _series;
|
|
||||||
private List<int> _theXemSeriesIds;
|
|
||||||
private List<XemSceneTvdbMapping> _theXemTvdbMappings;
|
|
||||||
private List<Episode> _episodes;
|
|
||||||
|
|
||||||
[SetUp]
|
|
||||||
public void SetUp()
|
|
||||||
{
|
|
||||||
_series = Builder<Series>.CreateNew()
|
|
||||||
.With(v => v.TvdbId = 10)
|
|
||||||
.With(v => v.UseSceneNumbering = false)
|
|
||||||
.BuildNew();
|
|
||||||
|
|
||||||
_theXemSeriesIds = new List<int> { 120 };
|
|
||||||
Mocker.GetMock<IXemProxy>()
|
|
||||||
.Setup(v => v.GetXemSeriesIds())
|
|
||||||
.Returns(_theXemSeriesIds);
|
|
||||||
|
|
||||||
_theXemTvdbMappings = new List<XemSceneTvdbMapping>();
|
|
||||||
Mocker.GetMock<IXemProxy>()
|
|
||||||
.Setup(v => v.GetSceneTvdbMappings(10))
|
|
||||||
.Returns(_theXemTvdbMappings);
|
|
||||||
|
|
||||||
_episodes = new List<Episode>();
|
|
||||||
_episodes.Add(new Episode { SeasonNumber = 1, EpisodeNumber = 1 });
|
|
||||||
_episodes.Add(new Episode { SeasonNumber = 1, EpisodeNumber = 2 });
|
|
||||||
_episodes.Add(new Episode { SeasonNumber = 2, EpisodeNumber = 1 });
|
|
||||||
_episodes.Add(new Episode { SeasonNumber = 2, EpisodeNumber = 2 });
|
|
||||||
_episodes.Add(new Episode { SeasonNumber = 2, EpisodeNumber = 3 });
|
|
||||||
_episodes.Add(new Episode { SeasonNumber = 2, EpisodeNumber = 4 });
|
|
||||||
_episodes.Add(new Episode { SeasonNumber = 2, EpisodeNumber = 5 });
|
|
||||||
_episodes.Add(new Episode { SeasonNumber = 3, EpisodeNumber = 1 });
|
|
||||||
_episodes.Add(new Episode { SeasonNumber = 3, EpisodeNumber = 2 });
|
|
||||||
|
|
||||||
Mocker.GetMock<IEpisodeService>()
|
|
||||||
.Setup(v => v.GetEpisodeBySeries(It.IsAny<int>()))
|
|
||||||
.Returns(_episodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GivenTvdbMappings()
|
|
||||||
{
|
|
||||||
_theXemSeriesIds.Add(10);
|
|
||||||
|
|
||||||
AddTvdbMapping(1, 1, 1, 1, 1, 1); // 1x01 -> 1x01
|
|
||||||
AddTvdbMapping(2, 1, 2, 2, 1, 2); // 1x02 -> 1x02
|
|
||||||
AddTvdbMapping(3, 2, 1, 3, 2, 1); // 2x01 -> 2x01
|
|
||||||
AddTvdbMapping(4, 2, 2, 4, 2, 2); // 2x02 -> 2x02
|
|
||||||
AddTvdbMapping(5, 2, 3, 5, 2, 3); // 2x03 -> 2x03
|
|
||||||
AddTvdbMapping(6, 3, 1, 6, 2, 4); // 3x01 -> 2x04
|
|
||||||
AddTvdbMapping(7, 3, 2, 7, 2, 5); // 3x02 -> 2x05
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GivenExistingMapping()
|
|
||||||
{
|
|
||||||
_series.UseSceneNumbering = true;
|
|
||||||
|
|
||||||
_episodes[0].SceneSeasonNumber = 1;
|
|
||||||
_episodes[0].SceneEpisodeNumber = 1;
|
|
||||||
_episodes[1].SceneSeasonNumber = 1;
|
|
||||||
_episodes[1].SceneEpisodeNumber = 2;
|
|
||||||
_episodes[2].SceneSeasonNumber = 2;
|
|
||||||
_episodes[2].SceneEpisodeNumber = 1;
|
|
||||||
_episodes[3].SceneSeasonNumber = 2;
|
|
||||||
_episodes[3].SceneEpisodeNumber = 2;
|
|
||||||
_episodes[4].SceneSeasonNumber = 2;
|
|
||||||
_episodes[4].SceneEpisodeNumber = 3;
|
|
||||||
_episodes[5].SceneSeasonNumber = 3;
|
|
||||||
_episodes[5].SceneEpisodeNumber = 1;
|
|
||||||
_episodes[6].SceneSeasonNumber = 3;
|
|
||||||
_episodes[6].SceneEpisodeNumber = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddTvdbMapping(int sceneAbsolute, int sceneSeason, int sceneEpisode, int tvdbAbsolute, int tvdbSeason, int tvdbEpisode)
|
|
||||||
{
|
|
||||||
_theXemTvdbMappings.Add(new XemSceneTvdbMapping
|
|
||||||
{
|
|
||||||
Scene = new XemValues { Absolute = sceneAbsolute, Season = sceneSeason, Episode = sceneEpisode },
|
|
||||||
Tvdb = new XemValues { Absolute = tvdbAbsolute, Season = tvdbSeason, Episode = tvdbEpisode },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_not_fetch_scenenumbering_if_not_listed()
|
|
||||||
{
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
Mocker.GetMock<IXemProxy>()
|
|
||||||
.Verify(v => v.GetSceneTvdbMappings(10), Times.Never());
|
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesService>()
|
|
||||||
.Verify(v => v.UpdateSeries(It.IsAny<Series>()), Times.Never());
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_fetch_scenenumbering()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesService>()
|
|
||||||
.Verify(v => v.UpdateSeries(It.Is<Series>(s => s.UseSceneNumbering == true)), Times.Once());
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_clear_scenenumbering_if_removed_from_thexem()
|
|
||||||
{
|
|
||||||
GivenExistingMapping();
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesService>()
|
|
||||||
.Verify(v => v.UpdateSeries(It.IsAny<Series>()), Times.Once());
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_not_clear_scenenumbering_if_no_results_at_all_from_thexem()
|
|
||||||
{
|
|
||||||
GivenExistingMapping();
|
|
||||||
|
|
||||||
_theXemSeriesIds.Clear();
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesService>()
|
|
||||||
.Verify(v => v.UpdateSeries(It.IsAny<Series>()), Times.Never());
|
|
||||||
|
|
||||||
ExceptionVerification.ExpectedWarns(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_not_clear_scenenumbering_if_thexem_throws()
|
|
||||||
{
|
|
||||||
GivenExistingMapping();
|
|
||||||
|
|
||||||
Mocker.GetMock<IXemProxy>()
|
|
||||||
.Setup(v => v.GetXemSeriesIds())
|
|
||||||
.Throws(new InvalidOperationException());
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesService>()
|
|
||||||
.Verify(v => v.UpdateSeries(It.IsAny<Series>()), Times.Never());
|
|
||||||
|
|
||||||
ExceptionVerification.ExpectedWarns(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_flag_unknown_future_episodes_if_existing_season_is_mapped()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
_theXemTvdbMappings.RemoveAll(v => v.Tvdb.Season == 2 && v.Tvdb.Episode == 5);
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 2 && v.EpisodeNumber == 5);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_flag_unknown_future_season_if_future_season_is_shifted()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 3 && v.EpisodeNumber == 1);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_not_flag_unknown_future_season_if_future_season_is_not_shifted()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
_theXemTvdbMappings.RemoveAll(v => v.Scene.Season == 3);
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 3 && v.EpisodeNumber == 1);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_not_flag_past_episodes_if_not_causing_overlaps()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
_theXemTvdbMappings.RemoveAll(v => v.Scene.Season == 2);
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 2 && v.EpisodeNumber == 1);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_flag_past_episodes_if_causing_overlap()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
_theXemTvdbMappings.RemoveAll(v => v.Scene.Season == 2 && v.Tvdb.Episode <= 1);
|
|
||||||
_theXemTvdbMappings.First(v => v.Scene.Season == 2 && v.Scene.Episode == 2).Scene.Episode = 1;
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 2 && v.EpisodeNumber == 1);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_not_extrapolate_season_with_specials()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
var specialMapping = _theXemTvdbMappings.First(v => v.Tvdb.Season == 2 && v.Tvdb.Episode == 5);
|
|
||||||
specialMapping.Tvdb.Season = 0;
|
|
||||||
specialMapping.Tvdb.Episode = 1;
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 2 && v.EpisodeNumber == 5);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeTrue();
|
|
||||||
episode.SceneSeasonNumber.Should().NotHaveValue();
|
|
||||||
episode.SceneEpisodeNumber.Should().NotHaveValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_extrapolate_season_with_future_episodes()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
_theXemTvdbMappings.RemoveAll(v => v.Tvdb.Season == 2 && v.Tvdb.Episode == 5);
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 2 && v.EpisodeNumber == 5);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeTrue();
|
|
||||||
episode.SceneSeasonNumber.Should().Be(3);
|
|
||||||
episode.SceneEpisodeNumber.Should().Be(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_extrapolate_season_with_shifted_episodes()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
_theXemTvdbMappings.RemoveAll(v => v.Tvdb.Season == 2 && v.Tvdb.Episode == 5);
|
|
||||||
var dualMapping = _theXemTvdbMappings.First(v => v.Tvdb.Season == 2 && v.Tvdb.Episode == 4);
|
|
||||||
dualMapping.Scene.Season = 2;
|
|
||||||
dualMapping.Scene.Episode = 3;
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 2 && v.EpisodeNumber == 5);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeTrue();
|
|
||||||
episode.SceneSeasonNumber.Should().Be(2);
|
|
||||||
episode.SceneEpisodeNumber.Should().Be(4);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_extrapolate_shifted_future_seasons()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 3 && v.EpisodeNumber == 2);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeTrue();
|
|
||||||
episode.SceneSeasonNumber.Should().Be(4);
|
|
||||||
episode.SceneEpisodeNumber.Should().Be(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_not_extrapolate_matching_future_seasons()
|
|
||||||
{
|
|
||||||
GivenTvdbMappings();
|
|
||||||
_theXemTvdbMappings.RemoveAll(v => v.Scene.Season != 1);
|
|
||||||
|
|
||||||
Subject.Handle(new SeriesUpdatedEvent(_series));
|
|
||||||
|
|
||||||
var episode = _episodes.First(v => v.SeasonNumber == 3 && v.EpisodeNumber == 2);
|
|
||||||
|
|
||||||
episode.UnverifiedSceneNumbering.Should().BeFalse();
|
|
||||||
episode.SceneSeasonNumber.Should().NotHaveValue();
|
|
||||||
episode.SceneEpisodeNumber.Should().NotHaveValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -20,6 +20,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
private RemoteEpisode parseResultMulti;
|
private RemoteEpisode parseResultMulti;
|
||||||
private RemoteEpisode parseResultSingle;
|
private RemoteEpisode parseResultSingle;
|
||||||
private Series series;
|
private Series series;
|
||||||
|
private Movie movie;
|
||||||
|
private RemoteMovie remoteMovie;
|
||||||
private QualityDefinition qualityType;
|
private QualityDefinition qualityType;
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
@@ -28,6 +30,16 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
series = Builder<Series>.CreateNew()
|
series = Builder<Series>.CreateNew()
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
|
movie = Builder<Movie>.CreateNew().Build();
|
||||||
|
|
||||||
|
remoteMovie = new RemoteMovie
|
||||||
|
{
|
||||||
|
Movie = movie,
|
||||||
|
Release = new ReleaseInfo(),
|
||||||
|
ParsedMovieInfo = new ParsedMovieInfo { Quality = new QualityModel(Quality.SDTV, new Revision(version: 2)) },
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
parseResultMultiSet = new RemoteEpisode
|
parseResultMultiSet = new RemoteEpisode
|
||||||
{
|
{
|
||||||
Series = series,
|
Series = series,
|
||||||
@@ -216,5 +228,17 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
|
|
||||||
Subject.IsSatisfiedBy(parseResultSingle, null).Accepted.Should().BeTrue();
|
Subject.IsSatisfiedBy(parseResultSingle, null).Accepted.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_use_110_minutes_if_runtime_is_0()
|
||||||
|
{
|
||||||
|
movie.Runtime = 0;
|
||||||
|
remoteMovie.Movie = movie;
|
||||||
|
remoteMovie.Release.Size = 1095.Megabytes();
|
||||||
|
|
||||||
|
Subject.IsSatisfiedBy(remoteMovie, null).Accepted.Should().Be(true);
|
||||||
|
remoteMovie.Release.Size = 1105.Megabytes();
|
||||||
|
Subject.IsSatisfiedBy(remoteMovie, null).Accepted.Should().Be(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
public class DownloadDecisionMakerFixture : CoreTest<DownloadDecisionMaker>
|
public class DownloadDecisionMakerFixture : CoreTest<DownloadDecisionMaker>
|
||||||
{
|
{
|
||||||
private List<ReleaseInfo> _reports;
|
private List<ReleaseInfo> _reports;
|
||||||
private RemoteEpisode _remoteEpisode;
|
private RemoteMovie _remoteEpisode;
|
||||||
|
|
||||||
private Mock<IDecisionEngineSpecification> _pass1;
|
private Mock<IDecisionEngineSpecification> _pass1;
|
||||||
private Mock<IDecisionEngineSpecification> _pass2;
|
private Mock<IDecisionEngineSpecification> _pass2;
|
||||||
@@ -39,22 +39,21 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
_fail2 = new Mock<IDecisionEngineSpecification>();
|
_fail2 = new Mock<IDecisionEngineSpecification>();
|
||||||
_fail3 = new Mock<IDecisionEngineSpecification>();
|
_fail3 = new Mock<IDecisionEngineSpecification>();
|
||||||
|
|
||||||
_pass1.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null)).Returns(Decision.Accept);
|
_pass1.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null)).Returns(Decision.Accept);
|
||||||
_pass2.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null)).Returns(Decision.Accept);
|
_pass2.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null)).Returns(Decision.Accept);
|
||||||
_pass3.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null)).Returns(Decision.Accept);
|
_pass3.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null)).Returns(Decision.Accept);
|
||||||
|
|
||||||
_fail1.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null)).Returns(Decision.Reject("fail1"));
|
_fail1.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null)).Returns(Decision.Reject("fail1"));
|
||||||
_fail2.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null)).Returns(Decision.Reject("fail2"));
|
_fail2.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null)).Returns(Decision.Reject("fail2"));
|
||||||
_fail3.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null)).Returns(Decision.Reject("fail3"));
|
_fail3.Setup(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null)).Returns(Decision.Reject("fail3"));
|
||||||
|
|
||||||
_reports = new List<ReleaseInfo> { new ReleaseInfo { Title = "The.Office.S03E115.DVDRip.XviD-OSiTV" } };
|
_reports = new List<ReleaseInfo> { new ReleaseInfo { Title = "Trolls.2016.720p.WEB-DL.DD5.1.H264-FGT" } };
|
||||||
_remoteEpisode = new RemoteEpisode {
|
_remoteEpisode = new RemoteMovie {
|
||||||
Series = new Series(),
|
Movie = new Movie(),
|
||||||
Episodes = new List<Episode> { new Episode() }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>()
|
Mocker.GetMock<IParsingService>()
|
||||||
.Setup(c => c.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<SearchCriteriaBase>()))
|
.Setup(c => c.Map(It.IsAny<ParsedMovieInfo>(), It.IsAny<string>(), It.IsAny<SearchCriteriaBase>()))
|
||||||
.Returns(_remoteEpisode);
|
.Returns(_remoteEpisode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,11 +124,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
|
|
||||||
var results = Subject.GetRssDecision(_reports).ToList();
|
var results = Subject.GetRssDecision(_reports).ToList();
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>().Verify(c => c.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<SearchCriteriaBase>()), Times.Never());
|
Mocker.GetMock<IParsingService>().Verify(c => c.Map(It.IsAny<ParsedMovieInfo>(), It.IsAny<string>(), It.IsAny<SearchCriteriaBase>()), Times.Never());
|
||||||
|
|
||||||
_pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null), Times.Never());
|
_pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null), Times.Never());
|
||||||
_pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null), Times.Never());
|
_pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null), Times.Never());
|
||||||
_pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null), Times.Never());
|
_pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null), Times.Never());
|
||||||
|
|
||||||
results.Should().BeEmpty();
|
results.Should().BeEmpty();
|
||||||
}
|
}
|
||||||
@@ -142,11 +141,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
|
|
||||||
var results = Subject.GetRssDecision(_reports).ToList();
|
var results = Subject.GetRssDecision(_reports).ToList();
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>().Verify(c => c.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<SearchCriteriaBase>()), Times.Never());
|
Mocker.GetMock<IParsingService>().Verify(c => c.Map(It.IsAny<ParsedMovieInfo>(), It.IsAny<string>(), It.IsAny<SearchCriteriaBase>()), Times.Never());
|
||||||
|
|
||||||
_pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null), Times.Never());
|
_pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null), Times.Never());
|
||||||
_pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null), Times.Never());
|
_pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null), Times.Never());
|
||||||
_pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null), Times.Never());
|
_pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null), Times.Never());
|
||||||
|
|
||||||
results.Should().BeEmpty();
|
results.Should().BeEmpty();
|
||||||
}
|
}
|
||||||
@@ -156,13 +155,13 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
{
|
{
|
||||||
GivenSpecifications(_pass1, _pass2, _pass3);
|
GivenSpecifications(_pass1, _pass2, _pass3);
|
||||||
|
|
||||||
_remoteEpisode.Series = null;
|
_remoteEpisode.Movie = null;
|
||||||
|
|
||||||
Subject.GetRssDecision(_reports);
|
Subject.GetRssDecision(_reports);
|
||||||
|
|
||||||
_pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null), Times.Never());
|
_pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null), Times.Never());
|
||||||
_pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null), Times.Never());
|
_pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null), Times.Never());
|
||||||
_pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteEpisode>(), null), Times.Never());
|
_pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteMovie>(), null), Times.Never());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -170,19 +169,19 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
{
|
{
|
||||||
GivenSpecifications(_pass1);
|
GivenSpecifications(_pass1);
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>().Setup(c => c.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<SearchCriteriaBase>()))
|
Mocker.GetMock<IParsingService>().Setup(c => c.Map(It.IsAny<ParsedMovieInfo>(), It.IsAny<string>(), It.IsAny<SearchCriteriaBase>()))
|
||||||
.Throws<TestException>();
|
.Throws<TestException>();
|
||||||
|
|
||||||
_reports = new List<ReleaseInfo>
|
_reports = new List<ReleaseInfo>
|
||||||
{
|
{
|
||||||
new ReleaseInfo{Title = "The.Office.S03E115.DVDRip.XviD-OSiTV"},
|
new ReleaseInfo{Title = "Trolls.2016.720p.WEB-DL.DD5.1.H264-FGT"},
|
||||||
new ReleaseInfo{Title = "The.Office.S03E115.DVDRip.XviD-OSiTV"},
|
new ReleaseInfo{Title = "Trolls.2016.720p.WEB-DL.DD5.1.H264-FGT"},
|
||||||
new ReleaseInfo{Title = "The.Office.S03E115.DVDRip.XviD-OSiTV"}
|
new ReleaseInfo{Title = "Trolls.2016.720p.WEB-DL.DD5.1.H264-FGT"}
|
||||||
};
|
};
|
||||||
|
|
||||||
Subject.GetRssDecision(_reports);
|
Subject.GetRssDecision(_reports);
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>().Verify(c => c.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<SearchCriteriaBase>()), Times.Exactly(_reports.Count));
|
Mocker.GetMock<IParsingService>().Verify(c => c.Map(It.IsAny<ParsedMovieInfo>(), It.IsAny<string>(), It.IsAny<SearchCriteriaBase>()), Times.Exactly(_reports.Count));
|
||||||
|
|
||||||
ExceptionVerification.ExpectedErrors(3);
|
ExceptionVerification.ExpectedErrors(3);
|
||||||
}
|
}
|
||||||
@@ -192,7 +191,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
{
|
{
|
||||||
GivenSpecifications(_pass1, _pass2, _pass3);
|
GivenSpecifications(_pass1, _pass2, _pass3);
|
||||||
|
|
||||||
_remoteEpisode.Series = null;
|
_remoteEpisode.Movie = null;
|
||||||
|
|
||||||
var result = Subject.GetRssDecision(_reports);
|
var result = Subject.GetRssDecision(_reports);
|
||||||
|
|
||||||
@@ -200,6 +199,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Ignore( "Series")]
|
||||||
public void should_only_include_reports_for_requested_episodes()
|
public void should_only_include_reports_for_requested_episodes()
|
||||||
{
|
{
|
||||||
var series = Builder<Series>.CreateNew().Build();
|
var series = Builder<Series>.CreateNew().Build();
|
||||||
@@ -248,27 +248,28 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
{
|
{
|
||||||
GivenSpecifications(_pass1, _pass2, _pass3);
|
GivenSpecifications(_pass1, _pass2, _pass3);
|
||||||
|
|
||||||
_remoteEpisode.Series = null;
|
_remoteEpisode.Movie = null;
|
||||||
|
|
||||||
var result = Subject.GetRssDecision(_reports);
|
var result = Subject.GetRssDecision(_reports);
|
||||||
|
|
||||||
result.Should().HaveCount(1);
|
result.Should().HaveCount(1);
|
||||||
|
|
||||||
result.First().RemoteEpisode.DownloadAllowed.Should().BeFalse();
|
result.First().RemoteMovie.DownloadAllowed.Should().BeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Ignore("Series")]
|
||||||
public void should_not_allow_download_if_no_episodes_found()
|
public void should_not_allow_download_if_no_episodes_found()
|
||||||
{
|
{
|
||||||
GivenSpecifications(_pass1, _pass2, _pass3);
|
GivenSpecifications(_pass1, _pass2, _pass3);
|
||||||
|
|
||||||
_remoteEpisode.Episodes = new List<Episode>();
|
_remoteEpisode.Movie = null;
|
||||||
|
|
||||||
var result = Subject.GetRssDecision(_reports);
|
var result = Subject.GetRssDecision(_reports);
|
||||||
|
|
||||||
result.Should().HaveCount(1);
|
result.Should().HaveCount(1);
|
||||||
|
|
||||||
result.First().RemoteEpisode.DownloadAllowed.Should().BeFalse();
|
result.First().RemoteMovie.DownloadAllowed.Should().BeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -276,12 +277,12 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
{
|
{
|
||||||
GivenSpecifications(_pass1);
|
GivenSpecifications(_pass1);
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>().Setup(c => c.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<SearchCriteriaBase>()))
|
Mocker.GetMock<IParsingService>().Setup(c => c.Map(It.IsAny<ParsedMovieInfo>(), It.IsAny<string>(), It.IsAny<SearchCriteriaBase>()))
|
||||||
.Throws<TestException>();
|
.Throws<TestException>();
|
||||||
|
|
||||||
_reports = new List<ReleaseInfo>
|
_reports = new List<ReleaseInfo>
|
||||||
{
|
{
|
||||||
new ReleaseInfo{Title = "The.Office.S03E115.DVDRip.XviD-OSiTV"},
|
new ReleaseInfo{Title = "Trolls.2016.720p.WEB-DL.DD5.1.H264-FGT"},
|
||||||
};
|
};
|
||||||
|
|
||||||
Subject.GetRssDecision(_reports).Should().HaveCount(1);
|
Subject.GetRssDecision(_reports).Should().HaveCount(1);
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ using System.Collections.Generic;
|
|||||||
namespace NzbDrone.Core.Test.DecisionEngineTests
|
namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("Series")]
|
||||||
public class FullSeasonSpecificationFixture : CoreTest<FullSeasonSpecification>
|
public class FullSeasonSpecificationFixture : CoreTest<FullSeasonSpecification>
|
||||||
{
|
{
|
||||||
private RemoteEpisode _remoteEpisode;
|
private RemoteEpisode _remoteEpisode;
|
||||||
|
|||||||
@@ -26,34 +26,28 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
GivenPreferredDownloadProtocol(DownloadProtocol.Usenet);
|
GivenPreferredDownloadProtocol(DownloadProtocol.Usenet);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Episode GivenEpisode(int id)
|
private RemoteMovie GivenRemoteMovie(QualityModel quality, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet)
|
||||||
{
|
{
|
||||||
return Builder<Episode>.CreateNew()
|
var remoteMovie = new RemoteMovie();
|
||||||
.With(e => e.Id = id)
|
remoteMovie.ParsedMovieInfo = new ParsedMovieInfo();
|
||||||
.With(e => e.EpisodeNumber = id)
|
remoteMovie.ParsedMovieInfo.MovieTitle = "A Movie";
|
||||||
.Build();
|
remoteMovie.ParsedMovieInfo.Year = 1998;
|
||||||
}
|
remoteMovie.ParsedMovieInfo.MovieTitleInfo = new SeriesTitleInfo { Year = 1998};
|
||||||
|
remoteMovie.ParsedMovieInfo.MovieTitleInfo.Year = 1998;
|
||||||
|
remoteMovie.ParsedMovieInfo.Quality = quality;
|
||||||
|
|
||||||
private RemoteEpisode GivenRemoteEpisode(List<Episode> episodes, QualityModel quality, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet)
|
remoteMovie.Movie = Builder<Movie>.CreateNew().With(m => m.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities(),
|
||||||
{
|
PreferredTags = new List<string> { "DTS-HD", "SPARKS"} })
|
||||||
var remoteEpisode = new RemoteEpisode();
|
.With(m => m.Title = "A Movie").Build();
|
||||||
remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo();
|
|
||||||
remoteEpisode.ParsedEpisodeInfo.Quality = quality;
|
|
||||||
|
|
||||||
remoteEpisode.Episodes = new List<Episode>();
|
remoteMovie.Release = new ReleaseInfo();
|
||||||
remoteEpisode.Episodes.AddRange(episodes);
|
remoteMovie.Release.PublishDate = DateTime.Now.AddDays(-age);
|
||||||
|
remoteMovie.Release.Size = size;
|
||||||
|
remoteMovie.Release.DownloadProtocol = downloadProtocol;
|
||||||
|
remoteMovie.Release.Title = "A Movie 1998";
|
||||||
|
|
||||||
remoteEpisode.Release = new ReleaseInfo();
|
return remoteMovie;
|
||||||
remoteEpisode.Release.PublishDate = DateTime.Now.AddDays(-age);
|
}
|
||||||
remoteEpisode.Release.Size = size;
|
|
||||||
remoteEpisode.Release.DownloadProtocol = downloadProtocol;
|
|
||||||
|
|
||||||
remoteEpisode.Series = Builder<Series>.CreateNew()
|
|
||||||
.With(e => e.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities() })
|
|
||||||
.Build();
|
|
||||||
|
|
||||||
return remoteEpisode;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GivenPreferredDownloadProtocol(DownloadProtocol downloadProtocol)
|
private void GivenPreferredDownloadProtocol(DownloadProtocol downloadProtocol)
|
||||||
{
|
{
|
||||||
@@ -68,66 +62,38 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_put_propers_before_non_propers()
|
public void should_put_propers_before_non_propers()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p, new Revision(version: 1)));
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p, new Revision(version: 1)));
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p, new Revision(version: 2)));
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p, new Revision(version: 2)));
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
qualifiedReports.First().RemoteEpisode.ParsedEpisodeInfo.Quality.Revision.Version.Should().Be(2);
|
qualifiedReports.First().RemoteMovie.ParsedMovieInfo.Quality.Revision.Version.Should().Be(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_put_higher_quality_before_lower()
|
public void should_put_higher_quality_before_lower()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.SDTV));
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.SDTV));
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
qualifiedReports.First().RemoteEpisode.ParsedEpisodeInfo.Quality.Quality.Should().Be(Quality.HDTV720p);
|
qualifiedReports.First().RemoteMovie.ParsedMovieInfo.Quality.Quality.Should().Be(Quality.HDTV720p);
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_order_by_lowest_number_of_episodes()
|
|
||||||
{
|
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(2) }, new QualityModel(Quality.HDTV720p));
|
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
|
||||||
qualifiedReports.First().RemoteEpisode.Episodes.First().EpisodeNumber.Should().Be(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_order_by_lowest_number_of_episodes_with_multiple_episodes()
|
|
||||||
{
|
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(2), GivenEpisode(3) }, new QualityModel(Quality.HDTV720p));
|
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1), GivenEpisode(2) }, new QualityModel(Quality.HDTV720p));
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
|
||||||
qualifiedReports.First().RemoteEpisode.Episodes.First().EpisodeNumber.Should().Be(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_order_by_age_then_largest_rounded_to_200mb()
|
public void should_order_by_age_then_largest_rounded_to_200mb()
|
||||||
{
|
{
|
||||||
var remoteEpisodeSd = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.SDTV), size: 100.Megabytes(), age: 1);
|
var remoteEpisodeSd = GivenRemoteMovie(new QualityModel(Quality.SDTV), size: 100.Megabytes(), age: 1);
|
||||||
var remoteEpisodeHdSmallOld = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), size: 1200.Megabytes(), age: 1000);
|
var remoteEpisodeHdSmallOld = GivenRemoteMovie(new QualityModel(Quality.HDTV720p), size: 1200.Megabytes(), age: 1000);
|
||||||
var remoteEpisodeSmallYoung = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), size: 1250.Megabytes(), age: 10);
|
var remoteEpisodeSmallYoung = GivenRemoteMovie(new QualityModel(Quality.HDTV720p), size: 1250.Megabytes(), age: 10);
|
||||||
var remoteEpisodeHdLargeYoung = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), size: 3000.Megabytes(), age: 1);
|
var remoteEpisodeHdLargeYoung = GivenRemoteMovie(new QualityModel(Quality.HDTV720p), size: 3000.Megabytes(), age: 1);
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisodeSd));
|
decisions.Add(new DownloadDecision(remoteEpisodeSd));
|
||||||
@@ -135,38 +101,23 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
decisions.Add(new DownloadDecision(remoteEpisodeSmallYoung));
|
decisions.Add(new DownloadDecision(remoteEpisodeSmallYoung));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisodeHdLargeYoung));
|
decisions.Add(new DownloadDecision(remoteEpisodeHdLargeYoung));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
qualifiedReports.First().RemoteEpisode.Should().Be(remoteEpisodeHdLargeYoung);
|
qualifiedReports.First().RemoteMovie.Should().Be(remoteEpisodeHdLargeYoung);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_order_by_youngest()
|
public void should_order_by_youngest()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), age: 10);
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p), age: 10);
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), age: 5);
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p), age: 5);
|
||||||
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
qualifiedReports.First().RemoteEpisode.Should().Be(remoteEpisode2);
|
qualifiedReports.First().RemoteMovie.Should().Be(remoteEpisode2);
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_not_throw_if_no_episodes_are_found()
|
|
||||||
{
|
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), size: 500.Megabytes());
|
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), size: 500.Megabytes());
|
|
||||||
|
|
||||||
remoteEpisode1.Episodes = new List<Episode>();
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
|
||||||
|
|
||||||
Subject.PrioritizeDecisions(decisions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -174,15 +125,15 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
{
|
{
|
||||||
GivenPreferredDownloadProtocol(DownloadProtocol.Usenet);
|
GivenPreferredDownloadProtocol(DownloadProtocol.Usenet);
|
||||||
|
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), downloadProtocol: DownloadProtocol.Torrent);
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p), downloadProtocol: DownloadProtocol.Torrent);
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), downloadProtocol: DownloadProtocol.Usenet);
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p), downloadProtocol: DownloadProtocol.Usenet);
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
qualifiedReports.First().RemoteEpisode.Release.DownloadProtocol.Should().Be(DownloadProtocol.Usenet);
|
qualifiedReports.First().RemoteMovie.Release.DownloadProtocol.Should().Be(DownloadProtocol.Usenet);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -190,38 +141,22 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
{
|
{
|
||||||
GivenPreferredDownloadProtocol(DownloadProtocol.Torrent);
|
GivenPreferredDownloadProtocol(DownloadProtocol.Torrent);
|
||||||
|
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), downloadProtocol: DownloadProtocol.Torrent);
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p), downloadProtocol: DownloadProtocol.Torrent);
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p), downloadProtocol: DownloadProtocol.Usenet);
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p), downloadProtocol: DownloadProtocol.Usenet);
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
qualifiedReports.First().RemoteEpisode.Release.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
|
qualifiedReports.First().RemoteMovie.Release.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_prefer_season_pack_above_single_episode()
|
|
||||||
{
|
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1), GivenEpisode(2) }, new QualityModel(Quality.HDTV720p));
|
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
|
||||||
|
|
||||||
remoteEpisode1.ParsedEpisodeInfo.FullSeason = true;
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
|
||||||
qualifiedReports.First().RemoteEpisode.ParsedEpisodeInfo.FullSeason.Should().BeTrue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_prefer_releases_with_more_seeders()
|
public void should_prefer_releases_with_more_seeders()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
|
|
||||||
var torrentInfo1 = new TorrentInfo();
|
var torrentInfo1 = new TorrentInfo();
|
||||||
torrentInfo1.PublishDate = DateTime.Now;
|
torrentInfo1.PublishDate = DateTime.Now;
|
||||||
@@ -233,21 +168,23 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
torrentInfo2.Seeders = 100;
|
torrentInfo2.Seeders = 100;
|
||||||
|
|
||||||
remoteEpisode1.Release = torrentInfo1;
|
remoteEpisode1.Release = torrentInfo1;
|
||||||
remoteEpisode2.Release = torrentInfo2;
|
remoteEpisode1.Release.Title = "A Movie 1998";
|
||||||
|
remoteEpisode2.Release = torrentInfo2;
|
||||||
|
remoteEpisode2.Release.Title = "A Movie 1998";
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
((TorrentInfo) qualifiedReports.First().RemoteEpisode.Release).Seeders.Should().Be(torrentInfo2.Seeders);
|
((TorrentInfo) qualifiedReports.First().RemoteMovie.Release).Seeders.Should().Be(torrentInfo2.Seeders);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_prefer_releases_with_more_peers_given_equal_number_of_seeds()
|
public void should_prefer_releases_with_more_peers_given_equal_number_of_seeds()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
|
|
||||||
var torrentInfo1 = new TorrentInfo();
|
var torrentInfo1 = new TorrentInfo();
|
||||||
torrentInfo1.PublishDate = DateTime.Now;
|
torrentInfo1.PublishDate = DateTime.Now;
|
||||||
@@ -261,21 +198,23 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
torrentInfo2.Peers = 100;
|
torrentInfo2.Peers = 100;
|
||||||
|
|
||||||
remoteEpisode1.Release = torrentInfo1;
|
remoteEpisode1.Release = torrentInfo1;
|
||||||
remoteEpisode2.Release = torrentInfo2;
|
remoteEpisode1.Release.Title = "A Movie 1998";
|
||||||
|
remoteEpisode2.Release = torrentInfo2;
|
||||||
|
remoteEpisode2.Release.Title = "A Movie 1998";
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
((TorrentInfo)qualifiedReports.First().RemoteEpisode.Release).Peers.Should().Be(torrentInfo2.Peers);
|
((TorrentInfo)qualifiedReports.First().RemoteMovie.Release).Peers.Should().Be(torrentInfo2.Peers);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_prefer_releases_with_more_peers_no_seeds()
|
public void should_prefer_releases_with_more_peers_no_seeds()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
|
|
||||||
var torrentInfo1 = new TorrentInfo();
|
var torrentInfo1 = new TorrentInfo();
|
||||||
torrentInfo1.PublishDate = DateTime.Now;
|
torrentInfo1.PublishDate = DateTime.Now;
|
||||||
@@ -290,21 +229,23 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
torrentInfo2.Peers = 100;
|
torrentInfo2.Peers = 100;
|
||||||
|
|
||||||
remoteEpisode1.Release = torrentInfo1;
|
remoteEpisode1.Release = torrentInfo1;
|
||||||
remoteEpisode2.Release = torrentInfo2;
|
remoteEpisode1.Release.Title = "A Movie 1998";
|
||||||
|
remoteEpisode2.Release = torrentInfo2;
|
||||||
|
remoteEpisode2.Release.Title = "A Movie 1998";
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
((TorrentInfo)qualifiedReports.First().RemoteEpisode.Release).Peers.Should().Be(torrentInfo2.Peers);
|
((TorrentInfo)qualifiedReports.First().RemoteMovie.Release).Peers.Should().Be(torrentInfo2.Peers);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_prefer_first_release_if_peers_and_size_are_too_similar()
|
public void should_prefer_first_release_if_peers_and_size_are_too_similar()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
|
|
||||||
var torrentInfo1 = new TorrentInfo();
|
var torrentInfo1 = new TorrentInfo();
|
||||||
torrentInfo1.PublishDate = DateTime.Now;
|
torrentInfo1.PublishDate = DateTime.Now;
|
||||||
@@ -319,21 +260,23 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
torrentInfo1.Size = 250.Megabytes();
|
torrentInfo1.Size = 250.Megabytes();
|
||||||
|
|
||||||
remoteEpisode1.Release = torrentInfo1;
|
remoteEpisode1.Release = torrentInfo1;
|
||||||
|
remoteEpisode1.Release.Title = "A Movie 1998";
|
||||||
remoteEpisode2.Release = torrentInfo2;
|
remoteEpisode2.Release = torrentInfo2;
|
||||||
|
remoteEpisode2.Release.Title = "A Movie 1998";
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
((TorrentInfo) qualifiedReports.First().RemoteEpisode.Release).Should().Be(torrentInfo1);
|
((TorrentInfo) qualifiedReports.First().RemoteMovie.Release).Should().Be(torrentInfo1);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_prefer_first_release_if_age_and_size_are_too_similar()
|
public void should_prefer_first_release_if_age_and_size_are_too_similar()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode2 = GivenRemoteEpisode(new List<Episode> { GivenEpisode(1) }, new QualityModel(Quality.HDTV720p));
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
|
|
||||||
remoteEpisode1.Release.PublishDate = DateTime.UtcNow.AddDays(-100);
|
remoteEpisode1.Release.PublishDate = DateTime.UtcNow.AddDays(-100);
|
||||||
remoteEpisode1.Release.Size = 200.Megabytes();
|
remoteEpisode1.Release.Size = 200.Megabytes();
|
||||||
@@ -345,8 +288,25 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
var qualifiedReports = Subject.PrioritizeDecisions(decisions);
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
qualifiedReports.First().RemoteEpisode.Release.Should().Be(remoteEpisode1.Release);
|
qualifiedReports.First().RemoteMovie.Release.Should().Be(remoteEpisode1.Release);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_prefer_more_prioritized_words()
|
||||||
|
{
|
||||||
|
var remoteEpisode1 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
|
var remoteEpisode2 = GivenRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
|
|
||||||
|
remoteEpisode1.Release.Title += " DTS-HD";
|
||||||
|
remoteEpisode2.Release.Title += " DTS-HD SPARKS";
|
||||||
|
|
||||||
|
var decisions = new List<DownloadDecision>();
|
||||||
|
decisions.Add(new DownloadDecision(remoteEpisode1));
|
||||||
|
decisions.Add(new DownloadDecision(remoteEpisode2));
|
||||||
|
|
||||||
|
var qualifiedReports = Subject.PrioritizeDecisionsForMovies(decisions);
|
||||||
|
qualifiedReports.First().RemoteMovie.Release.Should().Be(remoteEpisode2.Release);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
{
|
{
|
||||||
private Profile _profile;
|
private Profile _profile;
|
||||||
private DelayProfile _delayProfile;
|
private DelayProfile _delayProfile;
|
||||||
private RemoteEpisode _remoteEpisode;
|
private RemoteMovie _remoteEpisode;
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void Setup()
|
public void Setup()
|
||||||
@@ -38,12 +38,12 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
.With(d => d.PreferredProtocol = DownloadProtocol.Usenet)
|
.With(d => d.PreferredProtocol = DownloadProtocol.Usenet)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
var series = Builder<Series>.CreateNew()
|
var series = Builder<Movie>.CreateNew()
|
||||||
.With(s => s.Profile = _profile)
|
.With(s => s.Profile = _profile)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
_remoteEpisode = Builder<RemoteEpisode>.CreateNew()
|
_remoteEpisode = Builder<RemoteMovie>.CreateNew()
|
||||||
.With(r => r.Series = series)
|
.With(r => r.Movie = series)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
_profile.Items = new List<ProfileQualityItem>();
|
_profile.Items = new List<ProfileQualityItem>();
|
||||||
@@ -53,30 +53,32 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
|
|
||||||
_profile.Cutoff = Quality.WEBDL720p;
|
_profile.Cutoff = Quality.WEBDL720p;
|
||||||
|
|
||||||
_remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo();
|
_remoteEpisode.ParsedMovieInfo = new ParsedMovieInfo();
|
||||||
_remoteEpisode.Release = new ReleaseInfo();
|
_remoteEpisode.Release = new ReleaseInfo();
|
||||||
_remoteEpisode.Release.DownloadProtocol = DownloadProtocol.Usenet;
|
_remoteEpisode.Release.DownloadProtocol = DownloadProtocol.Usenet;
|
||||||
|
|
||||||
_remoteEpisode.Episodes = Builder<Episode>.CreateListOfSize(1).Build().ToList();
|
//_remoteEpisode.Episodes = Builder<Episode>.CreateListOfSize(1).Build().ToList();
|
||||||
_remoteEpisode.Episodes.First().EpisodeFileId = 0;
|
//_remoteEpisode.Episodes.First().EpisodeFileId = 0;
|
||||||
|
|
||||||
Mocker.GetMock<IDelayProfileService>()
|
Mocker.GetMock<IDelayProfileService>()
|
||||||
.Setup(s => s.BestForTags(It.IsAny<HashSet<int>>()))
|
.Setup(s => s.BestForTags(It.IsAny<HashSet<int>>()))
|
||||||
.Returns(_delayProfile);
|
.Returns(_delayProfile);
|
||||||
|
|
||||||
Mocker.GetMock<IPendingReleaseService>()
|
Mocker.GetMock<IPendingReleaseService>()
|
||||||
.Setup(s => s.GetPendingRemoteEpisodes(It.IsAny<int>()))
|
.Setup(s => s.GetPendingRemoteMovies(It.IsAny<int>()))
|
||||||
.Returns(new List<RemoteEpisode>());
|
.Returns(new List<RemoteMovie>());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenExistingFile(QualityModel quality)
|
private void GivenExistingFile(QualityModel quality)
|
||||||
{
|
{
|
||||||
_remoteEpisode.Episodes.First().EpisodeFileId = 1;
|
//_remoteEpisode.Episodes.First().EpisodeFileId = 1;
|
||||||
|
|
||||||
_remoteEpisode.Episodes.First().EpisodeFile = new LazyLoaded<EpisodeFile>(new EpisodeFile
|
//_remoteEpisode.Episodes.First().EpisodeFile = new LazyLoaded<EpisodeFile>(new EpisodeFile
|
||||||
{
|
// {
|
||||||
Quality = quality
|
// Quality = quality
|
||||||
});
|
// });
|
||||||
|
|
||||||
|
_remoteEpisode.Movie.MovieFile = new LazyLoaded<MovieFile>(new MovieFile { Quality = quality });
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenUpgradeForExistingFile()
|
private void GivenUpgradeForExistingFile()
|
||||||
@@ -95,7 +97,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_be_false_when_system_invoked_search_and_release_is_younger_than_delay()
|
public void should_be_false_when_system_invoked_search_and_release_is_younger_than_delay()
|
||||||
{
|
{
|
||||||
_remoteEpisode.ParsedEpisodeInfo.Quality = new QualityModel(Quality.SDTV);
|
_remoteEpisode.ParsedMovieInfo.Quality = new QualityModel(Quality.SDTV);
|
||||||
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
||||||
|
|
||||||
_delayProfile.UsenetDelay = 720;
|
_delayProfile.UsenetDelay = 720;
|
||||||
@@ -114,7 +116,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_be_true_when_quality_is_last_allowed_in_profile()
|
public void should_be_true_when_quality_is_last_allowed_in_profile()
|
||||||
{
|
{
|
||||||
_remoteEpisode.ParsedEpisodeInfo.Quality = new QualityModel(Quality.Bluray720p);
|
_remoteEpisode.ParsedMovieInfo.Quality = new QualityModel(Quality.Bluray720p);
|
||||||
|
|
||||||
Subject.IsSatisfiedBy(_remoteEpisode, null).Accepted.Should().BeTrue();
|
Subject.IsSatisfiedBy(_remoteEpisode, null).Accepted.Should().BeTrue();
|
||||||
}
|
}
|
||||||
@@ -122,7 +124,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_be_true_when_release_is_older_than_delay()
|
public void should_be_true_when_release_is_older_than_delay()
|
||||||
{
|
{
|
||||||
_remoteEpisode.ParsedEpisodeInfo.Quality = new QualityModel(Quality.HDTV720p);
|
_remoteEpisode.ParsedMovieInfo.Quality = new QualityModel(Quality.HDTV720p);
|
||||||
_remoteEpisode.Release.PublishDate = DateTime.UtcNow.AddHours(-10);
|
_remoteEpisode.Release.PublishDate = DateTime.UtcNow.AddHours(-10);
|
||||||
|
|
||||||
_delayProfile.UsenetDelay = 60;
|
_delayProfile.UsenetDelay = 60;
|
||||||
@@ -133,7 +135,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_be_false_when_release_is_younger_than_delay()
|
public void should_be_false_when_release_is_younger_than_delay()
|
||||||
{
|
{
|
||||||
_remoteEpisode.ParsedEpisodeInfo.Quality = new QualityModel(Quality.SDTV);
|
_remoteEpisode.ParsedMovieInfo.Quality = new QualityModel(Quality.SDTV);
|
||||||
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
||||||
|
|
||||||
_delayProfile.UsenetDelay = 720;
|
_delayProfile.UsenetDelay = 720;
|
||||||
@@ -144,7 +146,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_be_true_when_release_is_a_proper_for_existing_episode()
|
public void should_be_true_when_release_is_a_proper_for_existing_episode()
|
||||||
{
|
{
|
||||||
_remoteEpisode.ParsedEpisodeInfo.Quality = new QualityModel(Quality.HDTV720p, new Revision(version: 2));
|
_remoteEpisode.ParsedMovieInfo.Quality = new QualityModel(Quality.HDTV720p, new Revision(version: 2));
|
||||||
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
||||||
|
|
||||||
GivenExistingFile(new QualityModel(Quality.HDTV720p));
|
GivenExistingFile(new QualityModel(Quality.HDTV720p));
|
||||||
@@ -162,7 +164,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_be_true_when_release_is_a_real_for_existing_episode()
|
public void should_be_true_when_release_is_a_real_for_existing_episode()
|
||||||
{
|
{
|
||||||
_remoteEpisode.ParsedEpisodeInfo.Quality = new QualityModel(Quality.HDTV720p, new Revision(real: 1));
|
_remoteEpisode.ParsedMovieInfo.Quality = new QualityModel(Quality.HDTV720p, new Revision(real: 1));
|
||||||
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
||||||
|
|
||||||
GivenExistingFile(new QualityModel(Quality.HDTV720p));
|
GivenExistingFile(new QualityModel(Quality.HDTV720p));
|
||||||
@@ -180,7 +182,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_be_false_when_release_is_proper_for_existing_episode_of_different_quality()
|
public void should_be_false_when_release_is_proper_for_existing_episode_of_different_quality()
|
||||||
{
|
{
|
||||||
_remoteEpisode.ParsedEpisodeInfo.Quality = new QualityModel(Quality.HDTV720p, new Revision(version: 2));
|
_remoteEpisode.ParsedMovieInfo.Quality = new QualityModel(Quality.HDTV720p, new Revision(version: 2));
|
||||||
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
_remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
||||||
|
|
||||||
GivenExistingFile(new QualityModel(Quality.SDTV));
|
GivenExistingFile(new QualityModel(Quality.SDTV));
|
||||||
|
|||||||
@@ -31,15 +31,15 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
var completed = Builder<DownloadClientItem>.CreateNew()
|
var completed = Builder<DownloadClientItem>.CreateNew()
|
||||||
.With(h => h.Status = DownloadItemStatus.Completed)
|
.With(h => h.Status = DownloadItemStatus.Completed)
|
||||||
.With(h => h.OutputPath = new OsPath(@"C:\DropFolder\MyDownload".AsOsAgnostic()))
|
.With(h => h.OutputPath = new OsPath(@"C:\DropFolder\MyDownload".AsOsAgnostic()))
|
||||||
.With(h => h.Title = "Drone.S01E01.HDTV")
|
.With(h => h.Title = "Drone.1998")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
var remoteEpisode = BuildRemoteEpisode();
|
var remoteEpisode = BuildRemoteMovie();
|
||||||
|
|
||||||
_trackedDownload = Builder<TrackedDownload>.CreateNew()
|
_trackedDownload = Builder<TrackedDownload>.CreateNew()
|
||||||
.With(c => c.State = TrackedDownloadStage.Downloading)
|
.With(c => c.State = TrackedDownloadStage.Downloading)
|
||||||
.With(c => c.DownloadItem = completed)
|
.With(c => c.DownloadItem = completed)
|
||||||
.With(c => c.RemoteEpisode = remoteEpisode)
|
.With(c => c.RemoteMovie = remoteEpisode)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
|
|
||||||
@@ -56,17 +56,16 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
.Returns(new History.History());
|
.Returns(new History.History());
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>()
|
Mocker.GetMock<IParsingService>()
|
||||||
.Setup(s => s.GetSeries("Drone.S01E01.HDTV"))
|
.Setup(s => s.GetMovie("Drone.1998"))
|
||||||
.Returns(remoteEpisode.Series);
|
.Returns(remoteEpisode.Movie);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RemoteEpisode BuildRemoteEpisode()
|
private RemoteMovie BuildRemoteMovie()
|
||||||
{
|
{
|
||||||
return new RemoteEpisode
|
return new RemoteMovie
|
||||||
{
|
{
|
||||||
Series = new Series(),
|
Movie = new Movie()
|
||||||
Episodes = new List<Episode> { new Episode { Id = 1 } }
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,11 +79,11 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
|
|
||||||
private void GivenSuccessfulImport()
|
private void GivenSuccessfulImport()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
.Returns(new List<ImportResult>
|
.Returns(new List<ImportResult>
|
||||||
{
|
{
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode() { Path = @"C:\TestPath\Droned.S01E01.mkv" }))
|
new ImportResult(new ImportDecision(new LocalEpisode() { Path = @"C:\TestPath\Droned.1998.mkv" }))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,22 +94,22 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
_trackedDownload.DownloadItem.Title = "Droned Pilot"; // Set a badly named download
|
_trackedDownload.DownloadItem.Title = "Droned Pilot"; // Set a badly named download
|
||||||
Mocker.GetMock<IHistoryService>()
|
Mocker.GetMock<IHistoryService>()
|
||||||
.Setup(s => s.MostRecentForDownloadId(It.Is<string>(i => i == "1234")))
|
.Setup(s => s.MostRecentForDownloadId(It.Is<string>(i => i == "1234")))
|
||||||
.Returns(new History.History() { SourceTitle = "Droned S01E01" });
|
.Returns(new History.History() { SourceTitle = "Droned 1998" });
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>()
|
Mocker.GetMock<IParsingService>()
|
||||||
.Setup(s => s.GetSeries(It.IsAny<string>()))
|
.Setup(s => s.GetMovie(It.IsAny<string>()))
|
||||||
.Returns((Series)null);
|
.Returns((Movie)null);
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>()
|
Mocker.GetMock<IParsingService>()
|
||||||
.Setup(s => s.GetSeries("Droned S01E01"))
|
.Setup(s => s.GetMovie("Droned 1998"))
|
||||||
.Returns(BuildRemoteEpisode().Series);
|
.Returns(BuildRemoteMovie().Movie);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenSeriesMatch()
|
private void GivenSeriesMatch()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IParsingService>()
|
Mocker.GetMock<IParsingService>()
|
||||||
.Setup(s => s.GetSeries(It.IsAny<string>()))
|
.Setup(s => s.GetMovie(It.IsAny<string>()))
|
||||||
.Returns(_trackedDownload.RemoteEpisode.Series);
|
.Returns(_trackedDownload.RemoteMovie.Movie);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestCase(DownloadItemStatus.Downloading)]
|
[TestCase(DownloadItemStatus.Downloading)]
|
||||||
@@ -155,7 +154,7 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
public void should_not_process_if_storage_directory_in_drone_factory()
|
public void should_not_process_if_storage_directory_in_drone_factory()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IConfigService>()
|
Mocker.GetMock<IConfigService>()
|
||||||
.SetupGet(v => v.DownloadedEpisodesFolder)
|
.SetupGet(v => v.DownloadedMoviesFolder)
|
||||||
.Returns(@"C:\DropFolder".AsOsAgnostic());
|
.Returns(@"C:\DropFolder".AsOsAgnostic());
|
||||||
|
|
||||||
_trackedDownload.DownloadItem.OutputPath = new OsPath(@"C:\DropFolder\SomeOtherFolder".AsOsAgnostic());
|
_trackedDownload.DownloadItem.OutputPath = new OsPath(@"C:\DropFolder\SomeOtherFolder".AsOsAgnostic());
|
||||||
@@ -178,17 +177,17 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_mark_as_imported_if_all_episodes_were_imported()
|
public void should_mark_as_imported_if_all_episodes_were_imported()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
.Returns(new List<ImportResult>
|
.Returns(new List<ImportResult>
|
||||||
{
|
{
|
||||||
new ImportResult(
|
new ImportResult(
|
||||||
new ImportDecision(
|
new ImportDecision(
|
||||||
new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"})),
|
new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"})),
|
||||||
|
|
||||||
new ImportResult(
|
new ImportResult(
|
||||||
new ImportDecision(
|
new ImportDecision(
|
||||||
new LocalEpisode {Path = @"C:\TestPath\Droned.S01E02.mkv"}))
|
new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"}))
|
||||||
});
|
});
|
||||||
|
|
||||||
Subject.Process(_trackedDownload);
|
Subject.Process(_trackedDownload);
|
||||||
@@ -199,17 +198,17 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_not_mark_as_imported_if_all_files_were_rejected()
|
public void should_not_mark_as_imported_if_all_files_were_rejected()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
.Returns(new List<ImportResult>
|
.Returns(new List<ImportResult>
|
||||||
{
|
{
|
||||||
new ImportResult(
|
new ImportResult(
|
||||||
new ImportDecision(
|
new ImportDecision(
|
||||||
new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"}, new Rejection("Rejected!")), "Test Failure"),
|
new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"}, new Rejection("Rejected!")), "Test Failure"),
|
||||||
|
|
||||||
new ImportResult(
|
new ImportResult(
|
||||||
new ImportDecision(
|
new ImportDecision(
|
||||||
new LocalEpisode {Path = @"C:\TestPath\Droned.S01E02.mkv"},new Rejection("Rejected!")), "Test Failure")
|
new LocalMovie {Path = @"C:\TestPath\Droned.1999.mkv"},new Rejection("Rejected!")), "Test Failure")
|
||||||
});
|
});
|
||||||
|
|
||||||
Subject.Process(_trackedDownload);
|
Subject.Process(_trackedDownload);
|
||||||
@@ -223,20 +222,20 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_not_mark_as_imported_if_no_episodes_were_parsed()
|
public void should_not_mark_as_imported_if_no_episodes_were_parsed()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
.Returns(new List<ImportResult>
|
.Returns(new List<ImportResult>
|
||||||
{
|
{
|
||||||
new ImportResult(
|
new ImportResult(
|
||||||
new ImportDecision(
|
new ImportDecision(
|
||||||
new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"}, new Rejection("Rejected!")), "Test Failure"),
|
new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"}, new Rejection("Rejected!")), "Test Failure"),
|
||||||
|
|
||||||
new ImportResult(
|
new ImportResult(
|
||||||
new ImportDecision(
|
new ImportDecision(
|
||||||
new LocalEpisode {Path = @"C:\TestPath\Droned.S01E02.mkv"},new Rejection("Rejected!")), "Test Failure")
|
new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"},new Rejection("Rejected!")), "Test Failure")
|
||||||
});
|
});
|
||||||
|
|
||||||
_trackedDownload.RemoteEpisode.Episodes.Clear();
|
_trackedDownload.RemoteMovie.Movie = null;
|
||||||
|
|
||||||
Subject.Process(_trackedDownload);
|
Subject.Process(_trackedDownload);
|
||||||
|
|
||||||
@@ -246,12 +245,12 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_not_mark_as_imported_if_all_files_were_skipped()
|
public void should_not_mark_as_imported_if_all_files_were_skipped()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
.Returns(new List<ImportResult>
|
.Returns(new List<ImportResult>
|
||||||
{
|
{
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"}),"Test Failure"),
|
new ImportResult(new ImportDecision(new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"}),"Test Failure"),
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"}),"Test Failure")
|
new ImportResult(new ImportDecision(new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"}),"Test Failure")
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -265,17 +264,12 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
{
|
{
|
||||||
GivenSeriesMatch();
|
GivenSeriesMatch();
|
||||||
|
|
||||||
_trackedDownload.RemoteEpisode.Episodes = new List<Episode>
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
{
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
new Episode()
|
|
||||||
};
|
|
||||||
|
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
|
||||||
.Returns(new List<ImportResult>
|
.Returns(new List<ImportResult>
|
||||||
{
|
{
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"})),
|
new ImportResult(new ImportDecision(new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"})),
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode{Path = @"C:\TestPath\Droned.S01E01.mkv"}),"Test Failure")
|
new ImportResult(new ImportDecision(new LocalMovie{Path = @"C:\TestPath\Droned.1998.mkv"}),"Test Failure")
|
||||||
});
|
});
|
||||||
|
|
||||||
Subject.Process(_trackedDownload);
|
Subject.Process(_trackedDownload);
|
||||||
@@ -283,46 +277,21 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
AssertCompletedDownload();
|
AssertCompletedDownload();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_mark_as_failed_if_some_of_episodes_were_not_imported()
|
|
||||||
{
|
|
||||||
_trackedDownload.RemoteEpisode.Episodes = new List<Episode>
|
|
||||||
{
|
|
||||||
new Episode(),
|
|
||||||
new Episode(),
|
|
||||||
new Episode()
|
|
||||||
};
|
|
||||||
|
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
|
||||||
.Returns(new List<ImportResult>
|
|
||||||
{
|
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"})),
|
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode{Path = @"C:\TestPath\Droned.S01E01.mkv"}),"Test Failure"),
|
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode{Path = @"C:\TestPath\Droned.S01E01.mkv"}),"Test Failure")
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
Subject.Process(_trackedDownload);
|
|
||||||
|
|
||||||
AssertNoCompletedDownload();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_mark_as_imported_if_the_download_can_be_tracked_using_the_source_seriesid()
|
public void should_mark_as_imported_if_the_download_can_be_tracked_using_the_source_seriesid()
|
||||||
{
|
{
|
||||||
GivenABadlyNamedDownload();
|
GivenABadlyNamedDownload();
|
||||||
|
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
.Returns(new List<ImportResult>
|
.Returns(new List<ImportResult>
|
||||||
{
|
{
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"}))
|
new ImportResult(new ImportDecision(new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"}))
|
||||||
});
|
});
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesService>()
|
Mocker.GetMock<IMovieService>()
|
||||||
.Setup(v => v.GetSeries(It.IsAny<int>()))
|
.Setup(v => v.GetMovie(It.IsAny<int>()))
|
||||||
.Returns(BuildRemoteEpisode().Series);
|
.Returns(BuildRemoteMovie().Movie);
|
||||||
|
|
||||||
Subject.Process(_trackedDownload);
|
Subject.Process(_trackedDownload);
|
||||||
|
|
||||||
@@ -334,11 +303,11 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
{
|
{
|
||||||
GivenABadlyNamedDownload();
|
GivenABadlyNamedDownload();
|
||||||
|
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
.Returns(new List<ImportResult>
|
.Returns(new List<ImportResult>
|
||||||
{
|
{
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"}))
|
new ImportResult(new ImportDecision(new LocalEpisode {Path = @"C:\TestPath\Droned.1998.mkv"}))
|
||||||
});
|
});
|
||||||
|
|
||||||
Mocker.GetMock<IHistoryService>()
|
Mocker.GetMock<IHistoryService>()
|
||||||
@@ -353,8 +322,8 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
public void should_not_import_when_there_is_a_title_mismatch()
|
public void should_not_import_when_there_is_a_title_mismatch()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IParsingService>()
|
Mocker.GetMock<IParsingService>()
|
||||||
.Setup(s => s.GetSeries("Drone.S01E01.HDTV"))
|
.Setup(s => s.GetMovie("Drone.1998"))
|
||||||
.Returns((Series)null);
|
.Returns((Movie)null);
|
||||||
|
|
||||||
Subject.Process(_trackedDownload);
|
Subject.Process(_trackedDownload);
|
||||||
|
|
||||||
@@ -363,17 +332,13 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_mark_as_import_title_mismatch_if_ignore_warnings_is_true()
|
public void should_mark_as_import_title_mismatch_if_ignore_warnings_is_true()
|
||||||
{
|
{
|
||||||
_trackedDownload.RemoteEpisode.Episodes = new List<Episode>
|
|
||||||
{
|
|
||||||
new Episode()
|
|
||||||
};
|
|
||||||
|
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()))
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
.Returns(new List<ImportResult>
|
.Returns(new List<ImportResult>
|
||||||
{
|
{
|
||||||
new ImportResult(new ImportDecision(new LocalEpisode {Path = @"C:\TestPath\Droned.S01E01.mkv"}))
|
new ImportResult(new ImportDecision(new LocalMovie {Path = @"C:\TestPath\Droned.1998.mkv"}))
|
||||||
});
|
});
|
||||||
|
|
||||||
Subject.Process(_trackedDownload, true);
|
Subject.Process(_trackedDownload, true);
|
||||||
@@ -407,8 +372,8 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
|
|
||||||
private void AssertNoAttemptedImport()
|
private void AssertNoAttemptedImport()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Verify(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()), Times.Never());
|
.Verify(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()), Times.Never());
|
||||||
|
|
||||||
AssertNoCompletedDownload();
|
AssertNoCompletedDownload();
|
||||||
}
|
}
|
||||||
@@ -423,8 +388,8 @@ namespace NzbDrone.Core.Test.Download
|
|||||||
|
|
||||||
private void AssertCompletedDownload()
|
private void AssertCompletedDownload()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Verify(v => v.ProcessPath(_trackedDownload.DownloadItem.OutputPath.FullPath, ImportMode.Auto, _trackedDownload.RemoteEpisode.Series, _trackedDownload.DownloadItem), Times.Once());
|
.Verify(v => v.ProcessPath(_trackedDownload.DownloadItem.OutputPath.FullPath, ImportMode.Auto, _trackedDownload.RemoteMovie.Movie, _trackedDownload.DownloadItem), Times.Once());
|
||||||
|
|
||||||
Mocker.GetMock<IEventAggregator>()
|
Mocker.GetMock<IEventAggregator>()
|
||||||
.Verify(v => v.PublishEvent(It.IsAny<DownloadCompletedEvent>()), Times.Once());
|
.Verify(v => v.PublishEvent(It.IsAny<DownloadCompletedEvent>()), Times.Once());
|
||||||
|
|||||||
+92
-106
@@ -23,93 +23,82 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
|
|||||||
public void SetUp()
|
public void SetUp()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IPrioritizeDownloadDecision>()
|
Mocker.GetMock<IPrioritizeDownloadDecision>()
|
||||||
.Setup(v => v.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>()))
|
.Setup(v => v.PrioritizeDecisionsForMovies(It.IsAny<List<DownloadDecision>>()))
|
||||||
.Returns<List<DownloadDecision>>(v => v);
|
.Returns<List<DownloadDecision>>(v => v);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Episode GetEpisode(int id)
|
private Movie GetMovie(int id)
|
||||||
{
|
{
|
||||||
return Builder<Episode>.CreateNew()
|
return Builder<Movie>.CreateNew()
|
||||||
.With(e => e.Id = id)
|
.With(e => e.Id = id)
|
||||||
.With(e => e.EpisodeNumber = id)
|
.With(m => m.Tags = new HashSet<int>())
|
||||||
|
|
||||||
.Build();
|
.Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private RemoteEpisode GetRemoteEpisode(List<Episode> episodes, QualityModel quality)
|
private RemoteMovie GetRemoteMovie(QualityModel quality, Movie movie = null)
|
||||||
|
{
|
||||||
|
if (movie == null)
|
||||||
|
{
|
||||||
|
movie = GetMovie(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
movie.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities(), PreferredTags = new List<string>() };
|
||||||
|
|
||||||
|
var remoteMovie = new RemoteMovie()
|
||||||
|
{
|
||||||
|
ParsedMovieInfo = new ParsedMovieInfo()
|
||||||
|
{
|
||||||
|
Quality = quality,
|
||||||
|
Year = 1998,
|
||||||
|
MovieTitle = "A Movie",
|
||||||
|
MovieTitleInfo = new SeriesTitleInfo()
|
||||||
|
},
|
||||||
|
Movie = movie,
|
||||||
|
|
||||||
|
Release = new ReleaseInfo()
|
||||||
|
{
|
||||||
|
PublishDate = DateTime.UtcNow,
|
||||||
|
Title = "A.Movie.1998",
|
||||||
|
Size = 200
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return remoteMovie;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_download_report_if_movie_was_not_already_downloaded()
|
||||||
{
|
{
|
||||||
var remoteEpisode = new RemoteEpisode();
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo();
|
|
||||||
remoteEpisode.ParsedEpisodeInfo.Quality = quality;
|
|
||||||
|
|
||||||
remoteEpisode.Episodes = new List<Episode>();
|
var decisions = new List<DownloadDecision>();
|
||||||
remoteEpisode.Episodes.AddRange(episodes);
|
decisions.Add(new DownloadDecision(remoteMovie));
|
||||||
|
|
||||||
remoteEpisode.Release = new ReleaseInfo();
|
Subject.ProcessDecisions(decisions);
|
||||||
remoteEpisode.Release.PublishDate = DateTime.UtcNow;
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteMovie>()), Times.Once());
|
||||||
|
|
||||||
remoteEpisode.Series = Builder<Series>.CreateNew()
|
|
||||||
.With(e => e.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities() })
|
|
||||||
.Build();
|
|
||||||
|
|
||||||
return remoteEpisode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_download_report_if_epsiode_was_not_already_downloaded()
|
public void should_only_download_movie_once()
|
||||||
{
|
{
|
||||||
var episodes = new List<Episode> { GetEpisode(1) };
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode));
|
decisions.Add(new DownloadDecision(remoteMovie));
|
||||||
|
decisions.Add(new DownloadDecision(remoteMovie));
|
||||||
|
|
||||||
Subject.ProcessDecisions(decisions);
|
Subject.ProcessDecisions(decisions);
|
||||||
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteEpisode>()), Times.Once());
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteMovie>()), Times.Once());
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_only_download_episode_once()
|
|
||||||
{
|
|
||||||
var episodes = new List<Episode> { GetEpisode(1) };
|
|
||||||
var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode));
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode));
|
|
||||||
|
|
||||||
Subject.ProcessDecisions(decisions);
|
|
||||||
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteEpisode>()), Times.Once());
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_not_download_if_any_episode_was_already_downloaded()
|
|
||||||
{
|
|
||||||
var remoteEpisode1 = GetRemoteEpisode(
|
|
||||||
new List<Episode> { GetEpisode(1) },
|
|
||||||
new QualityModel(Quality.HDTV720p)
|
|
||||||
);
|
|
||||||
|
|
||||||
var remoteEpisode2 = GetRemoteEpisode(
|
|
||||||
new List<Episode> { GetEpisode(1), GetEpisode(2) },
|
|
||||||
new QualityModel(Quality.HDTV720p)
|
|
||||||
);
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
|
||||||
|
|
||||||
Subject.ProcessDecisions(decisions);
|
|
||||||
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteEpisode>()), Times.Once());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_return_downloaded_reports()
|
public void should_return_downloaded_reports()
|
||||||
{
|
{
|
||||||
var episodes = new List<Episode> { GetEpisode(1) };
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode));
|
decisions.Add(new DownloadDecision(remoteMovie));
|
||||||
|
|
||||||
Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(1);
|
Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(1);
|
||||||
}
|
}
|
||||||
@@ -117,19 +106,19 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_return_all_downloaded_reports()
|
public void should_return_all_downloaded_reports()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GetRemoteEpisode(
|
var remoteMovie1 = GetRemoteMovie(
|
||||||
new List<Episode> { GetEpisode(1) },
|
new QualityModel(Quality.HDTV720p),
|
||||||
new QualityModel(Quality.HDTV720p)
|
GetMovie(1)
|
||||||
);
|
);
|
||||||
|
|
||||||
var remoteEpisode2 = GetRemoteEpisode(
|
var remoteMovie2 = GetRemoteMovie(
|
||||||
new List<Episode> { GetEpisode(2) },
|
new QualityModel(Quality.HDTV720p),
|
||||||
new QualityModel(Quality.HDTV720p)
|
GetMovie(2)
|
||||||
);
|
);
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteMovie1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteMovie2));
|
||||||
|
|
||||||
Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2);
|
Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2);
|
||||||
}
|
}
|
||||||
@@ -137,25 +126,25 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_only_return_downloaded_reports()
|
public void should_only_return_downloaded_reports()
|
||||||
{
|
{
|
||||||
var remoteEpisode1 = GetRemoteEpisode(
|
var remoteMovie1 = GetRemoteMovie(
|
||||||
new List<Episode> { GetEpisode(1) },
|
new QualityModel(Quality.HDTV720p),
|
||||||
new QualityModel(Quality.HDTV720p)
|
GetMovie(1)
|
||||||
);
|
);
|
||||||
|
|
||||||
var remoteEpisode2 = GetRemoteEpisode(
|
var remoteMovie2 = GetRemoteMovie(
|
||||||
new List<Episode> { GetEpisode(2) },
|
new QualityModel(Quality.HDTV720p),
|
||||||
new QualityModel(Quality.HDTV720p)
|
GetMovie(2)
|
||||||
);
|
);
|
||||||
|
|
||||||
var remoteEpisode3 = GetRemoteEpisode(
|
var remoteMovie3 = GetRemoteMovie(
|
||||||
new List<Episode> { GetEpisode(2) },
|
new QualityModel(Quality.HDTV720p),
|
||||||
new QualityModel(Quality.HDTV720p)
|
GetMovie(2)
|
||||||
);
|
);
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode1));
|
decisions.Add(new DownloadDecision(remoteMovie1));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode2));
|
decisions.Add(new DownloadDecision(remoteMovie2));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode3));
|
decisions.Add(new DownloadDecision(remoteMovie3));
|
||||||
|
|
||||||
Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2);
|
Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2);
|
||||||
}
|
}
|
||||||
@@ -163,13 +152,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_not_add_to_downloaded_list_when_download_fails()
|
public void should_not_add_to_downloaded_list_when_download_fails()
|
||||||
{
|
{
|
||||||
var episodes = new List<Episode> { GetEpisode(1) };
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode));
|
decisions.Add(new DownloadDecision(remoteMovie));
|
||||||
|
|
||||||
Mocker.GetMock<IDownloadService>().Setup(s => s.DownloadReport(It.IsAny<RemoteEpisode>())).Throws(new Exception());
|
Mocker.GetMock<IDownloadService>().Setup(s => s.DownloadReport(It.IsAny<RemoteMovie>())).Throws(new Exception());
|
||||||
Subject.ProcessDecisions(decisions).Grabbed.Should().BeEmpty();
|
Subject.ProcessDecisions(decisions).Grabbed.Should().BeEmpty();
|
||||||
ExceptionVerification.ExpectedWarns(1);
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
}
|
}
|
||||||
@@ -178,9 +166,9 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
|
|||||||
public void should_return_an_empty_list_when_none_are_appproved()
|
public void should_return_an_empty_list_when_none_are_appproved()
|
||||||
{
|
{
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
RemoteEpisode ep = null;
|
RemoteMovie remoteMovie = null;
|
||||||
decisions.Add(new DownloadDecision(ep, new Rejection("Failure!")));
|
decisions.Add(new DownloadDecision(remoteMovie, new Rejection("Failure!")));
|
||||||
decisions.Add(new DownloadDecision(ep, new Rejection("Failure!")));
|
decisions.Add(new DownloadDecision(remoteMovie, new Rejection("Failure!")));
|
||||||
|
|
||||||
Subject.GetQualifiedReports(decisions).Should().BeEmpty();
|
Subject.GetQualifiedReports(decisions).Should().BeEmpty();
|
||||||
}
|
}
|
||||||
@@ -188,26 +176,24 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_not_grab_if_pending()
|
public void should_not_grab_if_pending()
|
||||||
{
|
{
|
||||||
var episodes = new List<Episode> { GetEpisode(1) };
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
|
decisions.Add(new DownloadDecision(remoteMovie, new Rejection("Failure!", RejectionType.Temporary)));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode));
|
decisions.Add(new DownloadDecision(remoteMovie));
|
||||||
|
|
||||||
Subject.ProcessDecisions(decisions);
|
Subject.ProcessDecisions(decisions);
|
||||||
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteEpisode>()), Times.Never());
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteMovie>()), Times.Never());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_not_add_to_pending_if_episode_was_grabbed()
|
public void should_not_add_to_pending_if_movie_was_grabbed()
|
||||||
{
|
{
|
||||||
var episodes = new List<Episode> { GetEpisode(1) };
|
var removeMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
|
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode));
|
decisions.Add(new DownloadDecision(removeMovie));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
|
decisions.Add(new DownloadDecision(removeMovie, new Rejection("Failure!", RejectionType.Temporary)));
|
||||||
|
|
||||||
Subject.ProcessDecisions(decisions);
|
Subject.ProcessDecisions(decisions);
|
||||||
Mocker.GetMock<IPendingReleaseService>().Verify(v => v.Add(It.IsAny<DownloadDecision>()), Times.Never());
|
Mocker.GetMock<IPendingReleaseService>().Verify(v => v.Add(It.IsAny<DownloadDecision>()), Times.Never());
|
||||||
@@ -216,12 +202,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_add_to_pending_even_if_already_added_to_pending()
|
public void should_add_to_pending_even_if_already_added_to_pending()
|
||||||
{
|
{
|
||||||
var episodes = new List<Episode> { GetEpisode(1) };
|
|
||||||
var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
||||||
|
|
||||||
var decisions = new List<DownloadDecision>();
|
var decisions = new List<DownloadDecision>();
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
|
decisions.Add(new DownloadDecision(remoteMovie, new Rejection("Failure!", RejectionType.Temporary)));
|
||||||
decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
|
decisions.Add(new DownloadDecision(remoteMovie, new Rejection("Failure!", RejectionType.Temporary)));
|
||||||
|
|
||||||
Subject.ProcessDecisions(decisions);
|
Subject.ProcessDecisions(decisions);
|
||||||
Mocker.GetMock<IPendingReleaseService>().Verify(v => v.Add(It.IsAny<DownloadDecision>()), Times.Exactly(2));
|
Mocker.GetMock<IPendingReleaseService>().Verify(v => v.Add(It.IsAny<DownloadDecision>()), Times.Exactly(2));
|
||||||
|
|||||||
+1
-1
@@ -16,7 +16,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class ScanWatchFolderFixture : CoreTest<ScanWatchFolder>
|
public class ScanWatchFolderFixture : CoreTest<ScanWatchFolder>
|
||||||
{
|
{
|
||||||
protected readonly string _title = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE";
|
protected readonly string _title = "Droned.1998.1080p.WEB-DL-DRONE";
|
||||||
protected string _completedDownloadFolder = @"c:\blackhole\completed".AsOsAgnostic();
|
protected string _completedDownloadFolder = @"c:\blackhole\completed".AsOsAgnostic();
|
||||||
|
|
||||||
protected void GivenCompletedItem()
|
protected void GivenCompletedItem()
|
||||||
|
|||||||
+29
-29
@@ -74,19 +74,19 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
.Returns(1000000);
|
.Returns(1000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override RemoteEpisode CreateRemoteEpisode()
|
protected override RemoteMovie CreateRemoteMovie()
|
||||||
{
|
{
|
||||||
var remoteEpisode = base.CreateRemoteEpisode();
|
var remoteMovie = base.CreateRemoteMovie();
|
||||||
var torrentInfo = new TorrentInfo();
|
var torrentInfo = new TorrentInfo();
|
||||||
|
|
||||||
torrentInfo.Title = remoteEpisode.Release.Title;
|
torrentInfo.Title = remoteMovie.Release.Title;
|
||||||
torrentInfo.DownloadUrl = remoteEpisode.Release.DownloadUrl;
|
torrentInfo.DownloadUrl = remoteMovie.Release.DownloadUrl;
|
||||||
torrentInfo.DownloadProtocol = remoteEpisode.Release.DownloadProtocol;
|
torrentInfo.DownloadProtocol = remoteMovie.Release.DownloadProtocol;
|
||||||
torrentInfo.MagnetUrl = "magnet:?xt=urn:btih:755248817d32b00cc853e633ecdc48e4c21bff15&dn=Series.S05E10.PROPER.HDTV.x264-DEFiNE%5Brartv%5D&tr=http%3A%2F%2Ftracker.trackerfix.com%3A80%2Fannounce&tr=udp%3A%2F%2F9.rarbg.me%3A2710&tr=udp%3A%2F%2F9.rarbg.to%3A2710";
|
torrentInfo.MagnetUrl = "magnet:?xt=urn:btih:755248817d32b00cc853e633ecdc48e4c21bff15&dn=Series.S05E10.PROPER.HDTV.x264-DEFiNE%5Brartv%5D&tr=http%3A%2F%2Ftracker.trackerfix.com%3A80%2Fannounce&tr=udp%3A%2F%2F9.rarbg.me%3A2710&tr=udp%3A%2F%2F9.rarbg.to%3A2710";
|
||||||
|
|
||||||
remoteEpisode.Release = torrentInfo;
|
remoteMovie.Release = torrentInfo;
|
||||||
|
|
||||||
return remoteEpisode;
|
return remoteMovie;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -125,9 +125,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
[Test]
|
[Test]
|
||||||
public void Download_should_download_file_if_it_doesnt_exist()
|
public void Download_should_download_file_if_it_doesnt_exist()
|
||||||
{
|
{
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
Subject.Download(remoteEpisode);
|
Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
||||||
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Once());
|
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Once());
|
||||||
@@ -139,10 +139,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
{
|
{
|
||||||
Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true;
|
Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true;
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.DownloadUrl = null;
|
remoteMovie.Release.DownloadUrl = null;
|
||||||
|
|
||||||
Subject.Download(remoteEpisode);
|
Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Never());
|
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Never());
|
||||||
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Never());
|
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Never());
|
||||||
@@ -153,10 +153,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
[Test]
|
[Test]
|
||||||
public void Download_should_not_save_magnet_if_disabled()
|
public void Download_should_not_save_magnet_if_disabled()
|
||||||
{
|
{
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.DownloadUrl = null;
|
remoteMovie.Release.DownloadUrl = null;
|
||||||
|
|
||||||
Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteEpisode));
|
Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteMovie));
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Never());
|
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Never());
|
||||||
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Never());
|
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Never());
|
||||||
@@ -169,9 +169,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
{
|
{
|
||||||
Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true;
|
Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true;
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
Subject.Download(remoteEpisode);
|
Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
||||||
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Once());
|
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Once());
|
||||||
@@ -185,10 +185,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]";
|
var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]";
|
||||||
var expectedFilename = Path.Combine(_blackholeFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV]" + Path.GetExtension(_filePath));
|
var expectedFilename = Path.Combine(_blackholeFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV]" + Path.GetExtension(_filePath));
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.Title = illegalTitle;
|
remoteMovie.Release.Title = illegalTitle;
|
||||||
|
|
||||||
Subject.Download(remoteEpisode);
|
Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
||||||
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(expectedFilename), Times.Once());
|
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(expectedFilename), Times.Once());
|
||||||
@@ -198,10 +198,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
[Test]
|
[Test]
|
||||||
public void Download_should_throw_if_magnet_and_torrent_url_does_not_exist()
|
public void Download_should_throw_if_magnet_and_torrent_url_does_not_exist()
|
||||||
{
|
{
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.DownloadUrl = null;
|
remoteMovie.Release.DownloadUrl = null;
|
||||||
|
|
||||||
Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteEpisode));
|
Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteMovie));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -213,7 +213,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
.Setup(c => c.FileExists(It.IsAny<string>()))
|
.Setup(c => c.FileExists(It.IsAny<string>()))
|
||||||
.Returns(true);
|
.Returns(true);
|
||||||
|
|
||||||
Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", true);
|
Subject.RemoveItem("_Droned.1998.1080p.WEB-DL-DRONE_0", true);
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Once());
|
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Once());
|
||||||
@@ -228,7 +228,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
.Setup(c => c.FolderExists(It.IsAny<string>()))
|
.Setup(c => c.FolderExists(It.IsAny<string>()))
|
||||||
.Returns(true);
|
.Returns(true);
|
||||||
|
|
||||||
Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", true);
|
Subject.RemoveItem("_Droned.1998.1080p.WEB-DL-DRONE_0", true);
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
.Verify(c => c.DeleteFolder(It.IsAny<string>(), true), Times.Once());
|
.Verify(c => c.DeleteFolder(It.IsAny<string>(), true), Times.Once());
|
||||||
@@ -237,7 +237,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
[Test]
|
[Test]
|
||||||
public void RemoveItem_should_ignore_if_unknown_item()
|
public void RemoveItem_should_ignore_if_unknown_item()
|
||||||
{
|
{
|
||||||
Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", true);
|
Subject.RemoveItem("_Droned.1998.1080p.WEB-DL-DRONE_0", true);
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
||||||
@@ -251,7 +251,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
{
|
{
|
||||||
GivenCompletedItem();
|
GivenCompletedItem();
|
||||||
|
|
||||||
Assert.Throws<NotSupportedException>(() => Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", false));
|
Assert.Throws<NotSupportedException>(() => Subject.RemoveItem("_Droned.1998.1080p.WEB-DL-DRONE_0", false));
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
||||||
@@ -273,9 +273,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_return_null_hash()
|
public void should_return_null_hash()
|
||||||
{
|
{
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
Subject.Download(remoteEpisode).Should().BeNull();
|
Subject.Download(remoteMovie).Should().BeNull();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-9
@@ -104,9 +104,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
[Test]
|
[Test]
|
||||||
public void Download_should_download_file_if_it_doesnt_exist()
|
public void Download_should_download_file_if_it_doesnt_exist()
|
||||||
{
|
{
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
Subject.Download(remoteEpisode);
|
Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
||||||
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Once());
|
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Once());
|
||||||
@@ -119,10 +119,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]";
|
var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]";
|
||||||
var expectedFilename = Path.Combine(_blackholeFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV]" + Path.GetExtension(_filePath));
|
var expectedFilename = Path.Combine(_blackholeFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV]" + Path.GetExtension(_filePath));
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.Title = illegalTitle;
|
remoteMovie.Release.Title = illegalTitle;
|
||||||
|
|
||||||
Subject.Download(remoteEpisode);
|
Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
||||||
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(expectedFilename), Times.Once());
|
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(expectedFilename), Times.Once());
|
||||||
@@ -138,7 +138,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
.Setup(c => c.FileExists(It.IsAny<string>()))
|
.Setup(c => c.FileExists(It.IsAny<string>()))
|
||||||
.Returns(true);
|
.Returns(true);
|
||||||
|
|
||||||
Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", true);
|
Subject.RemoveItem("_Droned.1998.1080p.WEB-DL-DRONE_0", true);
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Once());
|
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Once());
|
||||||
@@ -153,7 +153,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
.Setup(c => c.FolderExists(It.IsAny<string>()))
|
.Setup(c => c.FolderExists(It.IsAny<string>()))
|
||||||
.Returns(true);
|
.Returns(true);
|
||||||
|
|
||||||
Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", true);
|
Subject.RemoveItem("_Droned.1998.1080p.WEB-DL-DRONE_0", true);
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
.Verify(c => c.DeleteFolder(It.IsAny<string>(), true), Times.Once());
|
.Verify(c => c.DeleteFolder(It.IsAny<string>(), true), Times.Once());
|
||||||
@@ -162,7 +162,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
[Test]
|
[Test]
|
||||||
public void RemoveItem_should_ignore_if_unknown_item()
|
public void RemoveItem_should_ignore_if_unknown_item()
|
||||||
{
|
{
|
||||||
Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", true);
|
Subject.RemoveItem("_Droned.1998.1080p.WEB-DL-DRONE_0", true);
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
||||||
@@ -176,7 +176,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|||||||
{
|
{
|
||||||
GivenCompletedItem();
|
GivenCompletedItem();
|
||||||
|
|
||||||
Assert.Throws<NotSupportedException>(() => Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", false));
|
Assert.Throws<NotSupportedException>(() => Subject.RemoveItem("_Droned.1998.1080p.WEB-DL-DRONE_0", false));
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
||||||
|
|||||||
@@ -196,9 +196,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DelugeTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -208,10 +208,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DelugeTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.DownloadUrl = magnetUrl;
|
remoteMovie.Release.DownloadUrl = magnetUrl;
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().Be(expectedHash);
|
id.Should().Be(expectedHash);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
|||||||
public abstract class DownloadClientFixtureBase<TSubject> : CoreTest<TSubject>
|
public abstract class DownloadClientFixtureBase<TSubject> : CoreTest<TSubject>
|
||||||
where TSubject : class, IDownloadClient
|
where TSubject : class, IDownloadClient
|
||||||
{
|
{
|
||||||
protected readonly string _title = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE";
|
protected readonly string _title = "Droned.1998.1080p.WEB-DL-DRONE";
|
||||||
protected readonly string _downloadUrl = "http://somewhere.com/Droned.S01E01.Pilot.1080p.WEB-DL-DRONE.ext";
|
protected readonly string _downloadUrl = "http://somewhere.com/Droned.1998.1080p.WEB-DL-DRONE.ext";
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void SetupBase()
|
public void SetupBase()
|
||||||
@@ -30,8 +30,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
|||||||
.Returns(30);
|
.Returns(30);
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>()
|
Mocker.GetMock<IParsingService>()
|
||||||
.Setup(s => s.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), (SearchCriteriaBase)null))
|
.Setup(s => s.Map(It.IsAny<ParsedMovieInfo>(), It.IsAny<string>(), (SearchCriteriaBase)null))
|
||||||
.Returns(() => CreateRemoteEpisode());
|
.Returns(() => CreateRemoteMovie());
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>()
|
Mocker.GetMock<IHttpClient>()
|
||||||
.Setup(s => s.Get(It.IsAny<HttpRequest>()))
|
.Setup(s => s.Get(It.IsAny<HttpRequest>()))
|
||||||
@@ -42,22 +42,19 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
|||||||
.Returns<string, OsPath>((h, r) => r);
|
.Returns<string, OsPath>((h, r) => r);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual RemoteEpisode CreateRemoteEpisode()
|
protected virtual RemoteMovie CreateRemoteMovie()
|
||||||
{
|
{
|
||||||
var remoteEpisode = new RemoteEpisode();
|
var remoteMovie = new RemoteMovie();
|
||||||
remoteEpisode.Release = new ReleaseInfo();
|
remoteMovie.Release = new ReleaseInfo();
|
||||||
remoteEpisode.Release.Title = _title;
|
remoteMovie.Release.Title = _title;
|
||||||
remoteEpisode.Release.DownloadUrl = _downloadUrl;
|
remoteMovie.Release.DownloadUrl = _downloadUrl;
|
||||||
remoteEpisode.Release.DownloadProtocol = Subject.Protocol;
|
remoteMovie.Release.DownloadProtocol = Subject.Protocol;
|
||||||
|
|
||||||
remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo();
|
remoteMovie.ParsedMovieInfo = new ParsedMovieInfo();
|
||||||
remoteEpisode.ParsedEpisodeInfo.FullSeason = false;
|
|
||||||
|
|
||||||
remoteEpisode.Episodes = new List<Episode>();
|
remoteMovie.Movie = new Movie();
|
||||||
|
|
||||||
remoteEpisode.Series = new Series();
|
return remoteMovie;
|
||||||
|
|
||||||
return remoteEpisode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void VerifyIdentifiable(DownloadClientItem downloadClientItem)
|
protected void VerifyIdentifiable(DownloadClientItem downloadClientItem)
|
||||||
|
|||||||
+74
@@ -0,0 +1,74 @@
|
|||||||
|
using System;
|
||||||
|
using FluentAssertions;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Core.Download.Clients;
|
||||||
|
using NzbDrone.Core.Download.Clients.DownloadStation;
|
||||||
|
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Test.Common;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class SerialNumberProviderFixture : CoreTest<SerialNumberProvider>
|
||||||
|
{
|
||||||
|
protected DownloadStationSettings _settings;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
protected void Setup()
|
||||||
|
{
|
||||||
|
_settings = new DownloadStationSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenValidResponse()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IDSMInfoProxy>()
|
||||||
|
.Setup(d => d.GetSerialNumber(It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Returns("serial");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenInvalidResponse()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IDSMInfoProxy>()
|
||||||
|
.Setup(d => d.GetSerialNumber(It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Throws(new DownloadClientException("Serial response invalid"));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_return_hashedserialnumber()
|
||||||
|
{
|
||||||
|
GivenValidResponse();
|
||||||
|
|
||||||
|
var serial = Subject.GetSerialNumber(_settings);
|
||||||
|
|
||||||
|
// This hash should remain the same for 'serial', so don't update the test if you change HashConverter, fix the code instead.
|
||||||
|
serial.Should().Be("50DE66B735D30738618568294742FCF1DFA52A47");
|
||||||
|
|
||||||
|
Mocker.GetMock<IDSMInfoProxy>()
|
||||||
|
.Verify(d => d.GetSerialNumber(It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_cache_serialnumber()
|
||||||
|
{
|
||||||
|
GivenValidResponse();
|
||||||
|
|
||||||
|
var serial1 = Subject.GetSerialNumber(_settings);
|
||||||
|
var serial2 = Subject.GetSerialNumber(_settings);
|
||||||
|
|
||||||
|
serial2.Should().Be(serial1);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDSMInfoProxy>()
|
||||||
|
.Verify(d => d.GetSerialNumber(It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_throw_if_serial_number_unavailable()
|
||||||
|
{
|
||||||
|
Assert.Throws(Is.InstanceOf<Exception>(), () => Subject.GetSerialNumber(_settings));
|
||||||
|
|
||||||
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+75
@@ -0,0 +1,75 @@
|
|||||||
|
using System;
|
||||||
|
using FluentAssertions;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common.Disk;
|
||||||
|
using NzbDrone.Core.Download.Clients;
|
||||||
|
using NzbDrone.Core.Download.Clients.DownloadStation;
|
||||||
|
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Test.Common;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class SharedFolderResolverFixture : CoreTest<SharedFolderResolver>
|
||||||
|
{
|
||||||
|
protected string _serialNumber = "SERIALNUMBER";
|
||||||
|
protected OsPath _sharedFolder;
|
||||||
|
protected OsPath _physicalPath;
|
||||||
|
protected DownloadStationSettings _settings;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
protected void Setup()
|
||||||
|
{
|
||||||
|
_sharedFolder = new OsPath("/myFolder");
|
||||||
|
_physicalPath = new OsPath("/mnt/sda1/folder");
|
||||||
|
_settings = new DownloadStationSettings();
|
||||||
|
|
||||||
|
Mocker.GetMock<IFileStationProxy>()
|
||||||
|
.Setup(f => f.GetSharedFolderMapping(It.IsAny<string>(), It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Throws(new DownloadClientException("There is no shared folder"));
|
||||||
|
|
||||||
|
Mocker.GetMock<IFileStationProxy>()
|
||||||
|
.Setup(f => f.GetSharedFolderMapping(_sharedFolder.FullPath, It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Returns(new SharedFolderMapping(_sharedFolder.FullPath, _physicalPath.FullPath));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_throw_when_cannot_resolve_shared_folder()
|
||||||
|
{
|
||||||
|
Assert.Throws(Is.InstanceOf<Exception>(), () => Subject.RemapToFullPath(new OsPath("/unknownFolder"), _settings, _serialNumber));
|
||||||
|
|
||||||
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_return_valid_sharedfolder()
|
||||||
|
{
|
||||||
|
var mapping = Subject.RemapToFullPath(_sharedFolder, _settings, "abc");
|
||||||
|
|
||||||
|
mapping.Should().Be(_physicalPath);
|
||||||
|
|
||||||
|
Mocker.GetMock<IFileStationProxy>()
|
||||||
|
.Verify(f => f.GetSharedFolderMapping(It.IsAny<string>(), It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_cache_mapping()
|
||||||
|
{
|
||||||
|
Subject.RemapToFullPath(_sharedFolder, _settings, "abc");
|
||||||
|
Subject.RemapToFullPath(_sharedFolder, _settings, "abc");
|
||||||
|
|
||||||
|
Mocker.GetMock<IFileStationProxy>()
|
||||||
|
.Verify(f => f.GetSharedFolderMapping(It.IsAny<string>(), It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_remap_subfolder()
|
||||||
|
{
|
||||||
|
var mapping = Subject.RemapToFullPath(_sharedFolder + "sub", _settings, "abc");
|
||||||
|
|
||||||
|
mapping.Should().Be(_physicalPath + "sub");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+622
@@ -0,0 +1,622 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using FluentAssertions;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common.Disk;
|
||||||
|
using NzbDrone.Common.Http;
|
||||||
|
using NzbDrone.Core.Download;
|
||||||
|
using NzbDrone.Core.Download.Clients.DownloadStation;
|
||||||
|
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
||||||
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
using NzbDrone.Test.Common;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class TorrentDownloadStationFixture : DownloadClientFixtureBase<TorrentDownloadStation>
|
||||||
|
{
|
||||||
|
protected DownloadStationSettings _settings;
|
||||||
|
|
||||||
|
protected DownloadStationTask _queued;
|
||||||
|
protected DownloadStationTask _downloading;
|
||||||
|
protected DownloadStationTask _failed;
|
||||||
|
protected DownloadStationTask _completed;
|
||||||
|
protected DownloadStationTask _seeding;
|
||||||
|
protected DownloadStationTask _magnet;
|
||||||
|
protected DownloadStationTask _singleFile;
|
||||||
|
protected DownloadStationTask _multipleFiles;
|
||||||
|
protected DownloadStationTask _singleFileCompleted;
|
||||||
|
protected DownloadStationTask _multipleFilesCompleted;
|
||||||
|
|
||||||
|
protected string _serialNumber = "SERIALNUMBER";
|
||||||
|
protected string _category = "sonarr";
|
||||||
|
protected string _tvDirectory = @"video/Series";
|
||||||
|
protected string _defaultDestination = "somepath";
|
||||||
|
protected OsPath _physicalPath = new OsPath("/mnt/sdb1/mydata");
|
||||||
|
|
||||||
|
protected Dictionary<string, object> _downloadStationConfigItems;
|
||||||
|
|
||||||
|
protected string DownloadURL => "magnet:?xt=urn:btih:5dee65101db281ac9c46344cd6b175cdcad53426&dn=download";
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
_settings = new DownloadStationSettings()
|
||||||
|
{
|
||||||
|
Host = "127.0.0.1",
|
||||||
|
Port = 5000,
|
||||||
|
Username = "admin",
|
||||||
|
Password = "pass"
|
||||||
|
};
|
||||||
|
|
||||||
|
Subject.Definition = new DownloadClientDefinition();
|
||||||
|
Subject.Definition.Settings = _settings;
|
||||||
|
|
||||||
|
_queued = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id1",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Waiting,
|
||||||
|
Type = DownloadStationTaskType.BT.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", DownloadURL }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "0"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_completed = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id2",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Finished,
|
||||||
|
Type = DownloadStationTaskType.BT.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", DownloadURL }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "1000"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_seeding = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id2",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Seeding,
|
||||||
|
Type = DownloadStationTaskType.BT.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", DownloadURL }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "1000"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_downloading = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id3",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Downloading,
|
||||||
|
Type = DownloadStationTaskType.BT.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", DownloadURL }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "100"},
|
||||||
|
{ "speed_download", "50" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_failed = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id4",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Error,
|
||||||
|
Type = DownloadStationTaskType.BT.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", DownloadURL }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "10"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_singleFile = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id5",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Seeding,
|
||||||
|
Type = DownloadStationTaskType.BT.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "a.mkv",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", DownloadURL }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "1000"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_multipleFiles = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id6",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Seeding,
|
||||||
|
Type = DownloadStationTaskType.BT.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", DownloadURL }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "1000"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_singleFileCompleted = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id6",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Finished,
|
||||||
|
Type = DownloadStationTaskType.BT.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "a.mkv",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", DownloadURL }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "1000"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_multipleFilesCompleted = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id6",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Finished,
|
||||||
|
Type = DownloadStationTaskType.BT.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", DownloadURL }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "1000"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Mocker.GetMock<ITorrentFileInfoReader>()
|
||||||
|
.Setup(s => s.GetHashFromTorrentFile(It.IsAny<byte[]>()))
|
||||||
|
.Returns("CBC2F069FE8BB2F544EAE707D75BCD3DE9DCF951");
|
||||||
|
|
||||||
|
Mocker.GetMock<IHttpClient>()
|
||||||
|
.Setup(s => s.Get(It.IsAny<HttpRequest>()))
|
||||||
|
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), new byte[0]));
|
||||||
|
|
||||||
|
_downloadStationConfigItems = new Dictionary<string, object>
|
||||||
|
{
|
||||||
|
{ "default_destination", _defaultDestination },
|
||||||
|
};
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationInfoProxy>()
|
||||||
|
.Setup(v => v.GetConfig(It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Returns(_downloadStationConfigItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenSharedFolder()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ISharedFolderResolver>()
|
||||||
|
.Setup(s => s.RemapToFullPath(It.IsAny<OsPath>(), It.IsAny<DownloadStationSettings>(), It.IsAny<string>()))
|
||||||
|
.Returns<OsPath, DownloadStationSettings, string>((path, setttings, serial) => _physicalPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenSerialNumber()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ISerialNumberProvider>()
|
||||||
|
.Setup(s => s.GetSerialNumber(It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Returns(_serialNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenTvCategory()
|
||||||
|
{
|
||||||
|
_settings.TvCategory = _category;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenTvDirectory()
|
||||||
|
{
|
||||||
|
_settings.TvDirectory = _tvDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void GivenTasks(List<DownloadStationTask> torrents)
|
||||||
|
{
|
||||||
|
if (torrents == null)
|
||||||
|
{
|
||||||
|
torrents = new List<DownloadStationTask>();
|
||||||
|
}
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Setup(s => s.GetTasks(It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Returns(torrents);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void PrepareClientToReturnQueuedItem()
|
||||||
|
{
|
||||||
|
GivenTasks(new List<DownloadStationTask>
|
||||||
|
{
|
||||||
|
_queued
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenSuccessfulDownload()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IHttpClient>()
|
||||||
|
.Setup(s => s.Get(It.IsAny<HttpRequest>()))
|
||||||
|
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), new byte[1000]));
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Setup(s => s.AddTaskFromUrl(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Callback(PrepareClientToReturnQueuedItem);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Setup(s => s.AddTaskFromData(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Callback(PrepareClientToReturnQueuedItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override RemoteMovie CreateRemoteMovie()
|
||||||
|
{
|
||||||
|
var episode = base.CreateRemoteMovie();
|
||||||
|
|
||||||
|
episode.Release.DownloadUrl = DownloadURL;
|
||||||
|
|
||||||
|
return episode;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int GivenAllKindOfTasks()
|
||||||
|
{
|
||||||
|
var tasks = new List<DownloadStationTask>() { _queued, _completed, _failed, _downloading, _seeding };
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Setup(d => d.GetTasks(_settings))
|
||||||
|
.Returns(tasks);
|
||||||
|
|
||||||
|
return tasks.Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Download_with_TvDirectory_should_force_directory()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenTvDirectory();
|
||||||
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
|
var remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
|
var id = Subject.Download(remoteEpisode);
|
||||||
|
|
||||||
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Verify(v => v.AddTaskFromUrl(It.IsAny<string>(), _tvDirectory, It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Download_with_category_should_force_directory()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenTvCategory();
|
||||||
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
|
var remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
|
var id = Subject.Download(remoteEpisode);
|
||||||
|
|
||||||
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Verify(v => v.AddTaskFromUrl(It.IsAny<string>(), $"{_defaultDestination}/{_category}", It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Download_without_TvDirectory_and_Category_should_use_default()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
|
var remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
|
var id = Subject.Download(remoteEpisode);
|
||||||
|
|
||||||
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Verify(v => v.AddTaskFromUrl(It.IsAny<string>(), null, It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_return_empty_list_if_no_tasks_available()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
GivenTasks(new List<DownloadStationTask>());
|
||||||
|
|
||||||
|
Subject.GetItems().Should().BeEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_return_ignore_tasks_of_unknown_type()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
GivenTasks(new List<DownloadStationTask> { _completed });
|
||||||
|
|
||||||
|
_completed.Type = "ipfs";
|
||||||
|
|
||||||
|
Subject.GetItems().Should().BeEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_ignore_downloads_in_wrong_folder()
|
||||||
|
{
|
||||||
|
_settings.TvDirectory = @"/shared/folder/sub";
|
||||||
|
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
GivenTasks(new List<DownloadStationTask> { _completed });
|
||||||
|
|
||||||
|
Subject.GetItems().Should().BeEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_throw_if_shared_folder_resolve_fails()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ISharedFolderResolver>()
|
||||||
|
.Setup(s => s.RemapToFullPath(It.IsAny<OsPath>(), It.IsAny<DownloadStationSettings>(), It.IsAny<string>()))
|
||||||
|
.Throws(new ApplicationException("Some unknown exception, HttpException or DownloadClientException"));
|
||||||
|
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenAllKindOfTasks();
|
||||||
|
|
||||||
|
Assert.Throws(Is.InstanceOf<Exception>(), () => Subject.GetItems());
|
||||||
|
ExceptionVerification.ExpectedErrors(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_throw_if_serial_number_unavailable()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ISerialNumberProvider>()
|
||||||
|
.Setup(s => s.GetSerialNumber(_settings))
|
||||||
|
.Throws(new ApplicationException("Some unknown exception, HttpException or DownloadClientException"));
|
||||||
|
|
||||||
|
GivenSharedFolder();
|
||||||
|
GivenAllKindOfTasks();
|
||||||
|
|
||||||
|
Assert.Throws(Is.InstanceOf<Exception>(), () => Subject.GetItems());
|
||||||
|
ExceptionVerification.ExpectedErrors(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Download_should_throw_and_not_add_task_if_cannot_get_serial_number()
|
||||||
|
{
|
||||||
|
var remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
|
Mocker.GetMock<ISerialNumberProvider>()
|
||||||
|
.Setup(s => s.GetSerialNumber(_settings))
|
||||||
|
.Throws(new ApplicationException("Some unknown exception, HttpException or DownloadClientException"));
|
||||||
|
|
||||||
|
Assert.Throws(Is.InstanceOf<Exception>(), () => Subject.Download(remoteEpisode));
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Verify(v => v.AddTaskFromUrl(It.IsAny<string>(), null, _settings), Times.Never());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_set_outputPath_to_base_folder_when_single_file_non_finished_tasks()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>() { _singleFile });
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(1);
|
||||||
|
items.First().OutputPath.Should().Be(_physicalPath + _singleFile.Title);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_set_outputPath_to_torrent_folder_when_multiple_files_non_finished_tasks()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>() { _multipleFiles });
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(1);
|
||||||
|
items.First().OutputPath.Should().Be(_physicalPath + _multipleFiles.Title);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_set_outputPath_to_base_folder_when_single_file_finished_tasks()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>() { _singleFileCompleted });
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(1);
|
||||||
|
items.First().OutputPath.Should().Be(_physicalPath + _singleFileCompleted.Title);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_set_outputPath_to_torrent_folder_when_multiple_files_finished_tasks()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>() { _multipleFilesCompleted });
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(1);
|
||||||
|
items.First().OutputPath.Should().Be($"{_physicalPath}/{_multipleFiles.Title}");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_not_map_outputpath_for_queued_or_downloading_tasks()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>
|
||||||
|
{
|
||||||
|
_queued, _downloading
|
||||||
|
});
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(2);
|
||||||
|
items.Should().OnlyContain(v => v.OutputPath.IsEmpty);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_map_outputpath_for_completed_or_failed_tasks()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>
|
||||||
|
{
|
||||||
|
_completed, _failed, _seeding
|
||||||
|
});
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(3);
|
||||||
|
items.Should().OnlyContain(v => !v.OutputPath.IsEmpty);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase(DownloadStationTaskStatus.Downloading, DownloadItemStatus.Downloading, true)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Finished, DownloadItemStatus.Completed, false)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Seeding, DownloadItemStatus.Completed, true)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Waiting, DownloadItemStatus.Queued, true)]
|
||||||
|
public void GetItems_should_return_readonly_expected(DownloadStationTaskStatus apiStatus, DownloadItemStatus expectedItemStatus, bool readOnlyExpected)
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
_queued.Status = apiStatus;
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>() { _queued });
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(1);
|
||||||
|
items.First().IsReadOnly.Should().Be(readOnlyExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase(DownloadStationTaskStatus.Downloading, DownloadItemStatus.Downloading)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Error, DownloadItemStatus.Failed)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Extracting, DownloadItemStatus.Downloading)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Finished, DownloadItemStatus.Completed)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Finishing, DownloadItemStatus.Downloading)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.HashChecking, DownloadItemStatus.Downloading)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Paused, DownloadItemStatus.Paused)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Seeding, DownloadItemStatus.Completed)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Waiting, DownloadItemStatus.Queued)]
|
||||||
|
public void GetItems_should_return_item_as_downloadItemStatus(DownloadStationTaskStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
_queued.Status = apiStatus;
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>() { _queued });
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
items.Should().HaveCount(1);
|
||||||
|
|
||||||
|
items.First().Status.Should().Be(expectedItemStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+452
@@ -0,0 +1,452 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using FluentAssertions;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common.Disk;
|
||||||
|
using NzbDrone.Common.Http;
|
||||||
|
using NzbDrone.Core.Download;
|
||||||
|
using NzbDrone.Core.Download.Clients.DownloadStation;
|
||||||
|
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
||||||
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
using NzbDrone.Test.Common;
|
||||||
|
using NzbDrone.Core.Organizer;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class UsenetDownloadStationFixture : DownloadClientFixtureBase<UsenetDownloadStation>
|
||||||
|
{
|
||||||
|
protected DownloadStationSettings _settings;
|
||||||
|
|
||||||
|
protected DownloadStationTask _queued;
|
||||||
|
protected DownloadStationTask _downloading;
|
||||||
|
protected DownloadStationTask _failed;
|
||||||
|
protected DownloadStationTask _completed;
|
||||||
|
protected DownloadStationTask _seeding;
|
||||||
|
|
||||||
|
protected string _serialNumber = "SERIALNUMBER";
|
||||||
|
protected string _category = "sonarr";
|
||||||
|
protected string _tvDirectory = @"video/Series";
|
||||||
|
protected string _defaultDestination = "somepath";
|
||||||
|
protected OsPath _physicalPath = new OsPath("/mnt/sdb1/mydata");
|
||||||
|
|
||||||
|
protected RemoteMovie _remoteEpisode;
|
||||||
|
|
||||||
|
protected Dictionary<string, object> _downloadStationConfigItems;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
_remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
|
_settings = new DownloadStationSettings()
|
||||||
|
{
|
||||||
|
Host = "127.0.0.1",
|
||||||
|
Port = 5000,
|
||||||
|
Username = "admin",
|
||||||
|
Password = "pass"
|
||||||
|
};
|
||||||
|
|
||||||
|
Subject.Definition = new DownloadClientDefinition();
|
||||||
|
Subject.Definition.Settings = _settings;
|
||||||
|
|
||||||
|
_queued = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id1",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Waiting,
|
||||||
|
Type = DownloadStationTaskType.NZB.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", FileNameBuilder.CleanFileName(_remoteEpisode.Release.Title) + ".nzb" }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "0"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_completed = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id2",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Finished,
|
||||||
|
Type = DownloadStationTaskType.NZB.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", FileNameBuilder.CleanFileName(_remoteEpisode.Release.Title) + ".nzb" }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "1000"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_seeding = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id2",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Seeding,
|
||||||
|
Type = DownloadStationTaskType.NZB.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", FileNameBuilder.CleanFileName(_remoteEpisode.Release.Title) + ".nzb" }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "1000"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_downloading = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id3",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Downloading,
|
||||||
|
Type = DownloadStationTaskType.NZB.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", FileNameBuilder.CleanFileName(_remoteEpisode.Release.Title) + ".nzb" }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "100"},
|
||||||
|
{ "speed_download", "50" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_failed = new DownloadStationTask()
|
||||||
|
{
|
||||||
|
Id = "id4",
|
||||||
|
Size = 1000,
|
||||||
|
Status = DownloadStationTaskStatus.Error,
|
||||||
|
Type = DownloadStationTaskType.NZB.ToString(),
|
||||||
|
Username = "admin",
|
||||||
|
Title = "title",
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "destination","shared/folder" },
|
||||||
|
{ "uri", FileNameBuilder.CleanFileName(_remoteEpisode.Release.Title) + ".nzb" }
|
||||||
|
},
|
||||||
|
Transfer = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "size_downloaded", "10"},
|
||||||
|
{ "speed_download", "0" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Mocker.GetMock<IHttpClient>()
|
||||||
|
.Setup(s => s.Get(It.IsAny<HttpRequest>()))
|
||||||
|
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), new byte[0]));
|
||||||
|
|
||||||
|
_downloadStationConfigItems = new Dictionary<string, object>
|
||||||
|
{
|
||||||
|
{ "default_destination", _defaultDestination },
|
||||||
|
};
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationInfoProxy>()
|
||||||
|
.Setup(v => v.GetConfig(It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Returns(_downloadStationConfigItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenSharedFolder()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ISharedFolderResolver>()
|
||||||
|
.Setup(s => s.RemapToFullPath(It.IsAny<OsPath>(), It.IsAny<DownloadStationSettings>(), It.IsAny<string>()))
|
||||||
|
.Returns<OsPath, DownloadStationSettings, string>((path, setttings, serial) => _physicalPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenSerialNumber()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ISerialNumberProvider>()
|
||||||
|
.Setup(s => s.GetSerialNumber(It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Returns(_serialNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenTvCategory()
|
||||||
|
{
|
||||||
|
_settings.TvCategory = _category;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenTvDirectory()
|
||||||
|
{
|
||||||
|
_settings.TvDirectory = _tvDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void GivenTasks(List<DownloadStationTask> nzbs)
|
||||||
|
{
|
||||||
|
if (nzbs == null)
|
||||||
|
{
|
||||||
|
nzbs = new List<DownloadStationTask>();
|
||||||
|
}
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Setup(s => s.GetTasks(It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Returns(nzbs);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void PrepareClientToReturnQueuedItem()
|
||||||
|
{
|
||||||
|
GivenTasks(new List<DownloadStationTask>
|
||||||
|
{
|
||||||
|
_queued
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenSuccessfulDownload()
|
||||||
|
{/*
|
||||||
|
Mocker.GetMock<IHttpClient>()
|
||||||
|
.Setup(s => s.Get(It.IsAny<HttpRequest>()))
|
||||||
|
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), new byte[1000]));
|
||||||
|
*/
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Setup(s => s.AddTaskFromData(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<DownloadStationSettings>()))
|
||||||
|
.Callback(PrepareClientToReturnQueuedItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenAllKindOfTasks()
|
||||||
|
{
|
||||||
|
var tasks = new List<DownloadStationTask>() { _queued, _completed, _failed, _downloading, _seeding };
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Setup(d => d.GetTasks(_settings))
|
||||||
|
.Returns(tasks);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Download_with_TvDirectory_should_force_directory()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenTvDirectory();
|
||||||
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
|
var remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
|
var id = Subject.Download(remoteEpisode);
|
||||||
|
|
||||||
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Verify(v => v.AddTaskFromData(It.IsAny<byte[]>(), It.IsAny<string>(), _tvDirectory, It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Download_with_category_should_force_directory()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenTvCategory();
|
||||||
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
|
var remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
|
var id = Subject.Download(remoteEpisode);
|
||||||
|
|
||||||
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Verify(v => v.AddTaskFromData(It.IsAny<byte[]>(), It.IsAny<string>(), $"{_defaultDestination}/{_category}", It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Download_without_TvDirectory_and_Category_should_use_default()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
|
var remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
|
var id = Subject.Download(remoteEpisode);
|
||||||
|
|
||||||
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Verify(v => v.AddTaskFromData(It.IsAny<byte[]>(), It.IsAny<string>(), null, It.IsAny<DownloadStationSettings>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_return_empty_list_if_no_tasks_available()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
GivenTasks(new List<DownloadStationTask>());
|
||||||
|
|
||||||
|
Subject.GetItems().Should().BeEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_return_ignore_tasks_of_unknown_type()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
GivenTasks(new List<DownloadStationTask> { _completed });
|
||||||
|
|
||||||
|
_completed.Type = "ipfs";
|
||||||
|
|
||||||
|
Subject.GetItems().Should().BeEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_ignore_downloads_in_wrong_folder()
|
||||||
|
{
|
||||||
|
_settings.TvDirectory = @"/shared/folder/sub";
|
||||||
|
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
GivenTasks(new List<DownloadStationTask> { _completed });
|
||||||
|
|
||||||
|
Subject.GetItems().Should().BeEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_throw_if_shared_folder_resolve_fails()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ISharedFolderResolver>()
|
||||||
|
.Setup(s => s.RemapToFullPath(It.IsAny<OsPath>(), It.IsAny<DownloadStationSettings>(), It.IsAny<string>()))
|
||||||
|
.Throws(new ApplicationException("Some unknown exception, HttpException or DownloadClientException"));
|
||||||
|
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenAllKindOfTasks();
|
||||||
|
|
||||||
|
Assert.Throws(Is.InstanceOf<Exception>(), () => Subject.GetItems());
|
||||||
|
ExceptionVerification.ExpectedErrors(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_throw_if_serial_number_unavailable()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ISerialNumberProvider>()
|
||||||
|
.Setup(s => s.GetSerialNumber(_settings))
|
||||||
|
.Throws(new ApplicationException("Some unknown exception, HttpException or DownloadClientException"));
|
||||||
|
|
||||||
|
GivenSharedFolder();
|
||||||
|
GivenAllKindOfTasks();
|
||||||
|
|
||||||
|
Assert.Throws(Is.InstanceOf<Exception>(), () => Subject.GetItems());
|
||||||
|
ExceptionVerification.ExpectedErrors(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Download_should_throw_and_not_add_task_if_cannot_get_serial_number()
|
||||||
|
{
|
||||||
|
var remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
|
Mocker.GetMock<ISerialNumberProvider>()
|
||||||
|
.Setup(s => s.GetSerialNumber(_settings))
|
||||||
|
.Throws(new ApplicationException("Some unknown exception, HttpException or DownloadClientException"));
|
||||||
|
|
||||||
|
Assert.Throws(Is.InstanceOf<Exception>(), () => Subject.Download(remoteEpisode));
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadStationTaskProxy>()
|
||||||
|
.Verify(v => v.AddTaskFromUrl(It.IsAny<string>(), null, _settings), Times.Never());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_not_map_outputpath_for_queued_or_downloading_tasks()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>
|
||||||
|
{
|
||||||
|
_queued, _downloading
|
||||||
|
});
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(2);
|
||||||
|
items.Should().OnlyContain(v => v.OutputPath.IsEmpty);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetItems_should_map_outputpath_for_completed_or_failed_tasks()
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>
|
||||||
|
{
|
||||||
|
_completed, _failed, _seeding
|
||||||
|
});
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(3);
|
||||||
|
items.Should().OnlyContain(v => !v.OutputPath.IsEmpty);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase(DownloadStationTaskStatus.Downloading, DownloadItemStatus.Downloading, true)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Finished, DownloadItemStatus.Completed, false)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Waiting, DownloadItemStatus.Queued, true)]
|
||||||
|
public void GetItems_should_return_readonly_expected(DownloadStationTaskStatus apiStatus, DownloadItemStatus expectedItemStatus, bool readOnlyExpected)
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
_queued.Status = apiStatus;
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>() { _queued });
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
|
||||||
|
items.Should().HaveCount(1);
|
||||||
|
items.First().IsReadOnly.Should().Be(readOnlyExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase(DownloadStationTaskStatus.Downloading, DownloadItemStatus.Downloading)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Error, DownloadItemStatus.Failed)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Extracting, DownloadItemStatus.Downloading)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Finished, DownloadItemStatus.Completed)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Finishing, DownloadItemStatus.Downloading)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.HashChecking, DownloadItemStatus.Downloading)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Paused, DownloadItemStatus.Paused)]
|
||||||
|
[TestCase(DownloadStationTaskStatus.Waiting, DownloadItemStatus.Queued)]
|
||||||
|
public void GetItems_should_return_item_as_downloadItemStatus(DownloadStationTaskStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
||||||
|
{
|
||||||
|
GivenSerialNumber();
|
||||||
|
GivenSharedFolder();
|
||||||
|
|
||||||
|
_queued.Status = apiStatus;
|
||||||
|
|
||||||
|
GivenTasks(new List<DownloadStationTask>() { _queued });
|
||||||
|
|
||||||
|
var items = Subject.GetItems();
|
||||||
|
items.Should().HaveCount(1);
|
||||||
|
|
||||||
|
items.First().Status.Should().Be(expectedItemStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+14
-14
@@ -37,7 +37,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
|
|||||||
DownloadedBytes = 0,
|
DownloadedBytes = 0,
|
||||||
Progress = 0.0,
|
Progress = 0.0,
|
||||||
SavePath = "somepath",
|
SavePath = "somepath",
|
||||||
Label = "sonarr-tv"
|
Label = "radarr"
|
||||||
};
|
};
|
||||||
|
|
||||||
_downloading = new HadoukenTorrent
|
_downloading = new HadoukenTorrent
|
||||||
@@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
|
|||||||
DownloadedBytes = 100,
|
DownloadedBytes = 100,
|
||||||
Progress = 10.0,
|
Progress = 10.0,
|
||||||
SavePath = "somepath",
|
SavePath = "somepath",
|
||||||
Label = "sonarr-tv"
|
Label = "radarr"
|
||||||
};
|
};
|
||||||
|
|
||||||
_failed = new HadoukenTorrent
|
_failed = new HadoukenTorrent
|
||||||
@@ -64,7 +64,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
|
|||||||
DownloadedBytes = 100,
|
DownloadedBytes = 100,
|
||||||
Progress = 10.0,
|
Progress = 10.0,
|
||||||
SavePath = "somepath",
|
SavePath = "somepath",
|
||||||
Label = "sonarr-tv"
|
Label = "radarr"
|
||||||
};
|
};
|
||||||
|
|
||||||
_completed = new HadoukenTorrent
|
_completed = new HadoukenTorrent
|
||||||
@@ -77,7 +77,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
|
|||||||
DownloadedBytes = 1000,
|
DownloadedBytes = 1000,
|
||||||
Progress = 100.0,
|
Progress = 100.0,
|
||||||
SavePath = "somepath",
|
SavePath = "somepath",
|
||||||
Label = "sonarr-tv"
|
Label = "radarr"
|
||||||
};
|
};
|
||||||
|
|
||||||
Mocker.GetMock<ITorrentFileInfoReader>()
|
Mocker.GetMock<ITorrentFileInfoReader>()
|
||||||
@@ -197,9 +197,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -235,7 +235,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
|
|||||||
DownloadedBytes = 1000,
|
DownloadedBytes = 1000,
|
||||||
Progress = 100.0,
|
Progress = 100.0,
|
||||||
SavePath = "somepath",
|
SavePath = "somepath",
|
||||||
Label = "sonarr-tv"
|
Label = "radarr"
|
||||||
};
|
};
|
||||||
|
|
||||||
var torrents = new HadoukenTorrent[] { torrent };
|
var torrents = new HadoukenTorrent[] { torrent };
|
||||||
@@ -262,7 +262,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
|
|||||||
DownloadedBytes = 1000,
|
DownloadedBytes = 1000,
|
||||||
Progress = 100.0,
|
Progress = 100.0,
|
||||||
SavePath = "somepath",
|
SavePath = "somepath",
|
||||||
Label = "sonarr-tv-other"
|
Label = "radarr-other"
|
||||||
};
|
};
|
||||||
|
|
||||||
var torrents = new HadoukenTorrent[] { torrent };
|
var torrents = new HadoukenTorrent[] { torrent };
|
||||||
@@ -276,14 +276,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void Download_from_magnet_link_should_return_hash_uppercase()
|
public void Download_from_magnet_link_should_return_hash_uppercase()
|
||||||
{
|
{
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
remoteEpisode.Release.DownloadUrl = "magnet:?xt=urn:btih:a45129e59d8750f9da982f53552b1e4f0457ee9f";
|
remoteMovie.Release.DownloadUrl = "magnet:?xt=urn:btih:a45129e59d8750f9da982f53552b1e4f0457ee9f";
|
||||||
|
|
||||||
Mocker.GetMock<IHadoukenProxy>()
|
Mocker.GetMock<IHadoukenProxy>()
|
||||||
.Setup(v => v.AddTorrentUri(It.IsAny<HadoukenSettings>(), It.IsAny<string>()));
|
.Setup(v => v.AddTorrentUri(It.IsAny<HadoukenSettings>(), It.IsAny<string>()));
|
||||||
|
|
||||||
var result = Subject.Download(remoteEpisode);
|
var result = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Assert.IsFalse(result.Any(c => char.IsLower(c)));
|
Assert.IsFalse(result.Any(c => char.IsLower(c)));
|
||||||
}
|
}
|
||||||
@@ -291,14 +291,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void Download_from_torrent_file_should_return_hash_uppercase()
|
public void Download_from_torrent_file_should_return_hash_uppercase()
|
||||||
{
|
{
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
Mocker.GetMock<IHadoukenProxy>()
|
Mocker.GetMock<IHadoukenProxy>()
|
||||||
.Setup(v => v.AddTorrentFile(It.IsAny<HadoukenSettings>(), It.IsAny<byte[]>()))
|
.Setup(v => v.AddTorrentFile(It.IsAny<HadoukenSettings>(), It.IsAny<byte[]>()))
|
||||||
.Returns("hash");
|
.Returns("hash");
|
||||||
|
|
||||||
var result = Subject.Download(remoteEpisode);
|
var result = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Assert.IsFalse(result.Any(c => char.IsLower(c)));
|
Assert.IsFalse(result.Any(c => char.IsLower(c)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-14
@@ -42,7 +42,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
|
|||||||
DownloadedSize = 1000,
|
DownloadedSize = 1000,
|
||||||
TotalDownloadSize = 10,
|
TotalDownloadSize = 10,
|
||||||
GroupName = "tv",
|
GroupName = "tv",
|
||||||
UiTitle = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE"
|
UiTitle = "Droned.1998.1080p.WEB-DL-DRONE"
|
||||||
};
|
};
|
||||||
|
|
||||||
_failed = new NzbVortexQueueItem
|
_failed = new NzbVortexQueueItem
|
||||||
@@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
|
|||||||
DownloadedSize = 1000,
|
DownloadedSize = 1000,
|
||||||
TotalDownloadSize = 1000,
|
TotalDownloadSize = 1000,
|
||||||
GroupName = "tv",
|
GroupName = "tv",
|
||||||
UiTitle = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE",
|
UiTitle = "Droned.1998.1080p.WEB-DL-DRONE",
|
||||||
DestinationPath = "somedirectory",
|
DestinationPath = "somedirectory",
|
||||||
State = NzbVortexStateType.UncompressFailed,
|
State = NzbVortexStateType.UncompressFailed,
|
||||||
};
|
};
|
||||||
@@ -60,8 +60,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
|
|||||||
DownloadedSize = 1000,
|
DownloadedSize = 1000,
|
||||||
TotalDownloadSize = 1000,
|
TotalDownloadSize = 1000,
|
||||||
GroupName = "tv",
|
GroupName = "tv",
|
||||||
UiTitle = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE",
|
UiTitle = "Droned.1998.1080p.WEB-DL-DRONE",
|
||||||
DestinationPath = "/remote/mount/tv/Droned.S01E01.Pilot.1080p.WEB-DL-DRONE",
|
DestinationPath = "/remote/mount/tv/Droned.1998.1080p.WEB-DL-DRONE",
|
||||||
State = NzbVortexStateType.Done
|
State = NzbVortexStateType.Done
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -189,9 +189,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -201,9 +201,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
|
|||||||
{
|
{
|
||||||
GivenFailedDownload();
|
GivenFailedDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
Assert.Throws<DownloadClientException>(() => Subject.Download(remoteEpisode));
|
Assert.Throws<DownloadClientException>(() => Subject.Download(remoteMovie));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -223,13 +223,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
|
|||||||
{
|
{
|
||||||
Mocker.GetMock<IRemotePathMappingService>()
|
Mocker.GetMock<IRemotePathMappingService>()
|
||||||
.Setup(v => v.RemapRemoteToLocal("127.0.0.1", It.IsAny<OsPath>()))
|
.Setup(v => v.RemapRemoteToLocal("127.0.0.1", It.IsAny<OsPath>()))
|
||||||
.Returns(new OsPath(@"O:\mymount\Droned.S01E01.Pilot.1080p.WEB-DL-DRONE".AsOsAgnostic()));
|
.Returns(new OsPath(@"O:\mymount\Droned.1998.1080p.WEB-DL-DRONE".AsOsAgnostic()));
|
||||||
|
|
||||||
GivenQueue(_completed);
|
GivenQueue(_completed);
|
||||||
|
|
||||||
var result = Subject.GetItems().Single();
|
var result = Subject.GetItems().Single();
|
||||||
|
|
||||||
result.OutputPath.Should().Be(@"O:\mymount\Droned.S01E01.Pilot.1080p.WEB-DL-DRONE".AsOsAgnostic());
|
result.OutputPath.Should().Be(@"O:\mymount\Droned.1998.1080p.WEB-DL-DRONE".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -241,14 +241,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
|
|||||||
|
|
||||||
Mocker.GetMock<INzbVortexProxy>()
|
Mocker.GetMock<INzbVortexProxy>()
|
||||||
.Setup(s => s.GetFiles(It.IsAny<int>(), It.IsAny<NzbVortexSettings>()))
|
.Setup(s => s.GetFiles(It.IsAny<int>(), It.IsAny<NzbVortexSettings>()))
|
||||||
.Returns(new List<NzbVortexFile> { new NzbVortexFile { FileName = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE.mkv" } });
|
.Returns(new List<NzbVortexFile> { new NzbVortexFile { FileName = "Droned.1998.1080p.WEB-DL-DRONE.mkv" } });
|
||||||
|
|
||||||
_completed.State = NzbVortexStateType.Done;
|
_completed.State = NzbVortexStateType.Done;
|
||||||
GivenQueue(_completed);
|
GivenQueue(_completed);
|
||||||
|
|
||||||
var result = Subject.GetItems().Single();
|
var result = Subject.GetItems().Single();
|
||||||
|
|
||||||
result.OutputPath.Should().Be(@"O:\mymount\Droned.S01E01.Pilot.1080p.WEB-DL-DRONE.mkv".AsOsAgnostic());
|
result.OutputPath.Should().Be(@"O:\mymount\Droned.1998.1080p.WEB-DL-DRONE.mkv".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -262,8 +262,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
|
|||||||
.Setup(s => s.GetFiles(It.IsAny<int>(), It.IsAny<NzbVortexSettings>()))
|
.Setup(s => s.GetFiles(It.IsAny<int>(), It.IsAny<NzbVortexSettings>()))
|
||||||
.Returns(new List<NzbVortexFile>
|
.Returns(new List<NzbVortexFile>
|
||||||
{
|
{
|
||||||
new NzbVortexFile { FileName = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE.mkv" },
|
new NzbVortexFile { FileName = "Droned.1998.1080p.WEB-DL-DRONE.mkv" },
|
||||||
new NzbVortexFile { FileName = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE.nfo" }
|
new NzbVortexFile { FileName = "Droned.1998.1080p.WEB-DL-DRONE.nfo" }
|
||||||
});
|
});
|
||||||
|
|
||||||
_completed.State = NzbVortexStateType.Done;
|
_completed.State = NzbVortexStateType.Done;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
|
|||||||
FileSizeLo = 1000,
|
FileSizeLo = 1000,
|
||||||
RemainingSizeLo = 10,
|
RemainingSizeLo = 10,
|
||||||
Category = "tv",
|
Category = "tv",
|
||||||
NzbName = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE",
|
NzbName = "Droned.1998.1080p.WEB-DL-DRONE",
|
||||||
Parameters = new List<NzbgetParameter> { new NzbgetParameter { Name = "drone", Value = "id" } }
|
Parameters = new List<NzbgetParameter> { new NzbgetParameter { Name = "drone", Value = "id" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
|
|||||||
{
|
{
|
||||||
FileSizeLo = 1000,
|
FileSizeLo = 1000,
|
||||||
Category = "tv",
|
Category = "tv",
|
||||||
Name = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE",
|
Name = "Droned.1998.1080p.WEB-DL-DRONE",
|
||||||
DestDir = "somedirectory",
|
DestDir = "somedirectory",
|
||||||
Parameters = new List<NzbgetParameter> { new NzbgetParameter { Name = "drone", Value = "id" } },
|
Parameters = new List<NzbgetParameter> { new NzbgetParameter { Name = "drone", Value = "id" } },
|
||||||
ParStatus = "Some Error",
|
ParStatus = "Some Error",
|
||||||
@@ -62,8 +62,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
|
|||||||
{
|
{
|
||||||
FileSizeLo = 1000,
|
FileSizeLo = 1000,
|
||||||
Category = "tv",
|
Category = "tv",
|
||||||
Name = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE",
|
Name = "Droned.1998.1080p.WEB-DL-DRONE",
|
||||||
DestDir = "/remote/mount/tv/Droned.S01E01.Pilot.1080p.WEB-DL-DRONE",
|
DestDir = "/remote/mount/tv/Droned.1998.1080p.WEB-DL-DRONE",
|
||||||
Parameters = new List<NzbgetParameter> { new NzbgetParameter { Name = "drone", Value = "id" } },
|
Parameters = new List<NzbgetParameter> { new NzbgetParameter { Name = "drone", Value = "id" } },
|
||||||
ParStatus = "SUCCESS",
|
ParStatus = "SUCCESS",
|
||||||
UnpackStatus = "NONE",
|
UnpackStatus = "NONE",
|
||||||
@@ -303,9 +303,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -315,9 +315,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
|
|||||||
{
|
{
|
||||||
GivenFailedDownload();
|
GivenFailedDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
Assert.Throws<DownloadClientException>(() => Subject.Download(remoteEpisode));
|
Assert.Throws<DownloadClientException>(() => Subject.Download(remoteMovie));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -362,14 +362,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
|
|||||||
{
|
{
|
||||||
Mocker.GetMock<IRemotePathMappingService>()
|
Mocker.GetMock<IRemotePathMappingService>()
|
||||||
.Setup(v => v.RemapRemoteToLocal("127.0.0.1", It.IsAny<OsPath>()))
|
.Setup(v => v.RemapRemoteToLocal("127.0.0.1", It.IsAny<OsPath>()))
|
||||||
.Returns(new OsPath(@"O:\mymount\Droned.S01E01.Pilot.1080p.WEB-DL-DRONE".AsOsAgnostic()));
|
.Returns(new OsPath(@"O:\mymount\Droned.1998.1080p.WEB-DL-DRONE".AsOsAgnostic()));
|
||||||
|
|
||||||
GivenQueue(null);
|
GivenQueue(null);
|
||||||
GivenHistory(_completed);
|
GivenHistory(_completed);
|
||||||
|
|
||||||
var result = Subject.GetItems().Single();
|
var result = Subject.GetItems().Single();
|
||||||
|
|
||||||
result.OutputPath.Should().Be(@"O:\mymount\Droned.S01E01.Pilot.1080p.WEB-DL-DRONE".AsOsAgnostic());
|
result.OutputPath.Should().Be(@"O:\mymount\Droned.1998.1080p.WEB-DL-DRONE".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestCase("11.0", false)]
|
[TestCase("11.0", false)]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using Moq;
|
using Moq;
|
||||||
@@ -21,7 +21,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
|||||||
private string _pneumaticFolder;
|
private string _pneumaticFolder;
|
||||||
private string _sabDrop;
|
private string _sabDrop;
|
||||||
private string _nzbPath;
|
private string _nzbPath;
|
||||||
private RemoteEpisode _remoteEpisode;
|
private RemoteMovie _remoteMovie;
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void Setup()
|
public void Setup()
|
||||||
@@ -31,15 +31,15 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
|||||||
_nzbPath = Path.Combine(_pneumaticFolder, _title + ".nzb").AsOsAgnostic();
|
_nzbPath = Path.Combine(_pneumaticFolder, _title + ".nzb").AsOsAgnostic();
|
||||||
_sabDrop = @"d:\unsorted tv\".AsOsAgnostic();
|
_sabDrop = @"d:\unsorted tv\".AsOsAgnostic();
|
||||||
|
|
||||||
Mocker.GetMock<IConfigService>().SetupGet(c => c.DownloadedEpisodesFolder).Returns(_sabDrop);
|
Mocker.GetMock<IConfigService>().SetupGet(c => c.DownloadedMoviesFolder).Returns(_sabDrop);
|
||||||
|
|
||||||
_remoteEpisode = new RemoteEpisode();
|
_remoteMovie = new RemoteMovie();
|
||||||
_remoteEpisode.Release = new ReleaseInfo();
|
_remoteMovie.Release = new ReleaseInfo();
|
||||||
_remoteEpisode.Release.Title = _title;
|
_remoteMovie.Release.Title = _title;
|
||||||
_remoteEpisode.Release.DownloadUrl = _nzbUrl;
|
_remoteMovie.Release.DownloadUrl = _nzbUrl;
|
||||||
|
|
||||||
_remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo();
|
_remoteMovie.ParsedEpisodeInfo = new ParsedEpisodeInfo();
|
||||||
_remoteEpisode.ParsedEpisodeInfo.FullSeason = false;
|
_remoteMovie.ParsedEpisodeInfo.FullSeason = false;
|
||||||
|
|
||||||
Subject.Definition = new DownloadClientDefinition();
|
Subject.Definition = new DownloadClientDefinition();
|
||||||
Subject.Definition.Settings = new PneumaticSettings
|
Subject.Definition.Settings = new PneumaticSettings
|
||||||
@@ -56,7 +56,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_download_file_if_it_doesnt_exist()
|
public void should_download_file_if_it_doesnt_exist()
|
||||||
{
|
{
|
||||||
Subject.Download(_remoteEpisode);
|
Subject.Download(_remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>().Verify(c => c.DownloadFile(_nzbUrl, _nzbPath), Times.Once());
|
Mocker.GetMock<IHttpClient>().Verify(c => c.DownloadFile(_nzbUrl, _nzbPath), Times.Once());
|
||||||
}
|
}
|
||||||
@@ -67,16 +67,16 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
|||||||
{
|
{
|
||||||
WithFailedDownload();
|
WithFailedDownload();
|
||||||
|
|
||||||
Assert.Throws<WebException>(() => Subject.Download(_remoteEpisode));
|
Assert.Throws<WebException>(() => Subject.Download(_remoteMovie));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_throw_if_full_season_download()
|
public void should_throw_if_full_season_download()
|
||||||
{
|
{
|
||||||
_remoteEpisode.Release.Title = "30 Rock - Season 1";
|
_remoteMovie.Release.Title = "30 Rock - Season 1";
|
||||||
_remoteEpisode.ParsedEpisodeInfo.FullSeason = true;
|
_remoteMovie.ParsedEpisodeInfo.FullSeason = true;
|
||||||
|
|
||||||
Assert.Throws<NotSupportedException>(() => Subject.Download(_remoteEpisode));
|
Assert.Throws<NotSupportedException>(() => Subject.Download(_remoteMovie));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -90,9 +90,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
|||||||
{
|
{
|
||||||
var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]";
|
var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]";
|
||||||
var expectedFilename = Path.Combine(_pneumaticFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV].nzb");
|
var expectedFilename = Path.Combine(_pneumaticFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV].nzb");
|
||||||
_remoteEpisode.Release.Title = illegalTitle;
|
_remoteMovie.Release.Title = illegalTitle;
|
||||||
|
|
||||||
Subject.Download(_remoteEpisode);
|
Subject.Download(_remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>().Verify(c => c.DownloadFile(It.IsAny<string>(), expectedFilename), Times.Once());
|
Mocker.GetMock<IHttpClient>().Verify(c => c.DownloadFile(It.IsAny<string>(), expectedFilename), Times.Once());
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-9
@@ -245,9 +245,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -257,10 +257,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.DownloadUrl = magnetUrl;
|
remoteMovie.Release.DownloadUrl = magnetUrl;
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().Be(expectedHash);
|
id.Should().Be(expectedHash);
|
||||||
}
|
}
|
||||||
@@ -290,9 +290,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
|||||||
GivenRedirectToMagnet();
|
GivenRedirectToMagnet();
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -303,9 +303,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
|||||||
GivenRedirectToTorrent();
|
GivenRedirectToTorrent();
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-22
@@ -25,26 +25,26 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.RTorrentTests
|
|||||||
};
|
};
|
||||||
|
|
||||||
_downloading = new RTorrentTorrent
|
_downloading = new RTorrentTorrent
|
||||||
{
|
{
|
||||||
Hash = "HASH",
|
Hash = "HASH",
|
||||||
IsFinished = false,
|
IsFinished = false,
|
||||||
IsOpen = true,
|
IsOpen = true,
|
||||||
IsActive = true,
|
IsActive = true,
|
||||||
Name = _title,
|
Name = _title,
|
||||||
TotalSize = 1000,
|
TotalSize = 1000,
|
||||||
RemainingSize = 500,
|
RemainingSize = 500,
|
||||||
Path = "somepath"
|
Path = "somepath"
|
||||||
};
|
};
|
||||||
|
|
||||||
_completed = new RTorrentTorrent
|
_completed = new RTorrentTorrent
|
||||||
{
|
{
|
||||||
Hash = "HASH",
|
Hash = "HASH",
|
||||||
IsFinished = true,
|
IsFinished = true,
|
||||||
Name = _title,
|
Name = _title,
|
||||||
TotalSize = 1000,
|
TotalSize = 1000,
|
||||||
RemainingSize = 0,
|
RemainingSize = 0,
|
||||||
Path = "somepath"
|
Path = "somepath"
|
||||||
};
|
};
|
||||||
|
|
||||||
Mocker.GetMock<ITorrentFileInfoReader>()
|
Mocker.GetMock<ITorrentFileInfoReader>()
|
||||||
.Setup(s => s.GetHashFromTorrentFile(It.IsAny<byte[]>()))
|
.Setup(s => s.GetHashFromTorrentFile(It.IsAny<byte[]>()))
|
||||||
@@ -54,11 +54,11 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.RTorrentTests
|
|||||||
protected void GivenSuccessfulDownload()
|
protected void GivenSuccessfulDownload()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IRTorrentProxy>()
|
Mocker.GetMock<IRTorrentProxy>()
|
||||||
.Setup(s => s.AddTorrentFromUrl(It.IsAny<string>(), It.IsAny<RTorrentSettings>()))
|
.Setup(s => s.AddTorrentFromUrl(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<RTorrentPriority>(), It.IsAny<string>(), It.IsAny<RTorrentSettings>()))
|
||||||
.Callback(PrepareClientToReturnCompletedItem);
|
.Callback(PrepareClientToReturnCompletedItem);
|
||||||
|
|
||||||
Mocker.GetMock<IRTorrentProxy>()
|
Mocker.GetMock<IRTorrentProxy>()
|
||||||
.Setup(s => s.AddTorrentFromFile(It.IsAny<string>(), It.IsAny<byte[]>(), It.IsAny<RTorrentSettings>()))
|
.Setup(s => s.AddTorrentFromFile(It.IsAny<string>(), It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<RTorrentPriority>(), It.IsAny<string>(), It.IsAny<RTorrentSettings>()))
|
||||||
.Callback(PrepareClientToReturnCompletedItem);
|
.Callback(PrepareClientToReturnCompletedItem);
|
||||||
|
|
||||||
|
|
||||||
@@ -116,11 +116,11 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.RTorrentTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteEpisode = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteEpisode);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+143
-30
@@ -23,6 +23,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
private SabnzbdHistory _failed;
|
private SabnzbdHistory _failed;
|
||||||
private SabnzbdHistory _completed;
|
private SabnzbdHistory _completed;
|
||||||
private SabnzbdConfig _config;
|
private SabnzbdConfig _config;
|
||||||
|
private SabnzbdFullStatus _fullStatus;
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void Setup()
|
public void Setup()
|
||||||
@@ -52,7 +53,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
Timeleft = TimeSpan.FromSeconds(10),
|
Timeleft = TimeSpan.FromSeconds(10),
|
||||||
Category = "tv",
|
Category = "tv",
|
||||||
Id = "sabnzbd_nzb12345",
|
Id = "sabnzbd_nzb12345",
|
||||||
Title = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE"
|
Title = "Droned.1998.1080p.WEB-DL-DRONE"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -65,9 +66,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
{
|
{
|
||||||
Status = SabnzbdDownloadStatus.Failed,
|
Status = SabnzbdDownloadStatus.Failed,
|
||||||
Size = 1000,
|
Size = 1000,
|
||||||
Category = "tv",
|
Category = "tv",
|
||||||
Id = "sabnzbd_nzb12345",
|
Id = "sabnzbd_nzb12345",
|
||||||
Title = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE"
|
Title = "Droned.1998.1080p.WEB-DL-DRONE"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -80,10 +81,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
{
|
{
|
||||||
Status = SabnzbdDownloadStatus.Completed,
|
Status = SabnzbdDownloadStatus.Completed,
|
||||||
Size = 1000,
|
Size = 1000,
|
||||||
Category = "tv",
|
Category = "tv",
|
||||||
Id = "sabnzbd_nzb12345",
|
Id = "sabnzbd_nzb12345",
|
||||||
Title = "Droned.S01E01.Pilot.1080p.WEB-DL-DRONE",
|
Title = "Droned.1998.1080p.WEB-DL-DRONE",
|
||||||
Storage = "/remote/mount/vv/Droned.S01E01.Pilot.1080p.WEB-DL-DRONE"
|
Storage = "/remote/mount/vv/Droned.1998.1080p.WEB-DL-DRONE"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -100,9 +101,29 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Mocker.GetMock<ISabnzbdProxy>()
|
||||||
|
.Setup(v => v.GetVersion(It.IsAny<SabnzbdSettings>()))
|
||||||
|
.Returns("1.2.3");
|
||||||
|
|
||||||
Mocker.GetMock<ISabnzbdProxy>()
|
Mocker.GetMock<ISabnzbdProxy>()
|
||||||
.Setup(s => s.GetConfig(It.IsAny<SabnzbdSettings>()))
|
.Setup(s => s.GetConfig(It.IsAny<SabnzbdSettings>()))
|
||||||
.Returns(_config);
|
.Returns(_config);
|
||||||
|
|
||||||
|
_fullStatus = new SabnzbdFullStatus
|
||||||
|
{
|
||||||
|
CompleteDir = @"Y:\nzbget\root\complete".AsOsAgnostic()
|
||||||
|
};
|
||||||
|
|
||||||
|
Mocker.GetMock<ISabnzbdProxy>()
|
||||||
|
.Setup(s => s.GetFullStatus(It.IsAny<SabnzbdSettings>()))
|
||||||
|
.Returns(_fullStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GivenVersion(string version)
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ISabnzbdProxy>()
|
||||||
|
.Setup(s => s.GetVersion(It.IsAny<SabnzbdSettings>()))
|
||||||
|
.Returns(version);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void GivenFailedDownload()
|
protected void GivenFailedDownload()
|
||||||
@@ -166,7 +187,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
|
|
||||||
GivenQueue(_queued);
|
GivenQueue(_queued);
|
||||||
GivenHistory(null);
|
GivenHistory(null);
|
||||||
|
|
||||||
var result = Subject.GetItems().Single();
|
var result = Subject.GetItems().Single();
|
||||||
|
|
||||||
VerifyQueued(result);
|
VerifyQueued(result);
|
||||||
@@ -255,15 +276,15 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
Subject.GetItems().Should().BeEmpty();
|
Subject.GetItems().Should().BeEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestCase("[ TOWN ]-[ http://www.town.ag ]-[ ANIME ]-[Usenet Provider >> http://www.ssl- <<] - [Commie] Aldnoah Zero 18 [234C8FC7]", "[ TOWN ]-[ http-++www.town.ag ]-[ ANIME ]-[Usenet Provider http-++www.ssl- ] - [Commie] Aldnoah Zero 18 [234C8FC7].nzb")]
|
[TestCase("[ TOWN ]-[ http://www.town.ag ]-[ ANIME ]-[Usenet Provider >> http://www.ssl- <<] - [Commie] Aldnoah Zero 18 [234C8FC7]", "[ TOWN ]-[ http++www.town.ag ]-[ ANIME ]-[Usenet Provider http++www.ssl- ] - [Commie] Aldnoah Zero 18 [234C8FC7].nzb")]
|
||||||
public void Download_should_use_clean_title(string title, string filename)
|
public void Download_should_use_clean_title(string title, string filename)
|
||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.Title = title;
|
remoteMovie.Release.Title = title;
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<ISabnzbdProxy>()
|
Mocker.GetMock<ISabnzbdProxy>()
|
||||||
.Verify(v => v.DownloadNzb(It.IsAny<byte[]>(), filename, It.IsAny<string>(), It.IsAny<int>(), It.IsAny<SabnzbdSettings>()), Times.Once());
|
.Verify(v => v.DownloadNzb(It.IsAny<byte[]>(), filename, It.IsAny<string>(), It.IsAny<int>(), It.IsAny<SabnzbdSettings>()), Times.Once());
|
||||||
@@ -274,9 +295,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -309,29 +330,30 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Ignore("Series")]
|
||||||
public void Download_should_use_sabRecentTvPriority_when_recentEpisode_is_true()
|
public void Download_should_use_sabRecentTvPriority_when_recentEpisode_is_true()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<ISabnzbdProxy>()
|
Mocker.GetMock<ISabnzbdProxy>()
|
||||||
.Setup(s => s.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>()))
|
.Setup(s => s.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>()))
|
||||||
.Returns(new SabnzbdAddResponse());
|
.Returns(new SabnzbdAddResponse());
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Episodes = Builder<Episode>.CreateListOfSize(1)
|
/*remoteMovie.Episodes = Builder<Episode>.CreateListOfSize(1)
|
||||||
.All()
|
.All()
|
||||||
.With(e => e.AirDate = DateTime.Today.ToString(Episode.AIR_DATE_FORMAT))
|
.With(e => e.AirDate = DateTime.Today.ToString(Episode.AIR_DATE_FORMAT))
|
||||||
.Build()
|
.Build()
|
||||||
.ToList();
|
.ToList();*/
|
||||||
|
|
||||||
Subject.Download(remoteEpisode);
|
Subject.Download(remoteMovie);
|
||||||
|
|
||||||
Mocker.GetMock<ISabnzbdProxy>()
|
Mocker.GetMock<ISabnzbdProxy>()
|
||||||
.Verify(v => v.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>()), Times.Once());
|
.Verify(v => v.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>()), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestCase(@"Droned.S01E01.Pilot.1080p.WEB-DL-DRONE", @"Droned.S01E01_Pilot_1080p_WEB-DL-DRONE.mkv")]
|
[TestCase(@"Droned.1998.1080p.WEB-DL-DRONE", @"Droned.1998_1080p_WEB-DL-DRONE.mkv")]
|
||||||
[TestCase(@"Droned.S01E01.Pilot.1080p.WEB-DL-DRONE", @"SubDir\Droned.S01E01_Pilot_1080p_WEB-DL-DRONE.mkv")]
|
[TestCase(@"Droned.1998.1080p.WEB-DL-DRONE", @"SubDir\Droned.1998_1080p_WEB-DL-DRONE.mkv")]
|
||||||
[TestCase(@"Droned.S01E01.Pilot.1080p.WEB-DL-DRONE.mkv", @"SubDir\Droned.S01E01_Pilot_1080p_WEB-DL-DRONE.mkv")]
|
[TestCase(@"Droned.1998.1080p.WEB-DL-DRONE.mkv", @"SubDir\Droned.1998_1080p_WEB-DL-DRONE.mkv")]
|
||||||
[TestCase(@"Droned.S01E01.Pilot.1080p.WEB-DL-DRONE.mkv", @"SubDir\SubDir\Droned.S01E01_Pilot_1080p_WEB-DL-DRONE.mkv")]
|
[TestCase(@"Droned.1998.1080p.WEB-DL-DRONE.mkv", @"SubDir\SubDir\Droned.1998_1080p_WEB-DL-DRONE.mkv")]
|
||||||
public void should_return_path_to_jobfolder(string title, string storage)
|
public void should_return_path_to_jobfolder(string title, string storage)
|
||||||
{
|
{
|
||||||
_completed.Items.First().Title = title;
|
_completed.Items.First().Title = title;
|
||||||
@@ -350,14 +372,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
{
|
{
|
||||||
Mocker.GetMock<IRemotePathMappingService>()
|
Mocker.GetMock<IRemotePathMappingService>()
|
||||||
.Setup(v => v.RemapRemoteToLocal("127.0.0.1", It.IsAny<OsPath>()))
|
.Setup(v => v.RemapRemoteToLocal("127.0.0.1", It.IsAny<OsPath>()))
|
||||||
.Returns(new OsPath(@"O:\mymount\Droned.S01E01.Pilot.1080p.WEB-DL-DRONE".AsOsAgnostic()));
|
.Returns(new OsPath(@"O:\mymount\Droned.1998.1080p.WEB-DL-DRONE".AsOsAgnostic()));
|
||||||
|
|
||||||
GivenQueue(null);
|
GivenQueue(null);
|
||||||
GivenHistory(_completed);
|
GivenHistory(_completed);
|
||||||
|
|
||||||
var result = Subject.GetItems().Single();
|
var result = Subject.GetItems().Single();
|
||||||
|
|
||||||
result.OutputPath.Should().Be(@"O:\mymount\Droned.S01E01.Pilot.1080p.WEB-DL-DRONE".AsOsAgnostic());
|
result.OutputPath.Should().Be(@"O:\mymount\Droned.1998.1080p.WEB-DL-DRONE".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -386,23 +408,46 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
result.OutputPath.Should().Be(@"C:\sorted\somewhere\asdfasdf\asdfasdf.mkv".AsOsAgnostic());
|
result.OutputPath.Should().Be(@"C:\sorted\somewhere\asdfasdf\asdfasdf.mkv".AsOsAgnostic());
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestCase(@"Y:\nzbget\root", @"completed\downloads", @"vv", @"Y:\nzbget\root\completed\downloads\vv")]
|
[TestCase(@"Y:\nzbget\root", @"completed\downloads", @"vv", @"Y:\nzbget\root\completed\downloads", @"Y:\nzbget\root\completed\downloads\vv")]
|
||||||
[TestCase(@"Y:\nzbget\root", @"completed", @"vv", @"Y:\nzbget\root\completed\vv")]
|
[TestCase(@"Y:\nzbget\root", @"completed", @"vv", @"Y:\nzbget\root\completed", @"Y:\nzbget\root\completed\vv")]
|
||||||
[TestCase(@"/nzbget/root", @"completed/downloads", @"vv", @"/nzbget/root/completed/downloads/vv")]
|
[TestCase(@"/nzbget/root", @"completed/downloads", @"vv", @"/nzbget/root/completed/downloads", @"/nzbget/root/completed/downloads/vv")]
|
||||||
[TestCase(@"/nzbget/root", @"completed", @"vv", @"/nzbget/root/completed/vv")]
|
[TestCase(@"/nzbget/root", @"completed", @"vv", @"/nzbget/root/completed", @"/nzbget/root/completed/vv")]
|
||||||
public void should_return_status_with_outputdir(string rootFolder, string completeDir, string categoryDir, string expectedDir)
|
public void should_return_status_with_outputdir_for_version_lt_2(string rootFolder, string completeDir, string categoryDir, string fullCompleteDir, string fullCategoryDir)
|
||||||
{
|
{
|
||||||
|
_fullStatus.CompleteDir = null;
|
||||||
_queued.DefaultRootFolder = rootFolder;
|
_queued.DefaultRootFolder = rootFolder;
|
||||||
_config.Misc.complete_dir = completeDir;
|
_config.Misc.complete_dir = completeDir;
|
||||||
_config.Categories.First().Dir = categoryDir;
|
_config.Categories.First().Dir = categoryDir;
|
||||||
|
|
||||||
|
GivenVersion("1.2.1");
|
||||||
GivenQueue(null);
|
GivenQueue(null);
|
||||||
|
|
||||||
var result = Subject.GetStatus();
|
var result = Subject.GetStatus();
|
||||||
|
|
||||||
result.IsLocalhost.Should().BeTrue();
|
result.IsLocalhost.Should().BeTrue();
|
||||||
result.OutputRootFolders.Should().NotBeNull();
|
result.OutputRootFolders.Should().NotBeNull();
|
||||||
result.OutputRootFolders.First().Should().Be(expectedDir);
|
result.OutputRootFolders.First().Should().Be(fullCategoryDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase(@"Y:\nzbget\root", @"completed\downloads", @"vv", @"Y:\nzbget\root\completed\downloads", @"Y:\nzbget\root\completed\downloads\vv")]
|
||||||
|
[TestCase(@"Y:\nzbget\root", @"completed", @"vv", @"Y:\nzbget\root\completed", @"Y:\nzbget\root\completed\vv")]
|
||||||
|
[TestCase(@"/nzbget/root", @"completed/downloads", @"vv", @"/nzbget/root/completed/downloads", @"/nzbget/root/completed/downloads/vv")]
|
||||||
|
[TestCase(@"/nzbget/root", @"completed", @"vv", @"/nzbget/root/completed", @"/nzbget/root/completed/vv")]
|
||||||
|
public void should_return_status_with_outputdir_for_version_gte_2(string rootFolder, string completeDir, string categoryDir, string fullCompleteDir, string fullCategoryDir)
|
||||||
|
{
|
||||||
|
_fullStatus.CompleteDir = fullCompleteDir;
|
||||||
|
_queued.DefaultRootFolder = null;
|
||||||
|
_config.Misc.complete_dir = completeDir;
|
||||||
|
_config.Categories.First().Dir = categoryDir;
|
||||||
|
|
||||||
|
GivenVersion("2.0.0beta1");
|
||||||
|
GivenQueue(null);
|
||||||
|
|
||||||
|
var result = Subject.GetStatus();
|
||||||
|
|
||||||
|
result.IsLocalhost.Should().BeTrue();
|
||||||
|
result.OutputRootFolders.Should().NotBeNull();
|
||||||
|
result.OutputRootFolders.First().Should().Be(fullCategoryDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -450,5 +495,73 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||||||
result.IsValid.Should().BeTrue();
|
result.IsValid.Should().BeTrue();
|
||||||
result.HasWarnings.Should().BeTrue();
|
result.HasWarnings.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_test_success_if_tv_sorting_disabled()
|
||||||
|
{
|
||||||
|
_config.Misc.enable_tv_sorting = false;
|
||||||
|
_config.Misc.tv_categories = null;
|
||||||
|
|
||||||
|
var result = new NzbDroneValidationResult(Subject.Test());
|
||||||
|
|
||||||
|
result.IsValid.Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_test_failed_if_tv_sorting_null()
|
||||||
|
{
|
||||||
|
_config.Misc.enable_tv_sorting = true;
|
||||||
|
_config.Misc.tv_categories = null;
|
||||||
|
|
||||||
|
var result = new NzbDroneValidationResult(Subject.Test());
|
||||||
|
|
||||||
|
result.IsValid.Should().BeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_test_failed_if_tv_sorting_empty()
|
||||||
|
{
|
||||||
|
_config.Misc.enable_tv_sorting = true;
|
||||||
|
_config.Misc.tv_categories = new string[0];
|
||||||
|
|
||||||
|
var result = new NzbDroneValidationResult(Subject.Test());
|
||||||
|
|
||||||
|
result.IsValid.Should().BeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_test_success_if_tv_sorting_contains_different_category()
|
||||||
|
{
|
||||||
|
_config.Misc.enable_tv_sorting = true;
|
||||||
|
_config.Misc.tv_categories = new[] { "tv-custom" };
|
||||||
|
|
||||||
|
var result = new NzbDroneValidationResult(Subject.Test());
|
||||||
|
|
||||||
|
result.IsValid.Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_test_failed_if_tv_sorting_contains_category()
|
||||||
|
{
|
||||||
|
_config.Misc.enable_tv_sorting = true;
|
||||||
|
_config.Misc.tv_categories = new[] { "tv" };
|
||||||
|
|
||||||
|
var result = new NzbDroneValidationResult(Subject.Test());
|
||||||
|
|
||||||
|
result.IsValid.Should().BeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_test_failed_if_tv_sorting_default_category()
|
||||||
|
{
|
||||||
|
Subject.Definition.Settings.As<SabnzbdSettings>().TvCategory = null;
|
||||||
|
|
||||||
|
_config.Misc.enable_tv_sorting = true;
|
||||||
|
_config.Misc.tv_categories = new[] { "Default" };
|
||||||
|
|
||||||
|
var result = new NzbDroneValidationResult(Subject.Test());
|
||||||
|
|
||||||
|
result.IsValid.Should().BeFalse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-21
@@ -55,9 +55,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -68,14 +68,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
GivenTvDirectory();
|
GivenTvDirectory();
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
Mocker.GetMock<ITransmissionProxy>()
|
Mocker.GetMock<ITransmissionProxy>()
|
||||||
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/sonarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/radarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -84,14 +84,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
GivenTvCategory();
|
GivenTvCategory();
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
Mocker.GetMock<ITransmissionProxy>()
|
Mocker.GetMock<ITransmissionProxy>()
|
||||||
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/transmission/sonarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/transmission/radarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -102,14 +102,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
|
|
||||||
_transmissionConfigItems["download-dir"] += "/";
|
_transmissionConfigItems["download-dir"] += "/";
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
Mocker.GetMock<ITransmissionProxy>()
|
Mocker.GetMock<ITransmissionProxy>()
|
||||||
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/transmission/sonarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/transmission/radarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -117,9 +117,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
@@ -132,10 +132,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.DownloadUrl = magnetUrl;
|
remoteMovie.Release.DownloadUrl = magnetUrl;
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().Be(expectedHash);
|
id.Should().Be(expectedHash);
|
||||||
}
|
}
|
||||||
@@ -145,8 +145,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
[TestCase(TransmissionTorrentStatus.Check, DownloadItemStatus.Downloading)]
|
[TestCase(TransmissionTorrentStatus.Check, DownloadItemStatus.Downloading)]
|
||||||
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Queued)]
|
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Queued)]
|
||||||
[TestCase(TransmissionTorrentStatus.Downloading, DownloadItemStatus.Downloading)]
|
[TestCase(TransmissionTorrentStatus.Downloading, DownloadItemStatus.Downloading)]
|
||||||
[TestCase(TransmissionTorrentStatus.SeedingWait, DownloadItemStatus.Completed)]
|
[TestCase(TransmissionTorrentStatus.SeedingWait, DownloadItemStatus.Downloading)]
|
||||||
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Completed)]
|
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Downloading)]
|
||||||
public void GetItems_should_return_queued_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
public void GetItems_should_return_queued_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
||||||
{
|
{
|
||||||
_queued.Status = apiStatus;
|
_queued.Status = apiStatus;
|
||||||
@@ -160,7 +160,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
|
|
||||||
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Queued)]
|
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Queued)]
|
||||||
[TestCase(TransmissionTorrentStatus.Downloading, DownloadItemStatus.Downloading)]
|
[TestCase(TransmissionTorrentStatus.Downloading, DownloadItemStatus.Downloading)]
|
||||||
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Completed)]
|
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Downloading)]
|
||||||
public void GetItems_should_return_downloading_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
public void GetItems_should_return_downloading_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
||||||
{
|
{
|
||||||
_downloading.Status = apiStatus;
|
_downloading.Status = apiStatus;
|
||||||
@@ -205,7 +205,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
{
|
{
|
||||||
GivenTvCategory();
|
GivenTvCategory();
|
||||||
|
|
||||||
_downloading.DownloadDir = @"C:/Downloads/Finished/transmission/sonarr";
|
_downloading.DownloadDir = @"C:/Downloads/Finished/transmission/radarr";
|
||||||
|
|
||||||
GivenTorrents(new List<TransmissionTorrent>
|
GivenTorrents(new List<TransmissionTorrent>
|
||||||
{
|
{
|
||||||
@@ -224,7 +224,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
{
|
{
|
||||||
GivenTvDirectory();
|
GivenTvDirectory();
|
||||||
|
|
||||||
_downloading.DownloadDir = @"C:/Downloads/Finished/sonarr/subdir";
|
_downloading.DownloadDir = @"C:/Downloads/Finished/radarr/subdir";
|
||||||
|
|
||||||
GivenTorrents(new List<TransmissionTorrent>
|
GivenTorrents(new List<TransmissionTorrent>
|
||||||
{
|
{
|
||||||
|
|||||||
+9
-9
@@ -229,9 +229,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -253,10 +253,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.DownloadUrl = magnetUrl;
|
remoteMovie.Release.DownloadUrl = magnetUrl;
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().Be(expectedHash);
|
id.Should().Be(expectedHash);
|
||||||
}
|
}
|
||||||
@@ -351,9 +351,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests
|
|||||||
GivenRedirectToMagnet();
|
GivenRedirectToMagnet();
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -364,9 +364,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests
|
|||||||
GivenRedirectToTorrent();
|
GivenRedirectToTorrent();
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class VuzeFixture : TransmissionFixtureBase<Vuze>
|
public class VuzeFixture : TransmissionFixtureBase<Vuze>
|
||||||
{
|
{
|
||||||
|
[SetUp]
|
||||||
|
public void Setup_Vuze()
|
||||||
|
{
|
||||||
|
// Vuze never sets isFinished.
|
||||||
|
_completed.IsFinished = false;
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void queued_item_should_have_required_properties()
|
public void queued_item_should_have_required_properties()
|
||||||
{
|
{
|
||||||
@@ -57,9 +64,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
}
|
}
|
||||||
@@ -70,14 +77,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
GivenTvDirectory();
|
GivenTvDirectory();
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
Mocker.GetMock<ITransmissionProxy>()
|
Mocker.GetMock<ITransmissionProxy>()
|
||||||
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/sonarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/radarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -86,14 +93,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
GivenTvCategory();
|
GivenTvCategory();
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
Mocker.GetMock<ITransmissionProxy>()
|
Mocker.GetMock<ITransmissionProxy>()
|
||||||
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/transmission/sonarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/transmission/radarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -104,14 +111,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
|
|
||||||
_transmissionConfigItems["download-dir"] += "/";
|
_transmissionConfigItems["download-dir"] += "/";
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
Mocker.GetMock<ITransmissionProxy>()
|
Mocker.GetMock<ITransmissionProxy>()
|
||||||
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/transmission/sonarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
.Verify(v => v.AddTorrentFromData(It.IsAny<byte[]>(), @"C:/Downloads/Finished/transmission/radarr", It.IsAny<TransmissionSettings>()), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -119,9 +126,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().NotBeNullOrEmpty();
|
id.Should().NotBeNullOrEmpty();
|
||||||
|
|
||||||
@@ -134,10 +141,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
{
|
{
|
||||||
GivenSuccessfulDownload();
|
GivenSuccessfulDownload();
|
||||||
|
|
||||||
var remoteEpisode = CreateRemoteEpisode();
|
var remoteMovie = CreateRemoteMovie();
|
||||||
remoteEpisode.Release.DownloadUrl = magnetUrl;
|
remoteMovie.Release.DownloadUrl = magnetUrl;
|
||||||
|
|
||||||
var id = Subject.Download(remoteEpisode);
|
var id = Subject.Download(remoteMovie);
|
||||||
|
|
||||||
id.Should().Be(expectedHash);
|
id.Should().Be(expectedHash);
|
||||||
}
|
}
|
||||||
@@ -147,8 +154,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
[TestCase(TransmissionTorrentStatus.Check, DownloadItemStatus.Downloading)]
|
[TestCase(TransmissionTorrentStatus.Check, DownloadItemStatus.Downloading)]
|
||||||
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Queued)]
|
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Queued)]
|
||||||
[TestCase(TransmissionTorrentStatus.Downloading, DownloadItemStatus.Downloading)]
|
[TestCase(TransmissionTorrentStatus.Downloading, DownloadItemStatus.Downloading)]
|
||||||
[TestCase(TransmissionTorrentStatus.SeedingWait, DownloadItemStatus.Completed)]
|
[TestCase(TransmissionTorrentStatus.SeedingWait, DownloadItemStatus.Downloading)]
|
||||||
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Completed)]
|
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Downloading)]
|
||||||
public void GetItems_should_return_queued_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
public void GetItems_should_return_queued_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
||||||
{
|
{
|
||||||
_queued.Status = apiStatus;
|
_queued.Status = apiStatus;
|
||||||
@@ -162,7 +169,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
|
|
||||||
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Queued)]
|
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Queued)]
|
||||||
[TestCase(TransmissionTorrentStatus.Downloading, DownloadItemStatus.Downloading)]
|
[TestCase(TransmissionTorrentStatus.Downloading, DownloadItemStatus.Downloading)]
|
||||||
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Completed)]
|
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Downloading)]
|
||||||
public void GetItems_should_return_downloading_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
public void GetItems_should_return_downloading_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus)
|
||||||
{
|
{
|
||||||
_downloading.Status = apiStatus;
|
_downloading.Status = apiStatus;
|
||||||
@@ -177,7 +184,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
[TestCase(TransmissionTorrentStatus.Stopped, DownloadItemStatus.Completed, false)]
|
[TestCase(TransmissionTorrentStatus.Stopped, DownloadItemStatus.Completed, false)]
|
||||||
[TestCase(TransmissionTorrentStatus.CheckWait, DownloadItemStatus.Downloading, true)]
|
[TestCase(TransmissionTorrentStatus.CheckWait, DownloadItemStatus.Downloading, true)]
|
||||||
[TestCase(TransmissionTorrentStatus.Check, DownloadItemStatus.Downloading, true)]
|
[TestCase(TransmissionTorrentStatus.Check, DownloadItemStatus.Downloading, true)]
|
||||||
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Completed, true)]
|
[TestCase(TransmissionTorrentStatus.Queued, DownloadItemStatus.Queued, true)]
|
||||||
[TestCase(TransmissionTorrentStatus.SeedingWait, DownloadItemStatus.Completed, true)]
|
[TestCase(TransmissionTorrentStatus.SeedingWait, DownloadItemStatus.Completed, true)]
|
||||||
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Completed, true)]
|
[TestCase(TransmissionTorrentStatus.Seeding, DownloadItemStatus.Completed, true)]
|
||||||
public void GetItems_should_return_completed_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus, bool expectedReadOnly)
|
public void GetItems_should_return_completed_item_as_downloadItemStatus(TransmissionTorrentStatus apiStatus, DownloadItemStatus expectedItemStatus, bool expectedReadOnly)
|
||||||
@@ -207,7 +214,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
{
|
{
|
||||||
GivenTvCategory();
|
GivenTvCategory();
|
||||||
|
|
||||||
_downloading.DownloadDir = @"C:/Downloads/Finished/transmission/sonarr";
|
_downloading.DownloadDir = @"C:/Downloads/Finished/transmission/radarr";
|
||||||
|
|
||||||
GivenTorrents(new List<TransmissionTorrent>
|
GivenTorrents(new List<TransmissionTorrent>
|
||||||
{
|
{
|
||||||
@@ -226,7 +233,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
{
|
{
|
||||||
GivenTvDirectory();
|
GivenTvDirectory();
|
||||||
|
|
||||||
_downloading.DownloadDir = @"C:/Downloads/Finished/sonarr/subdir";
|
_downloading.DownloadDir = @"C:/Downloads/Finished/radarr/subdir";
|
||||||
|
|
||||||
GivenTorrents(new List<TransmissionTorrent>
|
GivenTorrents(new List<TransmissionTorrent>
|
||||||
{
|
{
|
||||||
@@ -294,7 +301,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_have_correct_output_directory()
|
public void should_have_correct_output_directory_for_multifile_torrents()
|
||||||
{
|
{
|
||||||
WindowsOnly();
|
WindowsOnly();
|
||||||
|
|
||||||
@@ -311,5 +318,25 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
items.First().OutputPath.Should().Be(@"C:\Downloads\" + _title);
|
items.First().OutputPath.Should().Be(@"C:\Downloads\" + _title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_have_correct_output_directory_for_singlefile_torrents()
|
||||||
|
{
|
||||||
|
WindowsOnly();
|
||||||
|
|
||||||
|
var fileName = _title + ".mkv";
|
||||||
|
_downloading.Name = fileName;
|
||||||
|
_downloading.DownloadDir = @"C:/Downloads";
|
||||||
|
|
||||||
|
GivenTorrents(new List<TransmissionTorrent>
|
||||||
|
{
|
||||||
|
_downloading
|
||||||
|
});
|
||||||
|
|
||||||
|
var items = Subject.GetItems().ToList();
|
||||||
|
|
||||||
|
items.Should().HaveCount(1);
|
||||||
|
items.First().OutputPath.Should().Be(@"C:\Downloads\" + fileName);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,22 +20,18 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
|
|||||||
public class AddFixture : CoreTest<PendingReleaseService>
|
public class AddFixture : CoreTest<PendingReleaseService>
|
||||||
{
|
{
|
||||||
private DownloadDecision _temporarilyRejected;
|
private DownloadDecision _temporarilyRejected;
|
||||||
private Series _series;
|
private Movie _movie;
|
||||||
private Episode _episode;
|
|
||||||
private Profile _profile;
|
private Profile _profile;
|
||||||
private ReleaseInfo _release;
|
private ReleaseInfo _release;
|
||||||
private ParsedEpisodeInfo _parsedEpisodeInfo;
|
private ParsedMovieInfo _parsedMovieInfo;
|
||||||
private RemoteEpisode _remoteEpisode;
|
private RemoteMovie _remoteMovie;
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void Setup()
|
public void Setup()
|
||||||
{
|
{
|
||||||
_series = Builder<Series>.CreateNew()
|
_movie = Builder<Movie>.CreateNew()
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
_episode = Builder<Episode>.CreateNew()
|
|
||||||
.Build();
|
|
||||||
|
|
||||||
_profile = new Profile
|
_profile = new Profile
|
||||||
{
|
{
|
||||||
Name = "Test",
|
Name = "Test",
|
||||||
@@ -48,32 +44,27 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
_series.Profile = new LazyLoaded<Profile>(_profile);
|
_movie.Profile = new LazyLoaded<Profile>(_profile);
|
||||||
|
|
||||||
_release = Builder<ReleaseInfo>.CreateNew().Build();
|
_release = Builder<ReleaseInfo>.CreateNew().Build();
|
||||||
|
|
||||||
_parsedEpisodeInfo = Builder<ParsedEpisodeInfo>.CreateNew().Build();
|
_parsedMovieInfo = Builder<ParsedMovieInfo>.CreateNew().Build();
|
||||||
_parsedEpisodeInfo.Quality = new QualityModel(Quality.HDTV720p);
|
_parsedMovieInfo.Quality = new QualityModel(Quality.HDTV720p);
|
||||||
|
|
||||||
_remoteEpisode = new RemoteEpisode();
|
_remoteMovie = new RemoteMovie();
|
||||||
_remoteEpisode.Episodes = new List<Episode>{ _episode };
|
_remoteMovie.Movie = _movie;
|
||||||
_remoteEpisode.Series = _series;
|
_remoteMovie.ParsedMovieInfo = _parsedMovieInfo;
|
||||||
_remoteEpisode.ParsedEpisodeInfo = _parsedEpisodeInfo;
|
_remoteMovie.Release = _release;
|
||||||
_remoteEpisode.Release = _release;
|
|
||||||
|
|
||||||
_temporarilyRejected = new DownloadDecision(_remoteEpisode, new Rejection("Temp Rejected", RejectionType.Temporary));
|
_temporarilyRejected = new DownloadDecision(_remoteMovie, new Rejection("Temp Rejected", RejectionType.Temporary));
|
||||||
|
|
||||||
Mocker.GetMock<IPendingReleaseRepository>()
|
Mocker.GetMock<IPendingReleaseRepository>()
|
||||||
.Setup(s => s.All())
|
.Setup(s => s.All())
|
||||||
.Returns(new List<PendingRelease>());
|
.Returns(new List<PendingRelease>());
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesService>()
|
Mocker.GetMock<IMovieService>()
|
||||||
.Setup(s => s.GetSeries(It.IsAny<int>()))
|
.Setup(s => s.GetMovie(It.IsAny<int>()))
|
||||||
.Returns(_series);
|
.Returns(_movie);
|
||||||
|
|
||||||
Mocker.GetMock<IParsingService>()
|
|
||||||
.Setup(s => s.GetEpisodes(It.IsAny<ParsedEpisodeInfo>(), _series, true, null))
|
|
||||||
.Returns(new List<Episode> {_episode});
|
|
||||||
|
|
||||||
Mocker.GetMock<IPrioritizeDownloadDecision>()
|
Mocker.GetMock<IPrioritizeDownloadDecision>()
|
||||||
.Setup(s => s.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>()))
|
.Setup(s => s.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>()))
|
||||||
@@ -89,7 +80,7 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
|
|||||||
|
|
||||||
var heldReleases = Builder<PendingRelease>.CreateListOfSize(1)
|
var heldReleases = Builder<PendingRelease>.CreateListOfSize(1)
|
||||||
.All()
|
.All()
|
||||||
.With(h => h.SeriesId = _series.Id)
|
.With(h => h.MovieId = _movie.Id)
|
||||||
.With(h => h.Title = title)
|
.With(h => h.Title = title)
|
||||||
.With(h => h.Release = release)
|
.With(h => h.Release = release)
|
||||||
.Build();
|
.Build();
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user