1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-04-19 21:46:50 -04:00

Compare commits

...

273 Commits

Author SHA1 Message Date
Devin Buhl 0d1150d4d2 Wait 5 seconds before getting the next 35 movies from TMDb using X-RateLimit-Remaining (#647)
* Wait 5 seconds before getting the next 35 movies from TMDb using X-RateLimit-Remaining

* Update SkyHookProxy.cs
2017-02-07 16:55:57 -05:00
Devin Buhl 1f68b46575 Correct the Kickass migration (#649) 2017-02-07 16:36:35 -05:00
Devin Buhl 32c5c4d741 Update notif list warning when importing from a list (#648) 2017-02-07 16:29:12 -05:00
Devin Buhl 0cb15121e5 Fix movies not showing up in Queue when downloading (#640) 2017-02-07 03:03:15 -05:00
Devin Buhl 808033a01c Fixed Movie link in history tab (#637) 2017-02-06 20:57:53 -05:00
Devin Buhl 736e0d2e70 Clean up download clients to use radarr as label, fix hoduken, and blackhole. (#635)
* change default label to radarr for rtorrent

* change utorrent default label to radarr

* change hadoken to use radarr label

* change blackhole default to radarr, update hoduken

* Episodes don't work, but it needs to be here

* Fix blackhole xD
2017-02-06 19:51:30 -05:00
Devin Buhl 96741570c5 Use Movie Name-TmdbId for slug, update toUrlSlug (#629) 2017-02-06 17:01:02 -05:00
Devin Buhl 8feb3fee98 Removed Wombles and Kickass, updated torrentpotato and torznab (#625)
* Remove Wombles and kickass

* Clean up TorrentPotato Request Gen

* Opps, we need to use SupportedMovieSearchParameters xD

* Consistancy

* Clean up Newznab Request Gen, add year to search if cannot use IMDB

* Added SpecialCharRegex to remove \ / : &
2017-02-06 16:34:11 -05:00
Abzie 07e3e44a68 Various ui text fixes (#620)
* Fix notification text on rename

* Fixed profile tooltip for minimum sizes

* Updated link to now point to Radarr's FAQ

* Revert "Updated link to now point to Radarr's FAQ"

This reverts commit 726e0cc870.

Revert 726e0cc

* Fixed: Updated link to now point to Radarr's FAQ
2017-02-06 13:58:24 -05:00
vertigo235 d67d405024 Delay Profile: Fix for when preferred words is null. (#618) 2017-02-06 14:07:17 +01:00
Devin Buhl 520836f475 Merge pull request #598 from vertigo235/delay-profile-patch
Delay Profile: Upgradable Check Fix
2017-02-05 15:58:49 -05:00
vertigo235 6d6bf1044b preferredcount -> preferredCount 2017-02-05 15:45:09 -05:00
vertigo235 195866f3aa Delay Profile: Require preferred word to skip delay. 2017-02-05 14:09:22 -05:00
schumi2004 10f0be0708 fix ical ics file (#603) 2017-02-05 20:04:38 +01:00
Leonardo Galli 721773ef68 Fixed issue where quality weight was mapped wrongly. Fixes #597 2017-02-05 20:00:41 +01:00
vertigo235 0d647ffb9a Delay Profile: Delay for at least 1 preferred word 2017-02-04 02:26:11 -05:00
vertigo235 b6235e99c8 Delay Profile: Upgradable Check Fix
Only do the upgradable file check if there are exisitng files.
2017-02-04 01:07:26 -05:00
Devin Buhl 1d0a6af7d7 Merge pull request #587 from Radarr/patch/preferred-tags-info
Added 'Case Insensitive.' to preferred tags info to help-inline
2017-02-03 02:30:19 -05:00
Devin Buhl efd7af165c Added 'Case Insensitive.' to preferred tags info to help-inline 2017-02-03 01:11:01 -05:00
Leonardo Galli 3f4ee6d841 Runtime error fix. 2017-02-02 18:18:02 +01:00
Leonardo Galli 55c437d980 Fix runtime issues.
Fixes #275 and #577
2017-02-02 17:35:00 +01:00
Leonardo Galli ecfe103c50 Fix glaringly obvious mistake that caused RSS Sync to fail.
Fixes #580
2017-02-02 17:29:49 +01:00
Devin Buhl a282ad7809 Merge pull request #573 from Radarr/patch/more-trakt-options
Added more options to trakt, popular movies, upcoming, anticipated etc..
2017-02-01 19:06:05 -05:00
Devin Buhl 64176b8d26 Added more options to trakt, popular movies, upcoming, anticipated etc.. 2017-02-01 18:49:40 -05:00
Devin Buhl 278fb298b6 Merge pull request #571 from Radarr/patch/settings-branch-warning
Add warning for docker users when switching branch
2017-02-01 17:45:32 -05:00
Devin Buhl 1d1b88cf05 Add warning for docker users when switching branch 2017-02-01 17:33:37 -05:00
Chris Allen 0c50aa7872 Add plain "ES" audioProfile. (#569) 2017-02-01 23:13:48 +01:00
Leonardo Galli 0bfa01f072 Fix delay specification when delay is not set to zero
Fixes #410
2017-02-01 18:58:06 +01:00
Chris Allen 3e9594f069 Use shorter format Profile string. (#561) 2017-02-01 11:22:28 +01:00
Chris Allen a07138680b Use movieFile instead of episodeFile. (#560) 2017-02-01 10:44:41 +01:00
Chris Allen 5f6f2f2859 Add expanded DTS audio codecs to FileNameBuilder and fix up Atmos TrueHD audioCodec string. (#559)
* Add DTS-ES, DTS-HD HRA, DTS-HD MA, DTS-X to audioCodec.

* Cleanup "Atmos / TrueHD" audioCodec string.
2017-02-01 10:22:33 +01:00
Tim Turner e185ba0191 Don't display mapped movies in import list
When importing existing movies, don't list those which already exist in the collection.
2017-01-31 15:11:33 -05:00
Tim Turner 3ab0b17379 Fix Delete modal when adding movie 2017-01-31 10:32:12 -05:00
Leonardo Galli 942d97931e Delete files now works. Fixes #127 2017-01-31 14:34:35 +01:00
Leonardo Galli 40809f1d91 First pass regarding delete. 2017-01-31 13:45:20 +01:00
Leonardo Galli f6a37186aa Fix error for movies with less than 4 characters. Fixes #507 2017-01-31 13:12:32 +01:00
Devin Buhl 9522bf3095 Merge pull request #532 from Radarr/patch/add-import-from-list-back
add importfromlist abck
2017-01-30 17:30:02 -05:00
Devin Buhl c3c7387390 add importfromlist abck 2017-01-30 17:21:56 -05:00
Devin Buhl 09fb58c3e9 Merge pull request #531 from Radarr/patch/fix-filter-movie-list
Fix the filter modes on the movie list xD
2017-01-30 17:07:24 -05:00
Devin Buhl 3d33e630ec Fix the filter modes on the movie list xD 2017-01-30 17:00:52 -05:00
Devin Buhl b51916fb2b Merge pull request #530 from Radarr/patch/ptp-updates
updates to ptp, and using caching for cookie
2017-01-30 16:46:14 -05:00
Devin Buhl c9ee92cc30 updates to ptp, and using caching for cookie 2017-01-30 16:35:12 -05:00
Leonardo Galli 0e81416c2f Fix issues with different languages than english when adding alternative titles.
Fixes #509
2017-01-30 17:29:42 +01:00
Devin Buhl 6cd7d46208 Merge pull request #528 from Radarr/patch/passthepopcorn-username-etc
Use username, password and passkey for passthepopcorn
2017-01-30 01:54:09 -05:00
Devin Buhl 6af6da16b4 Use username, password and passkey for passthepopcorn 2017-01-30 01:48:28 -05:00
Devin Buhl 4c5900373d Merge pull request #517 from Radarr/patch/update-qualities
Patch/update qualities
2017-01-29 16:14:54 -05:00
Tim Turner 2fd167c446 Merged branch patch/update-qualities into patch/update-qualities 2017-01-29 16:08:18 -05:00
Tim Turner 31149aeed9 Ensure qualities don't overflow profile card 2017-01-29 16:08:14 -05:00
Devin Buhl 977b87cbf3 migration migraine-tion 2017-01-29 16:07:30 -05:00
Tim Turner 42ed4ff48a Update Fetch List button style
Let's make it not look sad and disabled
2017-01-29 15:53:30 -05:00
Devin Buhl 060c71f439 migration 2017-01-29 15:49:32 -05:00
Devin Buhl 63527858e7 Merge branch 'develop' into patch/update-qualities 2017-01-29 15:47:26 -05:00
Devin Buhl 2f4ea9cac7 migration 2017-01-29 15:47:08 -05:00
Devin Buhl a1f2369306 Update the regex in Parser, Add workprint and telesync, change R5 to regional allow for R[0-9]{1}, changed the weights 2017-01-29 14:22:04 -05:00
Tim Turner a35c5f79c1 Set Drone Factory Interval default to 0 (#515)
Fixes #447
2017-01-29 14:09:54 -05:00
Devin Buhl d382e15749 Merge pull request #504 from Radarr/patch/trakt-integrations
Added options for watched, and watchlist, and customlist to trakt
2017-01-28 21:27:51 -05:00
Devin Buhl 5b7d513986 Added options for watched, and watchlist, and customlist to trakt 2017-01-28 21:17:55 -05:00
Devin Buhl be083cfd53 Merge pull request #500 from Radarr/patch/net-import-changes
Patch/net import changes
2017-01-28 17:35:09 -05:00
Devin Buhl f9844c284a Merge pull request #487 from mitchellcash/port_validation
Fixed: Proper port validation for download clients and connections
2017-01-28 17:32:49 -05:00
Devin Buhl e8065d07b3 Make year nullable for trakt 2017-01-28 17:27:53 -05:00
Devin Buhl 8a0820ad1e make year nullable, and rmember the profileid 2017-01-28 17:14:51 -05:00
Devin Buhl 8274cc016f Merge pull request #499 from Radarr/patch/hdbits
Update HDBits to work with Radarr
2017-01-28 16:52:36 -05:00
Devin Buhl b88281b458 Update HDBits to work with Radarr 2017-01-28 16:46:54 -05:00
Devin Buhl a1cb5eb420 Merge pull request #497 from Radarr/feature/net-import
Feature/net import
2017-01-28 15:39:08 -05:00
Devin Buhl d458c4ecc8 update taskscheduler when config is saved with netimportsynccommand 2017-01-28 15:30:46 -05:00
Devin Buhl b6e4f53597 Make NetImport sync interval work (needs some testing) 2017-01-28 14:59:21 -05:00
Leonardo Galli 4abbf55ee4 Merge Develop into Net-Import 2017-01-28 20:32:57 +01:00
Tim Turner 1fd909cff6 Net Import UI Updates
- Change name to "StevenLu" to fix
- Hide header on New List modal
- Show "Import Selected" only after a list has been fetched
2017-01-28 13:27:54 -05:00
Tim Turner 7ca53d1073 Only show "Display Existing Movies" toggle after selecting a folder 2017-01-28 12:16:50 -05:00
vertigo235 2bda0f700c Update Synology Indexer For Movies (#486) 2017-01-28 18:13:10 +01:00
vertigo235 16b2cc49d4 Allow Duplicate Preferred Words (#484)
Allows you to weigh certain words more heavily. 

ex. This, This, That = This > That
2017-01-28 18:13:01 +01:00
Tim Turner e3e67d1098 Clean up settings UI 2017-01-28 12:03:45 -05:00
Leonardo Galli 3276e3ec52 Fix for movies without an imdbid. Fixes 176 2017-01-28 17:54:19 +01:00
Leonardo Galli 5e9a79afe8 Quality of an existing movie file can now be edited. 2017-01-28 17:35:51 +01:00
Leonardo Galli c6912a193c Fix recognition of 4k Movies upon import. 2017-01-28 16:24:21 +01:00
Leonardo Galli 47083e6be1 This should hopefully fix the error that decisions were not ordered correctly and therefore just the first release was grabbed. 2017-01-28 16:18:44 +01:00
Leonardo Galli ca78cc5c3c Remove confusing warning about file not being loaded. 2017-01-28 16:01:30 +01:00
Tim Turner 76db305ffa Add movie year to NotificationService (#496) 2017-01-28 09:42:37 -05:00
Tim Turner 5d2ef4786b Revert "Merge branch 'rename-existing-folder' into develop"
This reverts commit a340bc4da3, reversing
changes made to 4be7772d53.
2017-01-28 06:49:02 -05:00
Tim Turner 9953a5ed06 Revert "Add movie year to NotificationService (#489)"
This reverts commit e2d6e39168.
2017-01-28 06:33:15 -05:00
Tim Turner dd194d41be Revert "Ensure the movie isn't delete when the folder isn't renamed (#491)"
This reverts commit 8168cf82c5.
2017-01-28 06:29:58 -05:00
Tim Turner 8168cf82c5 Ensure the movie isn't delete when the folder isn't renamed (#491) 2017-01-27 21:24:01 -05:00
Tim Turner e2d6e39168 Add movie year to NotificationService (#489) 2017-01-27 20:32:16 -05:00
Tim Turner a340bc4da3 Merge branch 'rename-existing-folder' into develop 2017-01-27 19:31:55 -05:00
Tim Turner 4bcb0e17f8 Merge branch 'develop' into rename-existing-folder 2017-01-27 19:31:39 -05:00
Tim Turner 25a51df894 Merge FileNameBuilder 2017-01-27 19:31:37 -05:00
Tim Turner f9c6ffcdaa merge from Develop 2017-01-27 19:31:03 -05:00
Mark McDowall b76c54ceac Fixed: Proper port validation for download clients and connections 2017-01-28 09:26:47 +10:00
vertigo235 4be7772d53 Kodi Update Fix: OldFiles -> OldMovieFiles (#483) 2017-01-27 20:34:52 +01:00
Leonardo Galli cbc70a8ff3 Added option to specify preferred words in quality profile. (#462)
* UI Done

* Should theoretically work.

* Preferred tags works now correctly :)
2017-01-27 20:01:28 +01:00
Leonardo Galli dd8af0ad8c Manual Import works now!
Also fixed a few bugs.
2017-01-27 19:36:25 +01:00
vertigo235 00541e6cc1 More Notification Updates (#482)
* Custom Script: Add Movie_Path

* Add Emby Update Support

* Notifications: Maybe add Kodi / XBMC Update Support
2017-01-27 19:01:18 +01:00
Tim Turner a8eec60c9d Remove old folder and all contents 2017-01-26 19:57:31 -05:00
Tim Turner 7bb319b6d6 Update Files tab when movie renamed 2017-01-26 19:16:19 -05:00
Tim Turner 50a5a2de9b Movie reference properly updates UI now
Still need to fix the 'Files' tab to be updated
2017-01-26 17:58:19 -05:00
Devin Buhl dbe5946d10 Only wanted is default for CP 2017-01-26 17:31:27 -05:00
Devin Buhl d5caac5d3b make DVDR not unlimited 2017-01-26 17:10:08 -05:00
vertigo235 487c5e22ce Moviefile, what movie file? (#466)
Send the moviefile object.
2017-01-26 21:46:55 +01:00
vertigo235 6efd63a292 Remove mofilefile id for now (#464) 2017-01-26 21:13:27 +01:00
Devin Buhl f31dc3c054 Update weights 2017-01-26 14:53:43 -05:00
Devin Buhl c60be3a467 Added new qualities, added new qualities to profile class.
Left to do: write migration, and tests
2017-01-26 14:43:24 -05:00
Leonardo Galli 44b4e71c05 Manual importing almost done. Needs fixing for mapping movies. 2017-01-26 14:21:35 +01:00
Devin Buhl 5ebd035b1c Merge pull request #460 from vertigo235/notifications
Download Movie Quality & Formatting
2017-01-25 21:36:25 -05:00
vertigo235 d50514f8bc Download Movie Quality & Formatting
Fix downloaded movie quality and add space between movie name and quality.
2017-01-25 21:19:59 -05:00
Tim Turner 7da2183080 Be more proper about Ensuring the folder exists
Still need a way to tell the UI model to update itself
2017-01-25 20:11:02 -05:00
Devin Buhl a417ac2716 Merge pull request #459 from jrdnlc/develop
Update GeneralViewTemplate.hbs
2017-01-25 19:59:50 -05:00
Jordan a89e662721 Update GeneralViewTemplate.hbs
Updated Wiki link to Radarr
2017-01-25 16:34:35 -08:00
Tim Turner 72aac6e551 Update Rename Preview to support folder renaming 2017-01-25 19:03:40 -05:00
Devin Buhl 4b1e4eecfb Merge pull request #456 from Radarr/patch/lang
Change lang in UI to what profile / lang they choose when they add a …
2017-01-25 18:07:26 -05:00
Devin Buhl 8e452f8b6d Change lang in UI to what profile / lang they choose when they add a movie 2017-01-25 18:00:46 -05:00
Devin Buhl 7e6db89eff Merge pull request #454 from vertigo235/notifications
Custom Script Fix: Parse movie not episode
2017-01-25 17:02:33 -05:00
vertigo235 16214e666b Custom Script Fix: Parse movie not episode 2017-01-25 16:55:36 -05:00
Devin Buhl 2b25ce237f Merge pull request #448 from hotio/patch-1
Fixes issue #447 (Notification Icon for Join)
2017-01-25 11:55:31 -05:00
Devin Buhl f0a9955447 Merge pull request #450 from Radarr/patch/ahd
only use internal for RSS Sync
2017-01-25 11:55:19 -05:00
Devin Buhl d0439296fe only use internal for RSS Sync 2017-01-25 11:40:04 -05:00
Devin Buhl e2c2bdb65b nullable all the fields.. 2017-01-25 11:35:10 -05:00
Devin Buhl bc3fdb0f80 Merge pull request #449 from Radarr/patch/ahd
include only internal for AHD
2017-01-25 11:31:04 -05:00
Devin Buhl 186b2ada36 include only internal for AHD 2017-01-25 11:24:20 -05:00
Devin Buhl 577125f345 Merge pull request #435 from vertigo235/notifications
Notification Fixes/Updates
2017-01-25 10:56:11 -05:00
hotio 687dd8a05f Update JoinProxy.cs 2017-01-25 16:54:57 +01:00
hotio 81861c6121 Fixes issue #447 (Notification Icon for Join) 2017-01-25 16:50:38 +01:00
Devin Buhl 302462f48c Merge pull request #441 from schumi2004/rss-sync
fix new rss-sync threshold
2017-01-25 06:22:48 -05:00
schumi2004 d132f55830 fix new rss-sync threshold 2017-01-25 10:52:29 +01:00
vertigo235 6bbd64e59a Update Plex Movie Sections 2017-01-24 21:32:20 -05:00
vertigo235 290c4e1f2e Update slack for movies. 2017-01-24 17:56:10 -05:00
Devin Buhl 1112616514 Merge pull request #434 from Radarr/patch/dumb-metadata-erros
"fixed" error message
2017-01-24 17:35:27 -05:00
Devin Buhl 7fddbca4b7 "fixed" error message 2017-01-24 17:29:07 -05:00
Tim Turner 692841478c Add link to Activity -> History Tab (#408)
Fixes #365
2017-01-24 16:12:58 -05:00
Tim Turner 23232b9830 Allow renaming of movies that don't have an "Edition" (#432)
Fixes #405
2017-01-24 16:08:06 -05:00
Leonardo Galli b886566b25 Update README.md 2017-01-24 21:30:24 +01:00
Devin Buhl 2c56d60678 #292 - Allow longer threshold for RSS Sync (#428)
* #292 - Allow longer threshold for RSS Sync

Update RSS Sync interval default to 60 minutes, and don't allow values below 60 or higher than 720 minutes (12 hours)

* allow minimum of 10 mintes
2017-01-24 21:26:51 +01:00
hotio a0c8127ecf Update to favicon section, according to (#416)
* Update to favicon section, according to

http://realfavicongenerator.net/

* Windows start not as expected

* re-add msapplication-navbutton-color
2017-01-24 21:23:42 +01:00
Devin Buhl 05f61df59e update default sort order (#429)
#426
2017-01-24 21:16:22 +01:00
Devin Buhl a0b80ad41a Add year to search (#425)
#417
2017-01-24 20:17:35 +01:00
vertigo235 9e7cb708bf Initial Notification Updates and Support (#401)
* Bare bones of notifications working.

* Add MovieDownload event handler

To allow Download notificaitons

* Update pushover text to indicate movie

* Initial Notification Support

On Download and On Grab notifications should work.

* Telegram Notification Text

* Update Custom Script For Movies

* Update PP script WiKi page

Also added wiki page to Radarr wiki.
2017-01-24 20:17:24 +01:00
Devin Buhl 95d97c59d7 rephrase wording 2017-01-24 13:47:44 -05:00
Devin Buhl a75f3e1f8e monitored to false for movies already downloaded on CP 2017-01-24 13:42:27 -05:00
Devin Buhl d09d30544f allow null value for seed time. 2017-01-24 13:22:02 -05:00
Leonardo Galli 1ad4006819 Fixes an issue where movies with (year) at the beginning were recognized with a title of "(" 2017-01-24 10:02:20 +01:00
Devin Buhl 43d904d20b added trakt user list importing 2017-01-23 18:06:42 -05:00
Leonardo Galli 5339f8efdc Blind fix to support seperator in movie tags. 2017-01-23 22:34:16 +01:00
Leonardo Galli b273bfb10e Fix issue with certain audio streams. Should fix #404 2017-01-23 22:04:49 +01:00
Devin Buhl 244e82722d Merged branch feature/net-import into feature/net-import 2017-01-23 15:18:13 -05:00
Devin Buhl e182d8b964 fix importing for StevenLu 2017-01-23 15:18:04 -05:00
Leonardo Galli 02e610a5f2 Merged branch feature/net-import into feature/net-import 2017-01-23 20:52:05 +01:00
Leonardo Galli 032bc2d5c4 Add basic ui of manual import. 2017-01-23 20:51:33 +01:00
Devin Buhl e59db74cad Add StevenLu to csproj 2017-01-23 14:39:27 -05:00
Leonardo Galli fbe9ad6582 First pass at ui for manually importing from lists. 2017-01-23 20:00:31 +01:00
Devin Buhl 87da542758 Add import from http://movies.stevenlu.com/ 2017-01-23 12:54:31 -05:00
Leonardo Galli b2317ada1f Add {Tags} to renaming options 2017-01-23 18:52:27 +01:00
Leonardo Galli 336aee7fda Fix when libgdiplus isn't present. 2017-01-23 18:42:05 +01:00
Leonardo Galli 9e7468d723 Merged branch develop into develop 2017-01-23 16:09:19 +01:00
Leonardo Galli f05ee13206 Fix issue where monitored movies were still downloaded. Fixes #326 2017-01-23 16:09:11 +01:00
Leonardo Galli 8b3b46b724 Added easy to use List Selection for manual import use later. The place where this resides will change. 2017-01-23 16:04:52 +01:00
Leonardo Galli 80e53f209d Movies can now be added monitored or unmonitored. 2017-01-23 15:31:09 +01:00
Leonardo Galli 82f29cdc70 Add Ability to set RootFolderPath for Net Import List
Fixed other things. Finished command to automatically add a movie.
2017-01-23 15:21:49 +01:00
Leonardo Galli 93d6505f85 Fix netimport search and add NetImportSyncCommand 2017-01-23 14:04:01 +01:00
Devin Buhl 2b7afd3272 remove duplicate code 2017-01-23 00:29:31 -05:00
Devin Buhl 6d4e1f6c2e fix movies being clobbered when a new list is sent thru 2017-01-22 23:23:51 -05:00
Devin Buhl 2b579eb0d3 Merge pull request #385 from hotio/ui-logos
Ui logos
2017-01-22 23:21:23 -05:00
Devin Buhl c0f323b05a Implement NetImportSearchService
check it out
2017-01-22 23:20:12 -05:00
hotio 791121fa06 Proper ico and favicon 2017-01-22 23:32:01 +01:00
Leonardo Galli f25d4463f5 Merged branch feature/net-import into feature/net-import 2017-01-22 23:11:38 +01:00
Leonardo Galli f0bcb27beb Fixes issue when multiple audio channels are present. Fixes #315 Fixes #294 2017-01-22 23:11:05 +01:00
Leonardo Galli 00099a5e40 Added Base URL 2017-01-22 23:09:07 +01:00
Leonardo Galli 7c251157ed Fix media info parsing of multiple audio channels. Fixes #315 Fixes #294 2017-01-22 23:03:47 +01:00
Tim Turner ec6b389d75 Fix duplicate key prefixing 2017-01-22 16:59:53 -05:00
Tim Turner f38430d632 Update localstorage key prefixes 2017-01-22 16:24:22 -05:00
Tim Turner 266f28883a Prefix localstorage keys with "Radarr"
Updates #285
2017-01-22 15:54:41 -05:00
hotio cc3c2533fa Updated ico files 2017-01-22 21:31:20 +01:00
hotio f8162b34f2 Update UI logos 2017-01-22 21:07:12 +01:00
Devin Buhl 3ff5b36d29 Add urlBase option to CP settings 2017-01-22 14:53:21 -05:00
Leonardo Galli 1fa736c6d8 Fixed styling. Fixed definitions not being returned. 2017-01-22 19:52:25 +01:00
hotio 309877bf76 Optimized logo (#375)
* Optimized logo
Inkscape compatible SVG Honeycomb is slightly different)
File size optimized PNG's (446kB->163kB)

* Use Sonarr honeycomb and proper id's for future use
New png's included

* And final fixes are done
2017-01-22 13:33:33 -05:00
Leonardo Galli a50b20a397 Set update interval to 30 minutes if on nightly 2017-01-22 18:24:47 +01:00
Leonardo Galli de5489ae9a Merged branch develop into develop 2017-01-22 18:18:26 +01:00
Leonardo Galli 12e74aa38b Change Forms Auth Cookie. Fixes #285 2017-01-22 18:18:15 +01:00
Leonardo Galli 94eccc6c14 Rethought about where certain things are stored.
Profiles are now a component of the NetImportDefinition.
2017-01-22 17:02:20 +01:00
Tim Turner 80ec66b47c Prefix Keys with "Radarr"
Makes progress on #285
2017-01-22 10:09:10 -05:00
Leonardo Galli 9fffcfaea3 Fix stuff regarding the ordering of Fields. 2017-01-22 15:08:25 +01:00
Leonardo Galli f481676c81 Fix migration to include ConfigContract and EnableAuto. Also fixed redirects on lists.
Please delete NetImport Table and the corresponding VersionInfo Row (123)
2017-01-22 14:55:25 +01:00
Leonardo Galli 76a42b28f3 Second UI Pass, Testing now works and other little things. 2017-01-22 14:30:33 +01:00
Leonardo Galli ad26e48408 Fix up presets. 2017-01-22 14:03:09 +01:00
Leonardo Galli 0bab97e02f Make presets work for RSS Import :) 2017-01-22 13:44:03 +01:00
Leonardo Galli 2413457323 Add CP list class. 2017-01-22 13:34:03 +01:00
Devin Buhl 585fd87ad6 Merge pull request #378 from Radarr/patch/add-more-filters
Add more filter options to movie list
2017-01-22 05:38:21 -05:00
Devin Buhl ec5161e848 Add more filter options to movie list 2017-01-22 04:58:04 -05:00
Devin Buhl 0ec54daaff Merge pull request #373 from baltoaca/develop
search selected button in wanted tab works
2017-01-21 19:27:00 -05:00
Devin Buhl bfcd05206f migration migrainetion 2017-01-21 19:25:28 -05:00
Devin Buhl ddf10ed137 Added couchpotato, and added a test 2017-01-21 19:15:06 -05:00
Tim Turner 3ed1bebb7d Fix #228 - Fix Drone Factory interval input not saving 2017-01-21 18:06:10 -05:00
Devin Buhl b4d1c0e053 couchpotato API classes 2017-01-21 17:24:21 -05:00
Tim Turner 68f58fb37d Undo unecessary changes 2017-01-21 17:22:21 -05:00
Tim Turner f9923f4592 Move folder on rename; event doesn't fire yet 2017-01-21 17:20:30 -05:00
Vlad Ilies 29ae088a3d search selected button in wanted tab works
* switched MoviesSearchCommand to a list of id's

* adapted the MovieSearchService

* adapted UI files to use the new command
2017-01-21 23:43:58 +02:00
Leonardo Galli dd553b9439 WIP UI Update for adding lists. 2017-01-21 22:13:55 +01:00
Leonardo Galli 451f2d30e4 Merged branch develop into feature/net-import 2017-01-21 21:28:44 +01:00
Leonardo Galli 463d85e479 Basis of UI Update. 2017-01-21 21:28:14 +01:00
Leonardo Galli 2c52795822 Add base for netimport api. Still nothing on the UI side. 2017-01-21 21:09:02 +01:00
Leonardo Galli 4f37a36619 Updated HttpNetImporterBase. Still needs work to correctly handle failures. 2017-01-21 20:57:29 +01:00
Leonardo Galli 5aaba98c57 Imdbid parsing works now from url 2017-01-21 20:37:08 +01:00
Leonardo Galli a98b69859c Big Abstraction for IMDBWatchlist -> RSSImport (With a test) 2017-01-21 20:29:31 +01:00
Leonardo Galli 734a36de06 Added some abstraction for settings. 2017-01-21 18:42:58 +01:00
Leonardo Galli eb299ce847 Fix Corruped Media Cover Images. 2017-01-21 12:57:04 +01:00
Leonardo Galli a7e071318b Update README.md 2017-01-21 10:47:11 +01:00
Leonardo Galli 3d67f6237e Should fix 4K releases not getting parsed. 2017-01-21 00:39:44 +01:00
Krystian Charubin a691ffa7b7 adds 'Movie Title, The' filename option (#359)
* adds 'Movie Title, The' filename option
* updates the FileNameBuilder.MovieTitleRegex to include new format
2017-01-20 17:42:14 -05:00
Leonardo Galli aa9537c201 Fix issue when movie file is null. 2017-01-20 20:30:36 +01:00
Leonardo Galli a3d9fb1c20 Should fix upgrading of existing movie files. 2017-01-20 18:26:18 +01:00
Leonardo Galli 62a1e70c86 Add tests for 4K quality. 2017-01-20 18:21:31 +01:00
Leonardo Galli 93d0d21846 Hopefully a fix for corrupt media covers. 2017-01-20 18:06:58 +01:00
Leonardo Galli b1c5a3ac14 Fixed blacklist being ignored by download decision maker. 2017-01-20 17:48:47 +01:00
vertigo235 55a525ba2f Add helptext to nzbget "add paused" settings. (#363)
Requires nzbget 16 or greater.
2017-01-20 09:14:15 -05:00
Devin Buhl a53768463b Merge pull request #358 from Radarr/patch/add-year-to-search
add year to search
2017-01-19 20:07:33 -05:00
Tim Turner 24cbd6bcef Fix issue with reimporting on movie fresh (#357)
Fixes #314. Still have multiple movieFiles issue to clean up.
2017-01-19 19:58:57 -05:00
Devin Buhl 3ab3e66853 Add year to quick search results 2017-01-19 19:56:26 -05:00
Leonardo Galli 40ca469339 Update MovieModule 2017-01-20 00:00:12 +01:00
Tim Turner 2cbd2f719f Merge branch 'develop' of https://github.com/Radarr/Radarr into develop 2017-01-19 16:45:39 -05:00
Tim Turner 53cbfa803b Fix MediaCoversUpdatedEvent broadcast
Cleans exception when updating media covers expects a series Id.
2017-01-19 16:45:29 -05:00
Leonardo Galli c0b0310bbd Update ISSUE_TEMPLATE.md 2017-01-19 22:10:59 +01:00
Devin Buhl 30e50062a8 Merge pull request #352 from baltoaca/develop
bug fix for 15 movie wanted tab limit
2017-01-19 13:17:40 -05:00
Vlad Ilies 85fd8f2c65 bug fix for 15 movie wanted tab (#348) 2017-01-19 20:08:15 +02:00
Leonardo Galli f72b042d5d Blacklisting works now. 2017-01-19 17:43:23 +01:00
Leonardo Galli 2d3a3a0677 Update sizing information in settings tab. 2017-01-19 17:40:25 +01:00
Tim Turner 2bb21fedab Update height of posters to accomodate additional labels 2017-01-18 17:24:32 -05:00
vertigo235 91c820f98b Fix pushover priority values. 2017-01-18 23:16:57 +01:00
Leonardo Galli 7d3118aece Hopefully fix issue when importing
existing scene named movies
2017-01-18 23:02:05 +01:00
Tim Turner 4f4ad77ad1 Add download status to poster view
Fixes #319
2017-01-18 16:54:17 -05:00
Leonardo Galli 42f205a731 Update SkyHookProxy.cs 2017-01-18 22:50:12 +01:00
Devin Buhl cbb2b778a6 Merge pull request #336 from Radarr/patch/add-imdb-to-naming
Add IMDb ID to file naming
2017-01-18 15:11:16 -05:00
Devin Buhl b3e03a648d Add IMDb ID to file naming 2017-01-18 14:53:29 -05:00
Devin Buhl acf45a79e8 Merge pull request #333 from baltoaca/develop
basic implementation of the wanted tab
2017-01-18 14:36:48 -05:00
Devin Buhl b5d8ac852e Merge pull request #335 from Radarr/patch/task-updates
Turn off scene mapping task #329, update TaskManager to use 'DownloadedMovieScanCommand
2017-01-18 14:36:29 -05:00
Vlad Ilies 4aec0e8fc6 fixed build 2017-01-18 21:09:00 +02:00
Devin Buhl ecea417fd8 Revert DownloadedMovieScanCommand to DownloadedEpisodesScanCommand
Not sure if it will break anything so putting it back.
2017-01-18 14:07:51 -05:00
Devin Buhl 6a41f6a435 Turn off scene mapping task #329, update TaskManager to use 'DownloadedMovieScanCommand' 2017-01-18 14:02:04 -05:00
Vlad Ilies da2d075aa8 basic implementation of the wanted tab (#31)
* top buttons don't yet work

* new missing module for movies

*  find missing movies method to movie service

* new movie status cell with text

* adapted UI missing collection and layout
2017-01-18 20:53:17 +02:00
Devin Buhl 10dc3993df Merge pull request #332 from Radarr/revert-318-sonarr/sqlite-updates
Revert "Sonarr/sqlite updates"
2017-01-18 13:33:46 -05:00
Devin Buhl 7e5020db9a Merge pull request #331 from vertigo235/nzbgetaddpaused
Nzbgetaddpaused
2017-01-18 13:20:12 -05:00
Devin Buhl c48fe9de12 Revert "Sonarr/sqlite updates" 2017-01-18 13:17:35 -05:00
vertigo235 421e827a95 Update Test Files for AddPaused to NZBGET 2017-01-18 13:08:59 -05:00
vertigo235 34d8045cf4 Add "Add Paused" option for NZBGET downloader
Adds option to pause nzbs uppon sending to NZBGET downloader.
2017-01-18 12:42:33 -05:00
Devin Buhl b02944a3b2 Added Qualties to Settings 2017-01-17 20:30:21 -05:00
Devin Buhl c6de163748 Merge pull request #318 from Radarr/sonarr/sqlite-updates
Sonarr/sqlite updates
2017-01-17 18:59:11 -05:00
Keivan Beigi d9e2b22e74 Upgraded System.Data.SQLite to 1.0.104.0 2017-01-17 18:45:23 -05:00
Keivan Beigi 65c0137964 Revert "Upgraded System.Data.SQLite to 1.0.104.0"
This reverts commit a6f3ac219d61964f1b923cfd89382f94c4c74243.
2017-01-17 18:44:37 -05:00
Keivan ae19424ce7 New: Upgraded SQLite binares for macOS
Upgraded from 3.8.1 to 3.9.1
2017-01-17 18:41:11 -05:00
Keivan Beigi 7527ec52b7 New: Upgraded SQLite binaries for Windows (3.16.0) 2017-01-17 18:41:05 -05:00
Leonardo Galli 640fcf3eaf Remove series references 2017-01-17 23:57:04 +01:00
Leonardo Galli 3ce8232777 Hopefully fix download ordering. 2017-01-17 23:30:11 +01:00
Devin Buhl 864b441d8e Merge pull request #316 from Radarr/patch/skyhook-cleanup
Maybe this will solve the error Object reference not set to an instance of an object
2017-01-17 17:20:49 -05:00
Devin Buhl bc2ff149b4 Maybe this will solve the error
Couldn't refresh info for [tt2032572][USS Indianapolis: Men of Courage]: Object reference not set to an instance of an object
2017-01-17 17:05:19 -05:00
Devin Buhl dea305e921 Fix Issue when adding some movies. 2017-01-17 22:25:49 +01:00
Leonardo Galli e2eab31548 Hopefully fix RSSSync 2017-01-17 21:22:51 +01:00
Devin Buhl fe62e18f0d Merge pull request #308 from Radarr/patch/jackett
Fix publish date for jackett #239
2017-01-17 13:56:47 -05:00
Devin Buhl f1fa1553cf Merge pull request #307 from aenima99x/aenima99x-issue91
Fix: Issue #91 - "Search All Missing" wording
2017-01-17 13:48:30 -05:00
Devin Buhl b576ae813d Fix publish date #239 2017-01-17 13:47:11 -05:00
Aenima99x 99123be936 Fix: Issue #91 - "Search All Missing" wording 2017-01-17 09:00:56 -08:00
Leonardo Galli dd0a033b0f Add Support for changing file date to either cinema or physical release.
Fixes #124
2017-01-17 15:02:48 +01:00
Leonardo Galli c64597c9f1 Fix for movies with . in title when importing them. Fixes #268 2017-01-17 14:47:23 +01:00
Leonardo Galli 6d2f81e3ed Remove - as replacement for : 2017-01-17 14:28:30 +01:00
Leonardo Galli 4263808360 Fix only one movie showing. Fix more button not showing up. 2017-01-17 13:21:40 +01:00
Leonardo Galli c5ca2babf7 Updated website and donation links 2017-01-17 13:07:02 +01:00
Leonardo Galli 08db74d6e6 Fix Audiochannels just being added together. 2017-01-17 13:03:20 +01:00
Leonardo Galli b309a9b01f Change Scheduled Refresh Series to Refresh Movie. Fixes #301 2017-01-17 12:55:32 +01:00
Tim Turner 2730745607 Clean up rename preview & organize
Fixes #125, #129,

BE SURE TO RUN "Update Library" before renaming/organizing.
2017-01-16 18:43:32 -05:00
Tim Turner ae0df2aef0 Disambiguate Movie from Episode Renaming
Fixes #84
2017-01-16 17:12:27 -05:00
Devin Buhl 6878abe2a2 whoops, only parse title once 2017-01-15 15:35:38 -05:00
Devin Buhl ec1c81e3ed updates and compile-able 2017-01-15 15:28:35 -05:00
Devin Buhl 47824426c6 Merge branch 'develop' into feature/net-import 2017-01-15 11:14:42 -05:00
Devin Buhl 4ded288c5d few changes 2017-01-12 18:33:30 -05:00
Devin Buhl d123ca6063 updates 2017-01-11 16:12:17 -05:00
Devin Buhl 0ee8b75b54 initial autoimporter commit 2017-01-11 15:42:37 -05:00
376 changed files with 11236 additions and 4460 deletions
+2
View File
@@ -1,6 +1,8 @@
Please use the search bar and make sure you are not submitting an already submitted issue.
Provide a description of the feature request or bug, the more details the better.
When possible include a log!
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 48 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 811 B

After

Width:  |  Height:  |  Size: 701 B

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 11 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 17 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 22 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 37 KiB

+24 -571
View File
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 31 KiB

+23 -21
View File
@@ -12,7 +12,9 @@
| AppVeyor | [![AppVeyor](https://img.shields.io/appveyor/ci/galli-leo/Radarr/master.svg?maxAge=60&style=flat-square)](https://ci.appveyor.com/project/galli-leo/Radarr) | [![AppVeyor](https://img.shields.io/appveyor/ci/galli-leo/Radarr-usby1/develop.svg?maxAge=60&style=flat-square)](https://ci.appveyor.com/project/galli-leo/Radarr-usby1) |
| Travis | [![Travis](https://img.shields.io/travis/Radarr/Radarr/master.svg?maxAge=60&style=flat-square)](https://travis-ci.org/Radarr/Radarr) | [![Travis](https://img.shields.io/travis/Radarr/Radarr/develop.svg?maxAge=60&style=flat-square)](https://travis-ci.org/Radarr/Radarr) |
This fork of Sonarr aims to turn it into something like CouchPotato.
A fork of [Sonarr](https://github.com/Sonarr/Sonarr) to work with movies à la Couchpotato.
**This fork works independently of Sonarr and will not interfere with it.**
## Downloads
@@ -34,34 +36,34 @@ To connect to the UI, fire up your browser and open <http://localhost:7878> or <
## Features
### Currently Working
* Adding new movies
* Manually searching for releases of movies
* Automatically searching for releases
* Automatically importing downloaded movies
* Recognizing Special Editions, Director's Cut, etc.
* Identifying releases with hardcoded subs
* Rarbg.to, Torznab and Newznab Indexer
* QBittorrent and Deluge download client (Other clients are coming)
* New TorrentPotato Indexer (Works well with [Jackett](https://github.com/Jackett/Jackett))
### Planned Features
* Scanning PreDB to know when a new release is available
* Fixing the other Indexers and download clients
* Importing of Sonarr config
### Major Features
### Current Features
* Adding new movies with lots of information, such as trailers, ratings, etc.
* Support for major platforms: Windows, Linux, macOS, Raspberry Pi, etc.
* Can watch for better quality of the movies you have and do an automatic upgrade. *eg. from DVD to Blu-Ray*
* Automatic failed download handling will try another release if one fails
* Manual search so you can pick any release or to see why a release was not downloaded automatically
* Full integration with SABnzbd and NZBGet
* Full integration with Kodi, Plex (notification, library update, metadata)
* Automatically searching for releases as well as RSS Sync
* Automatically importing downloaded movies
* Recognizing Special Editions, Director's Cut, etc.
* Identifying releases with hardcoded subs
* All indexers supported by Sonarr also supported
* New PassThePopcorn Indexer
* QBittorrent, Deluge, rTorrent, Transmission and uTorrent download client (Other clients are coming)
* New TorrentPotato Indexer (Works well with [Jackett](https://github.com/Jackett/Jackett))
* And a beautiful UI
### Planned Features
* Scanning PreDB to know when a new release is available
* Fixing the other Indexers and download clients
* 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, metadata)
##Feature Requests
[![Feature Requests](http://feathub.com/Radarr/Radarr?format=svg)](http://feathub.com/Radarr/Radarr)
## Configuring Development Environment
### Requirements
@@ -64,6 +64,8 @@ namespace NzbDrone.Api.Authentication
new DefaultHmacProvider(new PassphraseKeyGenerator(_configService.HmacPassphrase, Encoding.ASCII.GetBytes(_configService.HmacSalt)))
);
FormsAuthentication.FormsAuthenticationCookieName = "_ncfaradarr"; //For those people that both have sonarr and radarr.
FormsAuthentication.Enable(pipelines, new FormsAuthenticationConfiguration
{
RedirectUrl = _configFileProvider.UrlBase + "/login",
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NzbDrone.Api.Movie;
using NzbDrone.Api.REST;
using NzbDrone.Core.Qualities;
using NzbDrone.Api.Series;
@@ -11,13 +12,14 @@ namespace NzbDrone.Api.Blacklist
{
public int SeriesId { get; set; }
public List<int> EpisodeIds { get; set; }
public int MovieId { get; set; }
public string SourceTitle { get; set; }
public QualityModel Quality { get; set; }
public DateTime Date { get; set; }
public DownloadProtocol Protocol { get; set; }
public string Indexer { get; set; }
public string Message { get; set; }
public MovieResource Movie { get; set; }
public SeriesResource Series { get; set; }
}
@@ -30,7 +32,7 @@ namespace NzbDrone.Api.Blacklist
return new BlacklistResource
{
Id = model.Id,
MovieId = model.MovieId,
SeriesId = model.SeriesId,
EpisodeIds = model.EpisodeIds,
SourceTitle = model.SourceTitle,
@@ -39,7 +41,7 @@ namespace NzbDrone.Api.Blacklist
Protocol = model.Protocol,
Indexer = model.Indexer,
Message = model.Message,
Movie = model.Movie.ToResource(),
Series = model.Series.ToResource()
};
}
+19 -4
View File
@@ -1,11 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Newtonsoft.Json.Linq;
using NzbDrone.Common.EnsureThat;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Reflection;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Profiles;
namespace NzbDrone.Api.ClientSchema
{
@@ -73,14 +76,14 @@ namespace NzbDrone.Api.ClientSchema
if (propertyInfo.PropertyType == typeof(int))
{
var value = Convert.ToInt32(field.Value);
propertyInfo.SetValue(target, value, null);
var value = field.Value.ToString().ParseInt32();
propertyInfo.SetValue(target, value ?? 0, null);
}
else if (propertyInfo.PropertyType == typeof(long))
{
var value = Convert.ToInt64(field.Value);
propertyInfo.SetValue(target, value, null);
var value = field.Value.ToString().ParseInt64();
propertyInfo.SetValue(target, value ?? 0, null);
}
else if (propertyInfo.PropertyType == typeof(int?))
@@ -147,6 +150,18 @@ namespace NzbDrone.Api.ClientSchema
private static List<SelectOption> GetSelectOptions(Type selectOptions)
{
if (selectOptions == typeof(Profile))
{
return new List<SelectOption>();
}
if (selectOptions == typeof(Quality))
{
var qOptions = from Quality q in selectOptions.GetProperties(BindingFlags.Static | BindingFlags.Public)
select new SelectOption {Name = q.Name, Value = q.Id};
return qOptions.OrderBy(o => o.Value).ToList();
}
var options = from Enum e in Enum.GetValues(selectOptions)
select new SelectOption { Value = Convert.ToInt32(e), Name = e.ToString() };
@@ -0,0 +1,22 @@
using FluentValidation;
using NzbDrone.Api.Validation;
using NzbDrone.Core.Configuration;
namespace NzbDrone.Api.Config
{
public class NetImportConfigModule : NzbDroneConfigModule<NetImportConfigResource>
{
public NetImportConfigModule(IConfigService configService)
: base(configService)
{
SharedValidator.RuleFor(c => c.NetImportSyncInterval)
.IsValidNetImportSyncInterval();
}
protected override NetImportConfigResource ToResource(IConfigService model)
{
return NetImportConfigResourceMapper.ToResource(model);
}
}
}
@@ -0,0 +1,21 @@
using NzbDrone.Api.REST;
using NzbDrone.Core.Configuration;
namespace NzbDrone.Api.Config
{
public class NetImportConfigResource : RestResource
{
public int NetImportSyncInterval { get; set; }
}
public static class NetImportConfigResourceMapper
{
public static NetImportConfigResource ToResource(IConfigService model)
{
return new NetImportConfigResource
{
NetImportSyncInterval = model.NetImportSyncInterval
};
}
}
}
@@ -25,9 +25,9 @@ namespace NzbDrone.Api.Indexers
release.ReleaseWeight = initialWeight;
if (decision.RemoteEpisode.Series != null)
if (decision.RemoteMovie.Movie != null)
{
release.QualityWeight = decision.RemoteEpisode.Series
release.QualityWeight = decision.RemoteMovie.Movie
.Profile.Value
.Items.FindIndex(v => v.Quality == release.Quality.Quality) * 100;
}
+11 -11
View File
@@ -35,21 +35,21 @@ namespace NzbDrone.Api.EpisodeFiles
_seriesService = seriesService;
_qualityUpgradableSpecification = qualityUpgradableSpecification;
_logger = logger;
/*GetResourceById = GetEpisodeFile;
GetResourceAll = GetEpisodeFiles;
GetResourceById = GetMovieFile;
/*GetResourceAll = GetEpisodeFiles;
UpdateResource = SetQuality;*/
UpdateResource = SetQuality;
DeleteResource = DeleteEpisodeFile;
}
/*private EpisodeFileResource GetEpisodeFile(int id)
private MovieFileResource GetMovieFile(int id)
{
var episodeFile = _mediaFileService.Get(id);
var series = _seriesService.GetSeries(episodeFile.SeriesId);
var episodeFile = _mediaFileService.GetMovie(id);
return episodeFile.ToResource(series, _qualityUpgradableSpecification);
return episodeFile.ToResource();
}
private List<EpisodeFileResource> GetEpisodeFiles()
/*private List<EpisodeFileResource> GetEpisodeFiles()
{
if (!Request.Query.SeriesId.HasValue)
{
@@ -62,13 +62,13 @@ namespace NzbDrone.Api.EpisodeFiles
return _mediaFileService.GetFilesBySeries(seriesId).ConvertAll(f => f.ToResource(series, _qualityUpgradableSpecification));
}
private void SetQuality(EpisodeFileResource episodeFileResource)
*/
private void SetQuality(MovieFileResource episodeFileResource)
{
var episodeFile = _mediaFileService.Get(episodeFileResource.Id);
var episodeFile = _mediaFileService.GetMovie(episodeFileResource.Id);
episodeFile.Quality = episodeFileResource.Quality;
_mediaFileService.Update(episodeFile);
}*/
}
private void DeleteEpisodeFile(int id)
{
+1 -1
View File
@@ -12,7 +12,7 @@ namespace NzbDrone.Api.Movies
private readonly IRenameMovieFileService _renameMovieFileService;
public RenameMovieModule(IRenameMovieFileService renameMovieFileService)
: base("rename")
: base("renameMovie")
{
_renameMovieFileService = renameMovieFileService;
@@ -0,0 +1,34 @@
using System.Collections.Generic;
using System.Linq;
using Nancy;
using Nancy.Extensions;
using NzbDrone.Api.Extensions;
using NzbDrone.Api.Movie;
using NzbDrone.Core.MetadataSource;
using NzbDrone.Core.Tv;
namespace NzbDrone.Api.NetImport
{
public class ListImportModule : NzbDroneApiModule
{
private readonly IMovieService _movieService;
private readonly ISearchForNewMovie _movieSearch;
public ListImportModule(IMovieService movieService, ISearchForNewMovie movieSearch)
: base("/movie/import")
{
_movieService = movieService;
_movieSearch = movieSearch;
Put["/"] = Movie => SaveAll();
}
private Response SaveAll()
{
var resources = Request.Body.FromJson<List<MovieResource>>();
var Movies = resources.Select(MovieResource => _movieSearch.MapMovieToTmdbMovie(MovieResource.ToModel())).Where(m => m != null).DistinctBy(m => m.TmdbId).ToList();
return _movieService.AddMovies(Movies).ToResource().AsResponse(HttpStatusCode.Accepted);
}
}
}
@@ -0,0 +1,44 @@
using NzbDrone.Api.ClientSchema;
using NzbDrone.Core.NetImport;
using NzbDrone.Core.Profiles;
namespace NzbDrone.Api.NetImport
{
public class NetImportModule : ProviderModuleBase<NetImportResource, INetImport, NetImportDefinition>
{
private readonly IProfileService _profileService;
public NetImportModule(NetImportFactory indexerFactory, IProfileService profileService)
: base(indexerFactory, "netimport")
{
_profileService = profileService;
}
protected override void MapToResource(NetImportResource resource, NetImportDefinition definition)
{
base.MapToResource(resource, definition);
resource.Enabled = definition.Enabled;
resource.EnableAuto = definition.EnableAuto;
resource.ProfileId = definition.ProfileId;
resource.RootFolderPath = definition.RootFolderPath;
resource.ShouldMonitor = definition.ShouldMonitor;
}
protected override void MapToModel(NetImportDefinition definition, NetImportResource resource)
{
base.MapToModel(definition, resource);
definition.Enabled = resource.Enabled;
definition.EnableAuto = resource.EnableAuto;
definition.ProfileId = resource.ProfileId;
definition.RootFolderPath = resource.RootFolderPath;
definition.ShouldMonitor = resource.ShouldMonitor;
}
protected override void Validate(NetImportDefinition definition, bool includeWarnings)
{
if (!definition.Enable) return;
base.Validate(definition, includeWarnings);
}
}
}
@@ -0,0 +1,13 @@
using NzbDrone.Core.NetImport;
namespace NzbDrone.Api.NetImport
{
public class NetImportResource : ProviderResource
{
public bool Enabled { get; set; }
public bool EnableAuto { get; set; }
public bool ShouldMonitor { get; set; }
public string RootFolderPath { get; set; }
public int ProfileId { get; set; }
}
}
+8
View File
@@ -109,6 +109,8 @@
<Compile Include="ClientSchema\SelectOption.cs" />
<Compile Include="Commands\CommandModule.cs" />
<Compile Include="Commands\CommandResource.cs" />
<Compile Include="Config\NetImportConfigModule.cs" />
<Compile Include="Config\NetImportConfigResource.cs" />
<Compile Include="Extensions\AccessControlHeaders.cs" />
<Compile Include="Extensions\Pipelines\CorsPipeline.cs" />
<Compile Include="Extensions\Pipelines\RequestLoggingPipeline.cs" />
@@ -121,6 +123,9 @@
<Compile Include="Movies\RenameMovieModule.cs" />
<Compile Include="Movies\RenameMovieResource.cs" />
<Compile Include="Movies\MovieEditorModule.cs" />
<Compile Include="NetImport\ListImportModule.cs" />
<Compile Include="NetImport\NetImportModule.cs" />
<Compile Include="NetImport\NetImportResource.cs" />
<Compile Include="Parse\ParseModule.cs" />
<Compile Include="Parse\ParseResource.cs" />
<Compile Include="ManualImport\ManualImportModule.cs" />
@@ -234,6 +239,7 @@
<Compile Include="SeasonPass\SeasonPassResource.cs" />
<Compile Include="Series\AlternateTitleResource.cs" />
<Compile Include="Series\MovieFileResource.cs" />
<Compile Include="Series\FetchMovieListModule.cs" />
<Compile Include="Series\SeasonResource.cs" />
<Compile Include="SeasonPass\SeasonPassModule.cs" />
<Compile Include="Series\SeriesEditorModule.cs" />
@@ -254,12 +260,14 @@
<Compile Include="TinyIoCNancyBootstrapper.cs" />
<Compile Include="Update\UpdateModule.cs" />
<Compile Include="Update\UpdateResource.cs" />
<Compile Include="Validation\NetImportSyncIntervalValidator.cs" />
<Compile Include="Validation\RssSyncIntervalValidator.cs" />
<Compile Include="Validation\EmptyCollectionValidator.cs" />
<Compile Include="Validation\RuleBuilderExtensions.cs" />
<Compile Include="Wanted\CutoffModule.cs" />
<Compile Include="Wanted\LegacyMissingModule.cs" />
<Compile Include="Wanted\MissingModule.cs" />
<Compile Include="Wanted\MovieMissingModule.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
@@ -11,6 +11,7 @@ namespace NzbDrone.Api.Profiles
{
public string Name { get; set; }
public Quality Cutoff { get; set; }
public string PreferredTags { get; set; }
public List<ProfileQualityItemResource> Items { get; set; }
public Language Language { get; set; }
}
@@ -33,6 +34,7 @@ namespace NzbDrone.Api.Profiles
Name = model.Name,
Cutoff = model.Cutoff,
PreferredTags = model.PreferredTags != null ? string.Join(",", model.PreferredTags) : "",
Items = model.Items.ConvertAll(ToResource),
Language = model.Language
};
@@ -59,6 +61,7 @@ namespace NzbDrone.Api.Profiles
Name = resource.Name,
Cutoff = (Quality)resource.Cutoff.Id,
PreferredTags = resource.PreferredTags.Split(',').ToList(),
Items = resource.Items.ConvertAll(ToModel),
Language = resource.Language
};
@@ -38,8 +38,8 @@ namespace NzbDrone.Api.RootFolders
Id = resource.Id,
Path = resource.Path,
//FreeSpace
//UnmappedFolders
FreeSpace = resource.FreeSpace,
UnmappedFolders = resource.UnmappedFolders
};
}
@@ -0,0 +1,60 @@
using System.Collections.Generic;
using Nancy;
using NzbDrone.Api.Extensions;
using NzbDrone.Core.MediaCover;
using NzbDrone.Core.MetadataSource;
using System.Linq;
using NzbDrone.Core.NetImport;
namespace NzbDrone.Api.Movie
{
public class FetchMovieListModule : NzbDroneRestModule<MovieResource>
{
private readonly IFetchNetImport _fetchNetImport;
private readonly ISearchForNewMovie _movieSearch;
public FetchMovieListModule(IFetchNetImport netImport, ISearchForNewMovie movieSearch)
: base("/netimport/movies")
{
_fetchNetImport = netImport;
_movieSearch = movieSearch;
Get["/"] = x => Search();
}
private Response Search()
{
var results = _fetchNetImport.FetchAndFilter((int) Request.Query.listId, false);
List<Core.Tv.Movie> realResults = new List<Core.Tv.Movie>();
/*foreach (var movie in results)
{
var mapped = _movieSearch.MapMovieToTmdbMovie(movie);
if (mapped != null)
{
realResults.Add(mapped);
}
}*/
return MapToResource(results).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;
}
}
}
}
+3 -1
View File
@@ -202,6 +202,8 @@ namespace NzbDrone.Api.Movie
//if (mappings == null) return;
//Not necessary anymore
//resource.AlternateTitles = mappings.Select(v => new AlternateTitleResource { Title = v.Title, SeasonNumber = v.SeasonNumber, SceneSeasonNumber = v.SceneSeasonNumber }).ToList();
}
@@ -239,7 +241,7 @@ namespace NzbDrone.Api.Movie
public void Handle(MediaCoversUpdatedEvent message)
{
//BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
BroadcastResourceChange(ModelAction.Updated, message.Movie.Id);
}
}
}
+1 -1
View File
@@ -236,7 +236,7 @@ namespace NzbDrone.Api.Series
public void Handle(MediaCoversUpdatedEvent message)
{
BroadcastResourceChange(ModelAction.Updated, message.Series.Id);
//BroadcastResourceChange(ModelAction.Updated, message.Series.Id);
}
}
}
@@ -0,0 +1,34 @@
using FluentValidation.Validators;
namespace NzbDrone.Api.Validation
{
public class NetImportSyncIntervalValidator : PropertyValidator
{
public NetImportSyncIntervalValidator()
: base("Must be between 10 and 1440 or 0 to disable")
{
}
protected override bool IsValid(PropertyValidatorContext context)
{
if (context.PropertyValue == null)
{
return true;
}
var value = (int)context.PropertyValue;
if (value == 0)
{
return true;
}
if (value >= 10 && value <= 1440)
{
return true;
}
return false;
}
}
}
@@ -5,7 +5,7 @@ namespace NzbDrone.Api.Validation
public class RssSyncIntervalValidator : PropertyValidator
{
public RssSyncIntervalValidator()
: base("Must be between 10 and 120 or 0 to disable")
: base("Must be between 10 and 720 or 0 to disable")
{
}
@@ -23,7 +23,7 @@ namespace NzbDrone.Api.Validation
return true;
}
if (value >= 10 && value <= 120)
if (value >= 10 && value <= 720)
{
return true;
}
@@ -36,5 +36,10 @@ namespace NzbDrone.Api.Validation
{
return ruleBuilder.SetValidator(new RssSyncIntervalValidator());
}
public static IRuleBuilderOptions<T, int> IsValidNetImportSyncInterval<T>(this IRuleBuilder<T, int> ruleBuilder)
{
return ruleBuilder.SetValidator(new NetImportSyncIntervalValidator());
}
}
}
+1 -1
View File
@@ -12,7 +12,7 @@ namespace NzbDrone.Api.Wanted
ISeriesService seriesService,
IQualityUpgradableSpecification qualityUpgradableSpecification,
IBroadcastSignalRMessage signalRBroadcaster)
: base(episodeService, seriesService, qualityUpgradableSpecification, signalRBroadcaster, "wanted/missing")
: base(episodeService, seriesService, qualityUpgradableSpecification, signalRBroadcaster, "wanted/missing_episodes")
{
GetResourcePaged = GetMissingEpisodes;
}
@@ -0,0 +1,77 @@
using NzbDrone.Api.Movie;
using NzbDrone.Api.Movies;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Datastore;
using NzbDrone.SignalR;
using NzbDrone.Core.Download;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events;
using System;
using NzbDrone.Core.Datastore.Events;
namespace NzbDrone.Api.Wanted
{
class MovieMissingModule : NzbDroneRestModuleWithSignalR<MovieResource, Core.Tv.Movie>,
IHandle<MovieGrabbedEvent>,
IHandle<MovieDownloadedEvent>
{
protected readonly IMovieService _movieService;
public MovieMissingModule(IMovieService movieService,
IQualityUpgradableSpecification qualityUpgradableSpecification,
IBroadcastSignalRMessage signalRBroadcaster)
: base(signalRBroadcaster, "wanted/missing")
{
_movieService = movieService;
GetResourcePaged = GetMissingMovies;
}
private PagingResource<MovieResource> GetMissingMovies(PagingResource<MovieResource> pagingResource)
{
var pagingSpec = pagingResource.MapToPagingSpec<MovieResource, Core.Tv.Movie>("physicalRelease", SortDirection.Descending);
if (pagingResource.FilterKey == "monitored" && pagingResource.FilterValue == "false")
{
pagingSpec.FilterExpression = v => v.Monitored == false;
}
else
{
pagingSpec.FilterExpression = v => v.Monitored == true;
}
var resource = ApplyToPage(_movieService.MoviesWithoutFiles, pagingSpec, v => MapToResource(v, false));
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);
}
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 81 KiB

@@ -32,7 +32,7 @@ namespace NzbDrone.Core.Test.Configuration
[Test]
public void Get_value_should_return_default_when_no_value()
{
Subject.RssSyncInterval.Should().Be(15);
Subject.RssSyncInterval.Should().Be(60);
}
[Test]
@@ -47,7 +47,7 @@ namespace NzbDrone.Core.Test.Configuration
public void get_value_with_out_persist_should_not_store_default_value()
{
var interval = Subject.RssSyncInterval;
interval.Should().Be(15);
interval.Should().Be(60);
Mocker.GetMock<IConfigRepository>().Verify(c => c.Insert(It.IsAny<Config>()), Times.Never());
}
@@ -196,18 +196,18 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Subject.IsSatisfiedBy(parseResultSingle, null).Accepted.Should().BeTrue();
}
[Test]
public void should_return_true_if_RAWHD()
{
parseResultSingle.ParsedEpisodeInfo.Quality = new QualityModel(Quality.RAWHD);
//[Test]
//public void should_return_true_if_RAWHD()
//{
// parseResultSingle.ParsedEpisodeInfo.Quality = new QualityModel(Quality.RAWHD);
series.Runtime = 45;
parseResultSingle.Series = series;
parseResultSingle.Series.SeriesType = SeriesTypes.Daily;
parseResultSingle.Release.Size = 8000.Megabytes();
// series.Runtime = 45;
// parseResultSingle.Series = series;
// parseResultSingle.Series.SeriesType = SeriesTypes.Daily;
// parseResultSingle.Release.Size = 8000.Megabytes();
Subject.IsSatisfiedBy(parseResultSingle, null).Accepted.Should().BeTrue();
}
// Subject.IsSatisfiedBy(parseResultSingle, null).Accepted.Should().BeTrue();
//}
[Test]
public void should_return_true_for_special()
@@ -92,14 +92,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
protected void GivenFailedDownload()
{
Mocker.GetMock<INzbgetProxy>()
.Setup(s => s.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>(), It.IsAny<NzbgetSettings>()))
.Setup(s => s.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>(), It.IsAny<bool>(), It.IsAny<NzbgetSettings>()))
.Returns((string)null);
}
protected void GivenSuccessfulDownload()
{
Mocker.GetMock<INzbgetProxy>()
.Setup(s => s.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>(), It.IsAny<NzbgetSettings>()))
.Setup(s => s.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>(), It.IsAny<bool>(), It.IsAny<NzbgetSettings>()))
.Returns(Guid.NewGuid().ToString().Replace("-", ""));
}
@@ -0,0 +1,449 @@
{
"movies": [
{
"status": "active",
"info": {
"rating": { "imdb": [ 8.1, 228515 ] },
"genres": [ "Action", "Adventure", "Fantasy", "Science Fiction", "Thriller", "War", "Sci-Fi" ],
"tmdb_id": 330459,
"plot": "A rogue band of resistance fighters unite for a mission to steal the Death Star plans and bring a new hope to the galaxy.",
"tagline": "A Rebellion Built on Hope",
"release_date": {
"dvd": 1461016800,
"expires": 1486410729,
"theater": 1453417200,
"bluray": true
},
"year": 2016,
"original_title": "Rogue One: A Star Wars Story",
"actor_roles": {
"Warwick Davis": "Bistan",
"Michael Giacchino": "Stormtrooper",
"Lex Lang": "Stormtrooper",
"Samuel Witwer": "Stormtrooper",
"Steen Young": "Vault Officer",
"Russell Balogh": "X-Wing Pilot",
"Alan Tudyk": "K-2SO",
"Angus Cook": "Mechanic",
"David Boat": "Stormtrooper",
"Kevin Hickman": "Stormtrooper",
"Aidan Cook": "Edrio Two Tubes",
"Valene Kane": "Lyra Erso",
"Simon Farnaby": "Blue Squadron",
"Donnie Yen": "Chirrut Imwe",
"Forest Whitaker": "Saw Gerrera",
"Jordan Stephens": "Corporal Tonc",
"Verona Blue": "Stormtrooper",
"David Sobolov": "Stormtrooper",
"Attila G. Kerekes": "Rebel Marine on Yavin",
"Ian McElhinney": "General Dodonna",
"John Gilroy": "Stormtrooper",
"Matthew Wood": "Stormtrooper",
"Jiang Wen": "Baze Malbus",
"Sharon Duncan-Brewster": "Senator Pamlo",
"Christopher Scarabosio": "Stormtrooper",
"Stephen Stanton": "Admiral Raddus (voice)",
"Andrew Zographos": "X-Wing Pilot",
"Ben Daniels": "General Merrick",
"James Arnold Taylor": "Stormtrooper",
"Robin Atkin Downes": "Stormtrooper",
"Guy Henry": "Grand Moff Tarkin",
"Mac Pietowski": "Commi Tech / Marine Soldier",
"James Earl Jones": "Darth Vader (voice)",
"Daniel Naprous": "Darth Vader",
"Geraldine James": "Blue Squadron",
"Eugene Byrd": "Stormtrooper",
"Michael Donovan": "Stormtrooper",
"Paul Kasey": "Admiral Raddus",
"Fred Tatasciore": "Stormtrooper",
"Vanessa Lengies": "Stormtrooper",
"Duncan Pow": "Sergeant Melshi",
"Dolly Gadsdon": "Younger Jyn (as Dolly Gadson)",
"David Acord": "Stormtrooper",
"Nick Kellington": "Bistan",
"Julian Stone": "Stormtrooper",
"Christian Simpson": "Stormtrooper",
"Alistair Petrie": "General Draven",
"Ariyon Bakare": "Blue Squadron",
"Drewe Henley": "Red Leader Garven Dreis",
"Ram Bergman": "Death Star technician",
"Anthony Daniels": "C-3PO",
"Derek Arnold": "Pao",
"Karen Huie": "Stormtrooper",
"Steve Bardrack": "Stormtrooper",
"Jonathan Aris": "Senator Jebel",
"Alexi Melvin": "Stormtroooper",
"Emeson Nwolie": "Personnel",
"Tyrone Love": "Rebel Marine Commander",
"John S. Schwartz": "Stormtrooper",
"Orly Schuchmacher": "Stormtrooper",
"Dave Filoni": "Stormtrooper",
"Yuri Lowenthal": "Stormtrooper",
"Mads Mikkelsen": "Galen Erso",
"Fares Fares": "Senator Vaspar",
"Ian Whyte": "Moroff",
"Genevieve O'Reilly": "Mon Mothma",
"Jorge Leon Martinez": "X-Wing Pilot",
"Beau Gadsdon": "Young Jyn",
"Katie Sheridan": "Stormtrooper",
"Michael Smiley": "Dr. Evazan",
"Babou Ceesay": "Lieutenant Sefla",
"Tom Harrison-Read": "Stormtrooper",
"Spencer Wilding": "Darth Vader",
"Tom Kane": "Stormtrooper",
"Riz Ahmed": "Bodhi Rook",
"Ingvild Deila": "Princess Leia",
"Tony Gilroy": "Stormtrooper",
"Felicity Jones": "Jyn Erso",
"Jonathan Dixon": "Stormtrooper",
"Angus MacInnes": "Gold Leader Dutch Vander",
"William M. Patrick": "Stormtroooper",
"Diego Luna": "Captain Cassian Andor",
"Sam Hanover": "Imperial Officer",
"Jimmy Smits": "Bail Organa",
"Ned Dennehy": "Prisoner",
"Rian Johnson": "Death Star Technician",
"Jimmy Vee": "R2-D2",
"David Cowgill": "Stormtrooper",
"Vanessa Marshall": "Stormtrooper",
"Terri Douglas": "Stormtrooper",
"David Ankrum": "Wedge Antilles",
"Flora Miller": "Stormtroooper",
"Steve Blum": "Stormtrooper",
"Ben Mendelsohn": "Director Orson Krennic"
},
"via_imdb": true,
"images": {
"disc_art": [],
"poster": [ "https://images-na.ssl-images-amazon.com/images/M/MV5BMjEwMzMxODIzOV5BMl5BanBnXkFtZTgwNzg3OTAzMDI@._V1_SX300.jpg" ],
"backdrop": [ "https://image.tmdb.org/t/p/w1280/tZjVVIYXACV4IIIhXeIM59ytqwS.jpg" ],
"extra_thumbs": [],
"poster_original": [ "https://image.tmdb.org/t/p/original/qjiskwlV1qQzRCjpV0cL9pEMF9a.jpg" ],
"actors": {
"Warwick Davis": "https://image.tmdb.org/t/p/w185/5xBunTQJexQOuCmtlh8MNJerbaM.jpg",
"Michael Giacchino": "https://image.tmdb.org/t/p/w185/2YW8sSVvRhCwiQmsFCgtFsGkbv8.jpg",
"Michael Smiley": "https://image.tmdb.org/t/p/w185/muzJQpsKJ4srfVpyRa7qkrRYWSq.jpg",
"Babou Ceesay": "https://image.tmdb.org/t/p/w185/7HtIvbNxACa03ofJpN4EFQTNtRU.jpg",
"Julian Stone": "https://image.tmdb.org/t/p/w185/sNKqRYXFYHCz8lXExXl0DAl3iGD.jpg",
"Jordan Stephens": "https://image.tmdb.org/t/p/w185/oCQl5rkRExrDhGXNPeSxsmC5wvk.jpg",
"Alistair Petrie": "https://image.tmdb.org/t/p/w185/tC5CHVPnxAMqF0W0csTqcDAawwj.jpg",
"Samuel Witwer": "https://image.tmdb.org/t/p/w185/e4FRojd6SmiyRLo2nQQGUXwi16v.jpg",
"Ben Daniels": "https://image.tmdb.org/t/p/w185/x6MI4Fdz1XbERbNbXYoxTK6NAgv.jpg",
"Ariyon Bakare": "https://image.tmdb.org/t/p/w185/xjJlH9hU58Ocy6GxKfBlEvTif1p.jpg",
"James Arnold Taylor": "https://image.tmdb.org/t/p/w185/rAtyfY0diWt078qQIg0IX9xxG9F.jpg",
"Robin Atkin Downes": "https://image.tmdb.org/t/p/w185/pCnIQMMgrFc4hBOE4LJDdebqRZ4.jpg",
"Drewe Henley": "https://image.tmdb.org/t/p/w185/C28FmnpDyhI9BwD6YjagAe1U53.jpg",
"Spencer Wilding": "https://image.tmdb.org/t/p/w185/g3FJIpQZri7gG515rLehuo81T6W.jpg",
"Alan Tudyk": "https://image.tmdb.org/t/p/w185/6QuMtbD8kmhpwWhFKfNzEvHRLOu.jpg",
"Guy Henry": "https://image.tmdb.org/t/p/w185/zNjPC6BTZj7DZK4KFL0nMC1El2S.jpg",
"Angus Cook": "https://image.tmdb.org/t/p/w185/jPc794vF0h8bmslQ3sO8O3vUVIa.jpg",
"David Boat": "https://image.tmdb.org/t/p/w185/4ewxttZW0bhlta27oc5Tjrxel3p.jpg",
"Tom Kane": "https://image.tmdb.org/t/p/w185/hAyEHNuhD6PqbPdCNR7iUyM271I.jpg",
"Anthony Daniels": "https://image.tmdb.org/t/p/w185/cljvryjb3VwTsNR7fjQKjNPMaBB.jpg",
"Duncan Pow": "https://image.tmdb.org/t/p/w185/vJOzoMzxszyZGnySfql3KY9zR78.jpg",
"Fares Fares": "https://image.tmdb.org/t/p/w185/1BE5IG3hcFXfMjBuJJyKs2JpPjI.jpg",
"Tony Gilroy": "https://image.tmdb.org/t/p/w185/9HOtDgcO6F4Fa4BaIjt0t3Vbxrj.jpg",
"Felicity Jones": "https://image.tmdb.org/t/p/w185/9YekpRl6ndS7zpY0wwZAWcAXkl8.jpg",
"Eugene Byrd": "https://image.tmdb.org/t/p/w185/ab4zEcqdBSjpaz4CPQ2Z6q4rLmO.jpg",
"Jonathan Aris": "https://image.tmdb.org/t/p/w185/6RMuwGYfLLGq01LNGBydj9jpTWn.jpg",
"Valene Kane": "https://image.tmdb.org/t/p/w185/7TcV6HqGXjf28yjuSU42Z5XZRYb.jpg",
"Angus MacInnes": "https://image.tmdb.org/t/p/w185/qftkol8hj7yBBP3KCxRWYkhRyLC.jpg",
"James Earl Jones": "https://image.tmdb.org/t/p/w185/2ZuBf3ip2RXhkiQqGUjbUzAf4Nx.jpg",
"Emeson Nwolie": "https://image.tmdb.org/t/p/w185/dWCOK3qCOm1Vve567FXKhBp5x8B.jpg",
"Terri Douglas": "https://image.tmdb.org/t/p/w185/lECiABogAKm5Zl8Je6niNAoqz5N.jpg",
"Simon Farnaby": "https://image.tmdb.org/t/p/w185/3u1ObLUvaTyEMmpWQnkRg5Trlng.jpg",
"Donnie Yen": "https://image.tmdb.org/t/p/w185/vlKBbOc0htUsDGvcxeULcFXDMRo.jpg",
"Forest Whitaker": "https://image.tmdb.org/t/p/w185/4pMQkelS5lK661m9Kz3oIxLYiyS.jpg",
"Diego Luna": "https://image.tmdb.org/t/p/w185/9f1y0pLqohP8U3eEVCa4di1tESb.jpg",
"Dave Filoni": "https://image.tmdb.org/t/p/w185/1m7ijGgs29Emn3Sj08c1GwGTUm0.jpg",
"Jimmy Smits": "https://image.tmdb.org/t/p/w185/tZfr6EaIxzlT9MhY5T4C6cL3UjF.jpg",
"Yuri Lowenthal": "https://image.tmdb.org/t/p/w185/d5vbYEkrPYAiVdTee8e4xCm7Fg1.jpg",
"Verona Blue": "https://image.tmdb.org/t/p/w185/9UJiyVd65nGCVLsTuFjtF3ejCqa.jpg",
"David Sobolov": "https://image.tmdb.org/t/p/w185/lUXbnlyQPsfAGg0oinCtj6KlOkt.jpg",
"Ned Dennehy": "https://image.tmdb.org/t/p/w185/k4kgPvUND2eTrgmotrVWVJM0JUG.jpg",
"Ian McElhinney": "https://image.tmdb.org/t/p/w185/33RGircMDTbdvD6LUp8sLmQKWvA.jpg",
"Fred Tatasciore": "https://image.tmdb.org/t/p/w185/lNe4zn9fJ302GehQVaFk5BNcGGM.jpg",
"Mads Mikkelsen": "https://image.tmdb.org/t/p/w185/nJjN0bS6ssbOrXcnPJrNEIsbX9s.jpg",
"Paul Kasey": "https://image.tmdb.org/t/p/w185/56f0ouOg2ASKKKZlaywor8E5V3J.jpg",
"David Cowgill": "https://image.tmdb.org/t/p/w185/kcGjj4EuHfMp0VILRVoacoPqNFL.jpg",
"Ian Whyte": "https://image.tmdb.org/t/p/w185/6mRY7hTtHfDTGuTLmZmODOu9buF.jpg",
"Genevieve O'Reilly": "https://image.tmdb.org/t/p/w185/8NrrFxrGng88GU7lxwOyK3PZv05.jpg",
"Jorge Leon Martinez": "https://image.tmdb.org/t/p/w185/nWYveATaySCXosWAjcSS8VNPRe7.jpg",
"Katie Sheridan": "https://image.tmdb.org/t/p/w185/awNPsff9HU7NgAhG1qQ4Kh7pMmj.jpg",
"Vanessa Marshall": "https://image.tmdb.org/t/p/w185/wOXilt4TVOd0LuTw6RbWhe5DUy4.jpg",
"Vanessa Lengies": "https://image.tmdb.org/t/p/w185/vU4syqfb0PYE9efbBq9YZQu24cY.jpg",
"David Ankrum": "https://image.tmdb.org/t/p/w185/vo6JMA38exMSSbyQ3K0YCBwBrWT.jpg",
"Riz Ahmed": "https://image.tmdb.org/t/p/w185/yWjuIP634unLBCB4XjSgmJs5QGC.jpg",
"Steve Blum": "https://image.tmdb.org/t/p/w185/asCL6bWSZ7Xl2kSoRqrPB0CUUUU.jpg",
"Rian Johnson": "https://image.tmdb.org/t/p/w185/qWWRFkeMjTjQKoyEXhsV0QQp4qd.jpg",
"Matthew Wood": "https://image.tmdb.org/t/p/w185/oB9wVbEIg8fjY3ulDKjKsGn2A55.jpg",
"Jiang Wen": "https://image.tmdb.org/t/p/w185/sLLXxXg11VFdVYFthF9RB8wIQKv.jpg",
"Ben Mendelsohn": "https://image.tmdb.org/t/p/w185/nAeZkSUXh9CUAUq1cFAg77rZLIS.jpg",
"Geraldine James": "https://image.tmdb.org/t/p/w185/iHKFccX2qpSzMbhIBdfvr835MVg.jpg",
"Russell Balogh": "https://image.tmdb.org/t/p/w185/yCfE3Pf1npGB15Rw8GHt4nvgK6p.jpg"
},
"backdrop_original": [ "https://image.tmdb.org/t/p/original/tZjVVIYXACV4IIIhXeIM59ytqwS.jpg" ],
"clear_art": [],
"logo": [],
"banner": [],
"landscape": [],
"extra_fanart": []
},
"directors": [ "Gareth Edwards" ],
"titles": [ "Rogue One: A Star Wars Story", "Rogue One", "Star Wars: Rogue One", "Star Wars Anthology: Rogue One", "Rogue One: Uma História Star Wars", "星際大戰外傳:俠盜一號", "Rogue One - A Star Wars Story", "星球大战外传:侠盗一号", "Rogue One: История от Междузвездни войни", "Star Wars - Rouge One" ],
"imdb": "tt3748528",
"mpaa": "PG-13",
"via_tmdb": true,
"actors": [ "Felicity Jones", "Diego Luna", "Alan Tudyk", "Donnie Yen" ],
"writers": [ "Chris Weitz (screenplay)", "Tony Gilroy (screenplay)", "John Knoll (story by)", "Gary Whitta (story by)", "George Lucas (based on characters created by)" ],
"runtime": 133,
"type": "movie",
"released": "16 Dec 2016"
},
"_t": "media",
"releases": [],
"title": "Rogue One: A Star Wars Story",
"_rev": "00030f77",
"profile_id": "38699ec285c447bab0bc6267ffb2f3ad",
"_id": "d9d4e0ff9b0842518b9d5f5184a60f31",
"category_id": null,
"type": "movie",
"files": { "image_poster": [ "C:\\Users\\devin\\AppData\\Roaming\\CouchPotato\\cache\\2100049b45a923e858dd161ae28b1f4d.jpg" ] },
"identifiers": { "imdb": "tt3748528" }
},
{
"status": "active",
"info": {
"rating": { "imdb": [ 7.3, 16900 ] },
"genres": [ "Animation", "Comedy", "Family", "Music", "Drama" ],
"tmdb_id": 335797,
"plot": "In a city of humanoid animals, a hustling theater impresario's attempt to save his theater with a singing competition becomes grander than he anticipates even as its finalists' find that their lives will never be the same.",
"tagline": "Auditions begin 2016.",
"release_date": {
"dvd": 1490997600,
"expires": 1485114888,
"theater": 1482274800,
"bluray": true
},
"year": 2016,
"original_title": "Sing",
"actor_roles": {
"Taron Egerton": "Johnny (voice)",
"Catherine Cavadini": "Additional Voices (voice)",
"Beck Bennett": "Lance (voice)",
"Rhea Perlman": "Judith (voice)",
"Jon Robert Hall": "Frog (voice)",
"Abby Craden": "Additional Voices (voice)",
"Jim Cummings": "Additional Voices (voice)",
"Peter Serafinowicz": "Big Daddy (voice)",
"Bill Farmer": "News Reporter Dog (voice)",
"Jessica Rau": "Additional Voices (voice)",
"Townsend Coleman": "Additional Voices (voice)",
"Jen Faith Brown": "Singer (voice)",
"Brad Morris": "Baboon (voice)",
"Doug Burch": "Additional Voices (voice)",
"Jennifer Hudson": "Young Nana (voice)",
"Laura Dickinson": "Spider (voice)",
"Jeremy Maxwell": "Additional Voices (voice)",
"Asher Blinkoff": "Piglet (voice)",
"Reese Witherspoon": "Rosita (voice)",
"Scarlett Johansson": "Ash (voice)",
"Carlos Alazraqui": "Additional Voices (voice)",
"Edgar Wright": "Additional Voices (voice)",
"Asa Jennings": "Piglet (voice)",
"Nick Offerman": "Norman (voice)",
"Mickael Carreira": "Voice 3",
"Sara Mann": "Additional Voices (voice)",
"Jay Pharoah": "Meena's Grandfather (voice)",
"Adam Buxton": "Stan (voice)",
"Garth Jennings": "Miss Crawly / Additional Voices (voice)",
"Deolinda Kinzimba": "Voice 4",
"Jess Harnell": "Additional Voices (voice)",
"Bob Bergen": "Additional Voices (voice)",
"Leslie Jones": "Meena's Mother (voice)",
"Chris Renaud": "Additional Voices (voice)",
"Nick Kroll": "Gunter (voice)",
"Seth MacFarlane": "Mike (voice)",
"Marisa Liz": "Voice 2",
"Áurea": "Voice 1",
"Leo Jennings": "Piglet (voice)",
"Oscar Jennings": "Piglet (voice)",
"Tara Strong": "Additional Voices (voice)",
"John C. Reilly": "Eddie (voice)",
"Matthew McConaughey": "Buster Moon (voice)",
"Caspar Jennings": "Piglet (voice)",
"Daamen J. Krall": "Additional Voices (voice)",
"Tori Kelly": "Meena (voice)",
"Laraine Newman": "Meena's Grandmother / Additional Voices (voice)",
"Willow Geer": "Additional Voices (voice)",
"Wes Anderson": "Additional Voices (voice)",
"Jason Pace": "Additional Voices (voice)",
"Jennifer Saunders": "Nana (voice)",
"John DeMita": "Additional Voices (voice)"
},
"via_imdb": true,
"images": {
"disc_art": [],
"poster": [ "https://images-na.ssl-images-amazon.com/images/M/MV5BMTYzODYzODU2Ml5BMl5BanBnXkFtZTgwNTc1MTA2NzE@._V1_SX300.jpg" ],
"backdrop": [ "https://image.tmdb.org/t/p/w1280/fxDXp8un4qNY9b1dLd7SH6CKzC.jpg" ],
"extra_thumbs": [],
"poster_original": [ "https://image.tmdb.org/t/p/original/5XFchtGifv8mz4qlyT8PZ7ZsjfG.jpg" ],
"actors": {
"Taron Egerton": "https://image.tmdb.org/t/p/w185/bVsLVoO3BGoHRLjWoM4Gjav2hNb.jpg",
"Catherine Cavadini": "https://image.tmdb.org/t/p/w185/o2wULQltvbzCTCJitNeT72AjklR.jpg",
"Beck Bennett": "https://image.tmdb.org/t/p/w185/oblaqelpyBvtB5GaSgQpDrfka9M.jpg",
"Daamen J. Krall": "https://image.tmdb.org/t/p/w185/u0CORJ8e2vvw1dFARU4estHYS2I.jpg",
"Rhea Perlman": "https://image.tmdb.org/t/p/w185/cq7Cf4z3BHD9o58ki7MgCioty8q.jpg",
"Abby Craden": "https://image.tmdb.org/t/p/w185/biX1xErOEwsuRvidr8Pw6edEyK4.jpg",
"Jim Cummings": "https://image.tmdb.org/t/p/w185/i9frXvIJsGtoFikBEFVqE7uN8Bq.jpg",
"Peter Serafinowicz": "https://image.tmdb.org/t/p/w185/nfXHDKeetwO16agC0S7tDmLt1il.jpg",
"Bill Farmer": "https://image.tmdb.org/t/p/w185/4aDBlkt8nEkr1RkEhiKIbDWhpZB.jpg",
"Jessica Rau": "https://image.tmdb.org/t/p/w185/jBbIYc3UQf7JU8ggQVkfezpmgVZ.jpg",
"Townsend Coleman": "https://image.tmdb.org/t/p/w185/j7PvxQ7XuOQc1ggSRHWRP6CB8CU.jpg",
"Brad Morris": "https://image.tmdb.org/t/p/w185/qX6oVdAt7Vzzcnw28bdXFp05BBH.jpg",
"Doug Burch": "https://image.tmdb.org/t/p/w185/zwfqhPuIFrUL70bWPESdJZWXc7F.jpg",
"Jennifer Hudson": "https://image.tmdb.org/t/p/w185/zqTu7AANIUsVMAYz5rK1YPnvbWR.jpg",
"Asher Blinkoff": "https://image.tmdb.org/t/p/w185/780sIDWQoAIVVaUbAQex50Vam0V.jpg",
"Reese Witherspoon": "https://image.tmdb.org/t/p/w185/a3o8T1P6yy4KWL7wZG6HuDeuh5n.jpg",
"Scarlett Johansson": "https://image.tmdb.org/t/p/w185/f3c1rwcOoeU0v6Ak5loUvMyifR0.jpg",
"Carlos Alazraqui": "https://image.tmdb.org/t/p/w185/o62NevO1Vt9n1MdYsWOsDyhUt3A.jpg",
"Nick Offerman": "https://image.tmdb.org/t/p/w185/8rJOtmxL5GIfNdOfksVPzepQOy2.jpg",
"Sara Mann": "https://image.tmdb.org/t/p/w185/1TiV16ODOJtTZQrWmHRwOyQnMb0.jpg",
"Jay Pharoah": "https://image.tmdb.org/t/p/w185/yRD2vypRF0niEdoCCI0pNZENzvm.jpg",
"Tara Strong": "https://image.tmdb.org/t/p/w185/rFUZnJ4BaSaQVKW734xnUHSN9pm.jpg",
"Garth Jennings": "https://image.tmdb.org/t/p/w185/ahQh5uW5CXLe1LotxN4Y20aj5Gx.jpg",
"Jess Harnell": "https://image.tmdb.org/t/p/w185/k0BOzEyMkZ1CcoCaohjqTyQJjP1.jpg",
"Leslie Jones": "https://image.tmdb.org/t/p/w185/2cXrwJoX0QHGBtNMsMLqeF6bR3s.jpg",
"Chris Renaud": "https://image.tmdb.org/t/p/w185/yK3RxNsIEBljUe9jPG0iz53Iz6t.jpg",
"Nick Kroll": "https://image.tmdb.org/t/p/w185/puZov7sMmuVkvdqJvmlxtWcS1fU.jpg",
"Seth MacFarlane": "https://image.tmdb.org/t/p/w185/v4c6JhGYpjMRBwf95gtPxBnElNu.jpg",
"Bob Bergen": "https://image.tmdb.org/t/p/w185/kuWDjNTw6OVnc3q1ugMGBYpMMMa.jpg",
"Edgar Wright": "https://image.tmdb.org/t/p/w185/ypyH2s4egy5BkviuGDfeltpb19N.jpg",
"Matthew McConaughey": "https://image.tmdb.org/t/p/w185/jdRmHrG0TWXGhs4tO6TJNSoL25T.jpg",
"John C. Reilly": "https://image.tmdb.org/t/p/w185/kUo2TPQp4kOWWvijvkjLl0v9PQB.jpg",
"Adam Buxton": "https://image.tmdb.org/t/p/w185/zL31NlBBKL1NTjR48h610by5Rld.jpg",
"Tori Kelly": "https://image.tmdb.org/t/p/w185/dMyLOIOYqTMQtMEiK9DSxxHTz6F.jpg",
"Laraine Newman": "https://image.tmdb.org/t/p/w185/ApYftBOqDMBnVColOQwXIodOt5s.jpg",
"Willow Geer": "https://image.tmdb.org/t/p/w185/q2TjAxrQSpPPUiTUwFBXcLJ7qxc.jpg",
"Wes Anderson": "https://image.tmdb.org/t/p/w185/r6mr3gvbuocMznHXSlXVKDj7mEI.jpg",
"Jason Pace": "https://image.tmdb.org/t/p/w185/2q6KfNytYUiHuf8Rx9HyBGoD1T7.jpg",
"Jennifer Saunders": "https://image.tmdb.org/t/p/w185/nlxiFy0LUYGlICaFY3rF2DRovcc.jpg",
"John DeMita": "https://image.tmdb.org/t/p/w185/lzwHtcKVd5oenYtoFtJYeNddpwT.jpg"
},
"backdrop_original": [ "https://image.tmdb.org/t/p/original/fxDXp8un4qNY9b1dLd7SH6CKzC.jpg" ],
"clear_art": [],
"logo": [],
"banner": [],
"landscape": [],
"extra_fanart": []
},
"directors": [ "Christophe Lourdelet", "Garth Jennings" ],
"titles": [ "Sing", "Welcome to the Auditions" ],
"imdb": "tt3470600",
"mpaa": "PG",
"via_tmdb": true,
"actors": [ "Matthew McConaughey", "Reese Witherspoon", "Seth MacFarlane", "Scarlett Johansson" ],
"writers": [ "Garth Jennings" ],
"runtime": 110,
"type": "movie",
"released": "21 Dec 2016"
},
"_t": "media",
"releases": [],
"title": "Sing",
"_rev": "00031b86",
"profile_id": "38699ec285c447bab0bc6267ffb2f3ad",
"_id": "f12dc6bbff294daa85db0d839646442a",
"category_id": null,
"type": "movie",
"files": { "image_poster": [ "C:\\Users\\devin\\AppData\\Roaming\\CouchPotato\\cache\\2ad327d73e8ef4deab7a4b564d3b9cb4.jpg" ] },
"identifiers": { "imdb": "tt3470600" }
},
{
"status": "active",
"info": {
"rating": { "imdb": [ 6.4, 10027 ] },
"genres": [ "Action", "Horror" ],
"tmdb_id": 346672,
"plot": "Vampire death dealer Selene fends off brutal attacks from both the Lycan clan and the Vampire faction that betrayed her. With her only allies, David and his father Thomas, she must stop the eternal war between Lycans and Vampires, even if it means she has to make the ultimate sacrifice.",
"tagline": "Protect the Bloodline",
"release_date": {
"dvd": 1493589600,
"expires": 1485114954,
"theater": 1483657200,
"bluray": true
},
"year": 2016,
"original_title": "Underworld: Blood Wars",
"actor_roles": {
"India Eisley": "Eve",
"Kate Beckinsale": "Selene",
"Oliver Stark": "Gregor",
"Brian Caspe": "Hajna",
"Charles Dance": "Thomas",
"Alicia Vela-Bailey": "Safehouse Lycan",
"Bradley James": "Varga",
"David Bowles": "Grey Lycan",
"Theo James": "David",
"Lara Pulver": "Semira",
"Eva Larvoire": "Tech Lycan",
"Tobias Menzies": "Marius",
"Daisy Head": "Alexia",
"Trent Garrett": "Hybrid Michael"
},
"via_imdb": true,
"images": {
"disc_art": [],
"poster": [ "https://images-na.ssl-images-amazon.com/images/M/MV5BMjI5Njk0NTIyNV5BMl5BanBnXkFtZTgwNjU4MjY5MDI@._V1_SX300.jpg" ],
"backdrop": [ "https://image.tmdb.org/t/p/w1280/PIXSMakrO3s2dqA7mCvAAoVR0E.jpg" ],
"extra_thumbs": [],
"poster_original": [ "https://image.tmdb.org/t/p/original/nHXiMnWUAUba2LZ0dFkNDVdvJ1o.jpg" ],
"actors": {
"India Eisley": "https://image.tmdb.org/t/p/w185/njL744BT8mz9jf2TxcZDnSOEZFb.jpg",
"Kate Beckinsale": "https://image.tmdb.org/t/p/w185/pTRtcZn9gWQZRiet36qWKh94urn.jpg",
"Oliver Stark": "https://image.tmdb.org/t/p/w185/5yULYfaUMymZdSLhk2W96hZIQBP.jpg",
"Brian Caspe": "https://image.tmdb.org/t/p/w185/1fDVsCwZOwp97Pdl7q743seHCMP.jpg",
"Charles Dance": "https://image.tmdb.org/t/p/w185/bLT03rnI29YmbYWjA1JJCl4xVXw.jpg",
"Alicia Vela-Bailey": "https://image.tmdb.org/t/p/w185/kVuyn6sS7ZSBlXVjjxq0LSE3k4I.jpg",
"Bradley James": "https://image.tmdb.org/t/p/w185/4XAtJsz67pmpIsCQ9SBKfqayk2d.jpg",
"Trent Garrett": "https://image.tmdb.org/t/p/w185/w9J2snV7QI71B5F7rCxfPqeS7GU.jpg",
"Theo James": "https://image.tmdb.org/t/p/w185/hLNSoQ3gc52X5VVb172yO3CuUEq.jpg",
"Eva Larvoire": "https://image.tmdb.org/t/p/w185/Aq96CWP3Pub2CdWSNbL5eaTwRt0.jpg",
"Tobias Menzies": "https://image.tmdb.org/t/p/w185/bXUpxFsIowySRyyqchaE1XprptI.jpg",
"Daisy Head": "https://image.tmdb.org/t/p/w185/33JAZTxDWj646mxdW1HksqHOsiY.jpg",
"Lara Pulver": "https://image.tmdb.org/t/p/w185/ve68vtNYVXmKjzn81zKhI7TWEvy.jpg"
},
"backdrop_original": [ "https://image.tmdb.org/t/p/original/PIXSMakrO3s2dqA7mCvAAoVR0E.jpg" ],
"clear_art": [],
"logo": [],
"banner": [],
"landscape": [],
"extra_fanart": []
},
"directors": [ "Anna Foerster" ],
"titles": [ "Underworld: Blood Wars", "Inframundo: Guerras de Sangre", "Anjos da Noite: Guerras de Sangue", "Underworld Reboot", "Underworld: Next Generation", "決戰異世界:弒血之戰", "Інший світ 5: Кровна помста", "Інший світ 5", "Underworld 5 - Blood Wars" ],
"imdb": "tt3717252",
"mpaa": "R",
"via_tmdb": true,
"actors": [ "Kate Beckinsale", "Theo James", "Tobias Menzies", "Lara Pulver" ],
"writers": [ "Cory Goodman (screenplay)", "Kyle Ward (story by)", "Cory Goodman (story by)", "Kevin Grevioux (based on characters created by)", "Len Wiseman (based on characters created by)", "Danny McBride (based on characters created by)" ],
"runtime": 91,
"type": "movie",
"released": "06 Jan 2017"
},
"_t": "media",
"releases": [],
"title": "Underworld: Blood Wars",
"_rev": "00037887",
"profile_id": "38699ec285c447bab0bc6267ffb2f3ad",
"_id": "4040237fdbd349629a51e29e8ff634f2",
"category_id": null,
"type": "movie",
"files": { "image_poster": [ "C:\\Users\\devin\\AppData\\Roaming\\CouchPotato\\cache\\e41f29a177dd6756dce94f24148c81fe.jpg" ] },
"identifiers": { "imdb": "tt3717252" }
}
],
"total": 3,
"empty": false,
"success": true
}
File diff suppressed because it is too large Load Diff
@@ -45,6 +45,7 @@ namespace NzbDrone.Core.Test.IndexerTests
return new IndexerResponse(new IndexerRequest(httpRequest), httpResponse);
}
[Test]
public void should_handle_relative_url()
{
@@ -5,7 +5,6 @@ using NUnit.Framework;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Indexers.Newznab;
using NzbDrone.Core.Indexers.Omgwtfnzbs;
using NzbDrone.Core.Indexers.Wombles;
using NzbDrone.Core.Lifecycle;
using NzbDrone.Core.Test.Framework;
@@ -22,7 +21,6 @@ namespace NzbDrone.Core.Test.IndexerTests
_indexers.Add(Mocker.Resolve<Newznab>());
_indexers.Add(Mocker.Resolve<Omgwtfnzbs>());
_indexers.Add(Mocker.Resolve<Wombles>());
Mocker.SetConstant<IEnumerable<IIndexer>>(_indexers);
}
@@ -4,9 +4,7 @@ using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Indexers.KickassTorrents;
using NzbDrone.Core.Indexers.Nyaa;
using NzbDrone.Core.Indexers.Wombles;
using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Test.Framework;
@@ -40,58 +38,6 @@ namespace NzbDrone.Core.Test.IndexerTests.IntegrationTests
};
}
[Test]
public void wombles_fetch_recent()
{
var indexer = Mocker.Resolve<Wombles>();
indexer.Definition = new IndexerDefinition
{
Name = "MyIndexer",
Settings = NullConfig.Instance
};
var result = indexer.FetchRecent();
ValidateResult(result);
}
[Test]
[ManualTest]
[Explicit]
public void kickass_fetch_recent()
{
var indexer = Mocker.Resolve<KickassTorrents>();
indexer.Definition = new IndexerDefinition
{
Name = "MyIndexer",
Settings = new KickassTorrentsSettings()
};
var result = indexer.FetchRecent();
ValidateTorrentResult(result, hasSize: true);
}
[Test]
[ManualTest]
[Explicit]
public void kickass_search_single()
{
var indexer = Mocker.Resolve<KickassTorrents>();
indexer.Definition = new IndexerDefinition
{
Name = "MyIndexer",
Settings = new KickassTorrentsSettings()
};
var result = indexer.Fetch(_singleSearchCriteria);
ValidateTorrentResult(result, hasSize: true, hasMagnet: true);
}
[Test]
public void nyaa_fetch_recent()
{
@@ -1,173 +0,0 @@
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Http;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Indexers.KickassTorrents;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common;
using System;
using System.Linq;
using FluentAssertions;
using System.Text.RegularExpressions;
namespace NzbDrone.Core.Test.IndexerTests.KickassTorrentsTests
{
[TestFixture]
public class KickassTorrentsFixture : CoreTest<KickassTorrents>
{
[SetUp]
public void Setup()
{
Subject.Definition = new IndexerDefinition()
{
Name = "Kickass Torrents",
Settings = new KickassTorrentsSettings() { VerifiedOnly = false }
};
}
[Test]
public void should_parse_recent_feed_from_KickassTorrents()
{
var recentFeed = ReadAllText(@"Files/Indexers/KickassTorrents/KickassTorrents.xml");
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
var releases = Subject.FetchRecent();
releases.Should().HaveCount(5);
releases.First().Should().BeOfType<TorrentInfo>();
var torrentInfo = (TorrentInfo) releases.First();
torrentInfo.Title.Should().Be("Doctor Stranger.E03.140512.HDTV.H264.720p-iPOP.avi [CTRG]");
torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
torrentInfo.DownloadUrl.Should().Be("http://torcache.net/torrent/208C4F7866612CC88BFEBC7C496FA72C2368D1C0.torrent?title=%5Bkickass.to%5Ddoctor.stranger.e03.140512.hdtv.h264.720p.ipop.avi.ctrg");
torrentInfo.InfoUrl.Should().Be("http://kickass.to/doctor-stranger-e03-140512-hdtv-h264-720p-ipop-avi-ctrg-t9100648.html");
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2014/05/12 16:16:49"));
torrentInfo.Size.Should().Be(1205364736);
torrentInfo.InfoHash.Should().Be("208C4F7866612CC88BFEBC7C496FA72C2368D1C0");
torrentInfo.MagnetUrl.Should().Be("magnet:?xt=urn:btih:208C4F7866612CC88BFEBC7C496FA72C2368D1C0&dn=doctor+stranger+e03+140512+hdtv+h264+720p+ipop+avi+ctrg&tr=udp%3A%2F%2Fopen.demonii.com%3A1337%2Fannounce");
}
[Test]
public void should_return_empty_list_on_404()
{
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), new byte[0], System.Net.HttpStatusCode.NotFound));
var releases = Subject.FetchRecent();
releases.Should().HaveCount(0);
ExceptionVerification.IgnoreWarns();
}
[Test]
public void should_not_return_unverified_releases_if_not_configured()
{
((KickassTorrentsSettings) Subject.Definition.Settings).VerifiedOnly = true;
var recentFeed = ReadAllText(@"Files/Indexers/KickassTorrents/KickassTorrents.xml");
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
var releases = Subject.FetchRecent();
releases.Should().HaveCount(4);
}
[Test]
public void should_set_seeders_to_null()
{
// Atm, Kickass supplies 0 as seeders and leechers on the rss feed (but not the site), so set it to null if there aren't any peers.
var recentFeed = ReadAllText(@"Files/Indexers/KickassTorrents/KickassTorrents.xml");
recentFeed = recentFeed.Replace("<pubDate>Mon, 12 May 2014 16:16:49 +0000</pubDate>", string.Format("<pubDate>{0:R}</pubDate>", DateTime.UtcNow));
recentFeed = Regex.Replace(recentFeed, @"(seeds|peers)\>\d*", "$1>0");
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
var releases = Subject.FetchRecent();
releases.Should().HaveCount(5);
releases.First().Should().BeOfType<TorrentInfo>();
var torrentInfo = (TorrentInfo)releases.First();
torrentInfo.Peers.Should().NotHaveValue();
torrentInfo.Seeders.Should().NotHaveValue();
}
[Test]
public void should_not_set_seeders_to_null_if_has_peers()
{
// Atm, Kickass supplies 0 as seeders and leechers on the rss feed (but not the site), so set it to null if there aren't any peers.
var recentFeed = ReadAllText(@"Files/Indexers/KickassTorrents/KickassTorrents.xml");
recentFeed = recentFeed.Replace("<pubDate>Mon, 12 May 2014 16:16:49 +0000</pubDate>", string.Format("<pubDate>{0:R}</pubDate>", DateTime.UtcNow));
recentFeed = Regex.Replace(recentFeed, @"(seeds)\>\d*", "$1>0");
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
var releases = Subject.FetchRecent();
releases.Should().HaveCount(5);
releases.First().Should().BeOfType<TorrentInfo>();
var torrentInfo = (TorrentInfo)releases.First();
torrentInfo.Peers.Should().Be(311);
torrentInfo.Seeders.Should().Be(0);
}
[Test]
public void should_not_set_seeders_to_null_if_older_than_12_hours()
{
// Atm, Kickass supplies 0 as seeders and leechers on the rss feed (but not the site), so set it to null if there aren't any peers.
var recentFeed = ReadAllText(@"Files/Indexers/KickassTorrents/KickassTorrents.xml");
recentFeed = Regex.Replace(recentFeed, @"(seeds|peers)\>\d*", "$1>0");
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
var releases = Subject.FetchRecent();
releases.Should().HaveCount(5);
releases.First().Should().BeOfType<TorrentInfo>();
var torrentInfo = (TorrentInfo)releases.First();
torrentInfo.Peers.Should().Be(0);
torrentInfo.Seeders.Should().Be(0);
}
[Test]
public void should_handle_xml_with_html_accents()
{
var recentFeed = ReadAllText(@"Files/Indexers/KickassTorrents/KickassTorrents_accents.xml");
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
var releases = Subject.FetchRecent();
releases.Should().HaveCount(5);
}
}
}
@@ -1,59 +0,0 @@
using System;
using System.Linq;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Http;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Indexers.Wombles;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Test.IndexerTests.WomblesTests
{
[TestFixture]
public class TorrentRssIndexerFixture : CoreTest<Wombles>
{
[SetUp]
public void Setup()
{
Subject.Definition = new IndexerDefinition()
{
Name = "Wombles",
Settings = new NullConfig(),
};
}
private void GivenRecentFeedResponse(string rssXmlFile)
{
var recentFeed = ReadAllText(@"Files/Indexers/" + rssXmlFile);
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
}
[Test]
public void should_parse_recent_feed_from_wombles()
{
GivenRecentFeedResponse("Wombles/wombles.xml");
var releases = Subject.FetchRecent();
releases.Should().HaveCount(5);
var releaseInfo = releases.First();
releaseInfo.Title.Should().Be("One.Child.S01E01.720p.HDTV.x264-TLA");
releaseInfo.DownloadProtocol.Should().Be(DownloadProtocol.Usenet);
releaseInfo.DownloadUrl.Should().Be("http://indexer.local/nzb/bb4/One.Child.S01E01.720p.HDTV.x264-TLA.nzb");
releaseInfo.InfoUrl.Should().BeNullOrEmpty();
releaseInfo.CommentUrl.Should().BeNullOrEmpty();
releaseInfo.Indexer.Should().Be(Subject.Definition.Name);
releaseInfo.PublishDate.Should().Be(DateTime.Parse("2016-02-17 23:03:52 +0000").ToUniversalTime());
releaseInfo.Size.Should().Be(956*1024*1024);
}
}
}
@@ -0,0 +1,37 @@
using System.Linq;
using System.Text;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Http;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.NetImport;
using NzbDrone.Core.NetImport.CouchPotato;
using NzbDrone.Core.NetImport.RSSImport;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.NetImport.CouchPotato
{
public class CouchPotatoTest : CoreTest<CouchPotatoParser>
{
private NetImportResponse CreateResponse(string url, string content)
{
var httpRequest = new HttpRequest(url);
var httpResponse = new HttpResponse(httpRequest, new HttpHeader(), Encoding.UTF8.GetBytes(content));
return new NetImportResponse(new NetImportRequest(httpRequest), httpResponse);
}
[Test]
public void should_parse_json_of_couchpotato()
{
var json = ReadAllText("Files/couchpotato_movie_list.json");
var result = Subject.ParseResponse(CreateResponse("http://my.indexer.com/api?q=My+Favourite+Show", json));
result.First().Title.Should().Be("Rogue One: A Star Wars Story");
result.First().ImdbId.Should().Be("tt3748528");
}
}
}
@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Http;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.NetImport;
using NzbDrone.Core.NetImport.RSSImport;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.NetImport
{
[TestFixture]
public class RSSImportFixture : CoreTest<RSSImport>
{
[SetUp]
public void Setup()
{
Subject.Definition = Subject.DefaultDefinitions.First();
}
private void GivenRecentFeedResponse(string rssXmlFile)
{
var recentFeed = ReadAllText(@"Files/" + rssXmlFile);
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
}
[Test]
public void should_fetch_imdb_list()
{
GivenRecentFeedResponse("imdb_watchlist.xml");
var result = Subject.Fetch();
result.First().Title.Should().Be("Think Like a Man Too");
result.First().ImdbId.Should().Be("tt2239832");
}
}
}
@@ -0,0 +1,36 @@
using System.Linq;
using System.Text;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Http;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.NetImport;
using NzbDrone.Core.NetImport.RSSImport;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.NetImport
{
public class RSSImportTest : CoreTest<RSSImportParser>
{
private NetImportResponse CreateResponse(string url, string content)
{
var httpRequest = new HttpRequest(url);
var httpResponse = new HttpResponse(httpRequest, new HttpHeader(), Encoding.UTF8.GetBytes(content));
return new NetImportResponse(new NetImportRequest(httpRequest), httpResponse);
}
[Test]
public void should_parse_xml_of_imdb()
{
var xml = ReadAllText("Files/imdb_watchlist.xml");
var result = Subject.ParseResponse(CreateResponse("http://my.indexer.com/api?q=My+Favourite+Show", xml));
result.First().Title.Should().Be("Think Like a Man Too");
result.First().ImdbId.Should().Be("tt2239832");
}
}
}
@@ -190,6 +190,9 @@
<Compile Include="Download\Pending\PendingReleaseServiceTests\RemoveRejectedFixture.cs" />
<Compile Include="Download\Pending\PendingReleaseServiceTests\RemoveGrabbedFixture.cs" />
<Compile Include="Download\Pending\PendingReleaseServiceTests\AddFixture.cs" />
<None Include="Files\couchpotato_movie_list.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Files\Indexers\Rarbg\RecentFeed_v1.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@@ -254,11 +257,9 @@
<Compile Include="IndexerTests\TestIndexer.cs" />
<Compile Include="IndexerTests\TestIndexerSettings.cs" />
<Compile Include="IndexerTests\IPTorrentsTests\IPTorrentsFixture.cs" />
<Compile Include="IndexerTests\KickassTorrentsTests\KickassTorrentsFixture.cs" />
<Compile Include="IndexerTests\NyaaTests\NyaaFixture.cs" />
<Compile Include="IndexerTests\TorrentRssIndexerTests\TorrentRssIndexerFixture.cs" />
<Compile Include="IndexerTests\TorrentRssIndexerTests\TestTorrentRssIndexer.cs" />
<Compile Include="IndexerTests\WomblesTests\WomblesFixture.cs" />
<Compile Include="IndexerTests\XElementExtensionsFixture.cs" />
<Compile Include="InstrumentationTests\DatabaseTargetFixture.cs" />
<Compile Include="JobTests\JobRepositoryFixture.cs" />
@@ -284,6 +285,9 @@
<Compile Include="MetadataSource\SkyHook\SkyHookProxySearchFixture.cs" />
<Compile Include="MetadataSource\SearchSeriesComparerFixture.cs" />
<Compile Include="MetadataSource\SkyHook\SkyHookProxyFixture.cs" />
<Compile Include="NetImport\CouchPotato\CouchPotatoParserFixture.cs" />
<Compile Include="NetImport\RSSImportFixture.cs" />
<Compile Include="NetImport\RSSImportParserFixture.cs" />
<Compile Include="NotificationTests\SynologyIndexerFixture.cs" />
<Compile Include="OrganizerTests\FileNameBuilderTests\CleanTitleFixture.cs" />
<Compile Include="OrganizerTests\FileNameBuilderTests\EpisodeTitleCollapseFixture.cs" />
@@ -409,6 +413,9 @@
<Link>sqlite3.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Files\imdb_watchlist.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="License.txt" />
<None Include="Files\Indexers\BroadcastheNet\RecentFeed.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
@@ -47,5 +47,17 @@ namespace NzbDrone.Core.Test.ParserTests
{
QualityParser.ParseQuality(title).Revision.Version.Should().Be(version);
}
[TestCase("Deadpool 2016 2160p 4K UltraHD BluRay DTS-HD MA 7 1 x264-Whatevs", 19)]
[TestCase("Deadpool 2016 2160p 4K UltraHD DTS-HD MA 7 1 x264-Whatevs", 16)]
[TestCase("Deadpool 2016 4K 2160p UltraHD BluRay AAC2 0 HEVC x265", 19)]
[TestCase("The Revenant 2015 2160p UHD BluRay DTS x264-Whatevs", 19)]
[TestCase("The Revenant 2015 2160p UHD BluRay FLAC 7 1 x264-Whatevs", 19)]
[TestCase("The Martian 2015 2160p Ultra HD BluRay DTS-HD MA 7 1 x264-Whatevs", 19)]
[TestCase("Into the Inferno 2016 2160p Netflix WEBRip DD5 1 x264-Whatevs", 18)]
public void should_parse_ultrahd_from_title(string title, int version)
{
QualityParser.ParseQuality(title).Quality.Id.Should().Be(version);
}
}
}
@@ -215,19 +215,19 @@ namespace NzbDrone.Core.Test.ParserTests
ParseAndVerifyQuality(title, Quality.Bluray1080p, proper);
}
[TestCase("POI S02E11 1080i HDTV DD5.1 MPEG2-TrollHD", false)]
[TestCase("How I Met Your Mother S01E18 Nothing Good Happens After 2 A.M. 720p HDTV DD5.1 MPEG2-TrollHD", false)]
[TestCase("The Voice S01E11 The Finals 1080i HDTV DD5.1 MPEG2-TrollHD", false)]
[TestCase("Californication.S07E11.1080i.HDTV.DD5.1.MPEG2-NTb.ts", false)]
[TestCase("Game of Thrones S04E10 1080i HDTV MPEG2 DD5.1-CtrlHD.ts", false)]
[TestCase("VICE.S02E05.1080i.HDTV.DD2.0.MPEG2-NTb.ts", false)]
[TestCase("Show - S03E01 - Episode Title Raw-HD.ts", false)]
[TestCase("Saturday.Night.Live.Vintage.S10E09.Eddie.Murphy.The.Honeydrippers.1080i.UPSCALE.HDTV.DD5.1.MPEG2-zebra", false)]
[TestCase("The.Colbert.Report.2011-08-04.1080i.HDTV.MPEG-2-CtrlHD", false)]
public void should_parse_raw_quality(string title, bool proper)
{
ParseAndVerifyQuality(title, Quality.RAWHD, proper);
}
//[TestCase("POI S02E11 1080i HDTV DD5.1 MPEG2-TrollHD", false)]
//[TestCase("How I Met Your Mother S01E18 Nothing Good Happens After 2 A.M. 720p HDTV DD5.1 MPEG2-TrollHD", false)]
//[TestCase("The Voice S01E11 The Finals 1080i HDTV DD5.1 MPEG2-TrollHD", false)]
//[TestCase("Californication.S07E11.1080i.HDTV.DD5.1.MPEG2-NTb.ts", false)]
//[TestCase("Game of Thrones S04E10 1080i HDTV MPEG2 DD5.1-CtrlHD.ts", false)]
//[TestCase("VICE.S02E05.1080i.HDTV.DD2.0.MPEG2-NTb.ts", false)]
//[TestCase("Show - S03E01 - Episode Title Raw-HD.ts", false)]
//[TestCase("Saturday.Night.Live.Vintage.S10E09.Eddie.Murphy.The.Honeydrippers.1080i.UPSCALE.HDTV.DD5.1.MPEG2-zebra", false)]
//[TestCase("The.Colbert.Report.2011-08-04.1080i.HDTV.MPEG-2-CtrlHD", false)]
//public void should_parse_raw_quality(string title, bool proper)
//{
// ParseAndVerifyQuality(title, Quality.RAWHD, proper);
//}
[TestCase("Sonny.With.a.Chance.S02E15", false)]
[TestCase("Law & Order: Special Victims Unit - 11x11 - Quickie", false)]
@@ -23,7 +23,7 @@ namespace NzbDrone.Core.Test.Qualities
new object[] {7, Quality.Bluray1080p},
new object[] {8, Quality.WEBDL480p},
new object[] {9, Quality.HDTV1080p},
new object[] {10, Quality.RAWHD},
//new object[] {10, Quality.RAWHD},
new object[] {16, Quality.HDTV2160p},
new object[] {18, Quality.WEBDL2160p},
new object[] {19, Quality.Bluray2160p},
@@ -41,7 +41,7 @@ namespace NzbDrone.Core.Test.Qualities
new object[] {Quality.Bluray1080p, 7},
new object[] {Quality.WEBDL480p, 8},
new object[] {Quality.HDTV1080p, 9},
new object[] {Quality.RAWHD, 10},
//new object[] {Quality.RAWHD, 10},
new object[] {Quality.HDTV2160p, 16},
new object[] {Quality.WEBDL2160p, 18},
new object[] {Quality.Bluray2160p, 19},
@@ -65,20 +65,27 @@ namespace NzbDrone.Core.Test.Qualities
{
var qualities = new List<Quality>
{
Quality.Unknown,
Quality.CAM,
Quality.TELECINE,
Quality.DVDSCR,
Quality.REGIONAL,
Quality.SDTV,
Quality.WEBDL480p,
Quality.DVD,
Quality.DVDR,
Quality.HDTV720p,
Quality.HDTV1080p,
Quality.HDTV2160p,
Quality.RAWHD,
Quality.WEBDL480p,
Quality.WEBDL720p,
Quality.WEBDL1080p,
Quality.WEBDL2160p,
Quality.Bluray480p,
Quality.Bluray576p,
Quality.Bluray720p,
Quality.Bluray1080p,
Quality.Bluray2160p,
Quality.BRDISK,
Quality.RAWHD
};
if (allowed.Length == 0)
@@ -33,7 +33,7 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeRepositoryTests
{
new ProfileQualityItem { Allowed = true, Quality = Quality.SDTV },
new ProfileQualityItem { Allowed = true, Quality = Quality.WEBDL480p },
new ProfileQualityItem { Allowed = true, Quality = Quality.RAWHD }
//new ProfileQualityItem { Allowed = true, Quality = Quality.RAWHD }
}
};
@@ -71,13 +71,13 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeRepositoryTests
var qualityMet = new EpisodeFile { RelativePath = "a", Quality = new QualityModel { Quality = Quality.WEBDL480p } };
var qualityUnmet = new EpisodeFile { RelativePath = "b", Quality = new QualityModel { Quality = Quality.SDTV } };
var qualityRawHD = new EpisodeFile { RelativePath = "c", Quality = new QualityModel { Quality = Quality.RAWHD } };
//var qualityRawHD = new EpisodeFile { RelativePath = "c", Quality = new QualityModel { Quality = Quality.RAWHD } };
MediaFileRepository fileRepository = Mocker.Resolve<MediaFileRepository>();
qualityMet = fileRepository.Insert(qualityMet);
qualityUnmet = fileRepository.Insert(qualityUnmet);
qualityRawHD = fileRepository.Insert(qualityRawHD);
//qualityRawHD = fileRepository.Insert(qualityRawHD);
var monitoredSeriesEpisodes = Builder<Episode>.CreateListOfSize(4)
.All()
@@ -90,8 +90,8 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeRepositoryTests
.With(e => e.Monitored = false)
.With(e => e.EpisodeFileId = qualityMet.Id)
.TheNext(1)
.With(e => e.EpisodeFileId = qualityRawHD.Id)
.TheLast(1)
//.With(e => e.EpisodeFileId = qualityRawHD.Id)
//.TheLast(1)
.With(e => e.SeasonNumber = 0)
.Build();
@@ -11,6 +11,8 @@ namespace NzbDrone.Core.Blacklisting
{
public int SeriesId { get; set; }
public Series Series { get; set; }
public int MovieId { get; set; }
public Movie Movie { get; set; }
public List<int> EpisodeIds { get; set; }
public string SourceTitle { get; set; }
public QualityModel Quality { get; set; }
@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Blacklisting
{
List<Blacklist> BlacklistedByTitle(int seriesId, string sourceTitle);
List<Blacklist> BlacklistedByTorrentInfoHash(int seriesId, string torrentInfoHash);
List<Blacklist> BlacklistedBySeries(int seriesId);
List<Blacklist> BlacklistedByMovie(int seriesId);
}
public class BlacklistRepository : BasicRepository<Blacklist>, IBlacklistRepository
@@ -20,15 +20,15 @@ namespace NzbDrone.Core.Blacklisting
{
}
public List<Blacklist> BlacklistedByTitle(int seriesId, string sourceTitle)
public List<Blacklist> BlacklistedByTitle(int movieId, string sourceTitle)
{
return Query.Where(e => e.SeriesId == seriesId)
return Query.Where(e => e.MovieId == movieId)
.AndWhere(e => e.SourceTitle.Contains(sourceTitle));
}
public List<Blacklist> BlacklistedByTorrentInfoHash(int seriesId, string torrentInfoHash)
public List<Blacklist> BlacklistedByTorrentInfoHash(int movieId, string torrentInfoHash)
{
return Query.Where(e => e.SeriesId == seriesId)
return Query.Where(e => e.MovieId == movieId)
.AndWhere(e => e.TorrentInfoHash.Contains(torrentInfoHash));
}
@@ -37,9 +37,14 @@ namespace NzbDrone.Core.Blacklisting
return Query.Where(b => b.SeriesId == seriesId);
}
public List<Blacklist> BlacklistedByMovie(int movieId)
{
return Query.Where(b => b.MovieId == movieId);
}
protected override SortBuilder<Blacklist> GetPagedQuery(QueryBuilder<Blacklist> query, PagingSpec<Blacklist> pagingSpec)
{
var baseQuery = query.Join<Blacklist, Series>(JoinType.Inner, h => h.Series, (h, s) => h.SeriesId == s.Id);
var baseQuery = query.Join<Blacklist, Movie>(JoinType.Inner, h => h.Movie, (h, s) => h.MovieId == s.Id);
return base.GetPagedQuery(baseQuery, pagingSpec);
}
@@ -21,7 +21,7 @@ namespace NzbDrone.Core.Blacklisting
IExecute<ClearBlacklistCommand>,
IHandle<DownloadFailedEvent>,
IHandleAsync<SeriesDeletedEvent>
IHandleAsync<MovieDeletedEvent>
{
private readonly IBlacklistRepository _blacklistRepository;
@@ -128,8 +128,9 @@ namespace NzbDrone.Core.Blacklisting
{
var blacklist = new Blacklist
{
SeriesId = message.SeriesId,
SeriesId = 0,
EpisodeIds = message.EpisodeIds,
MovieId = message.MovieId,
SourceTitle = message.SourceTitle,
Quality = message.Quality,
Date = DateTime.UtcNow,
@@ -144,9 +145,9 @@ namespace NzbDrone.Core.Blacklisting
_blacklistRepository.Insert(blacklist);
}
public void HandleAsync(SeriesDeletedEvent message)
public void HandleAsync(MovieDeletedEvent message)
{
var blacklisted = _blacklistRepository.BlacklistedBySeries(message.Series.Id);
var blacklisted = _blacklistRepository.BlacklistedByMovie(message.Movie.Id);
_blacklistRepository.DeleteMany(blacklisted);
}
@@ -100,11 +100,18 @@ namespace NzbDrone.Core.Configuration
public int RssSyncInterval
{
get { return GetValueInt("RssSyncInterval", 15); }
get { return GetValueInt("RssSyncInterval", 60); }
set { SetValue("RssSyncInterval", value); }
}
public int NetImportSyncInterval
{
get { return GetValueInt("NetImportSyncInterval", 60); }
set { SetValue("NetImportSyncInterval", value); }
}
public int MinimumAge
{
get { return GetValueInt("MinimumAge", 0); }
@@ -169,7 +176,7 @@ namespace NzbDrone.Core.Configuration
public int DownloadedEpisodesScanInterval
{
get { return GetValueInt("DownloadedEpisodesScanInterval", 1); }
get { return GetValueInt("DownloadedEpisodesScanInterval", 0); }
set { SetValue("DownloadedEpisodesScanInterval", value); }
}
@@ -46,6 +46,8 @@ namespace NzbDrone.Core.Configuration
int RssSyncInterval { get; set; }
int MinimumAge { get; set; }
int NetImportSyncInterval { get; set; }
//UI
int FirstDayOfWeek { get; set; }
string CalendarWeekColumnHeader { get; set; }
@@ -0,0 +1,67 @@
using System.Data;
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
using System.Text;
using System.Text.RegularExpressions;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(121)]
public class update_filedate_config : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Execute.WithConnection(SetTitleSlug);
}
private void SetTitleSlug(IDbConnection conn, IDbTransaction tran)
{
using (IDbCommand getSeriesCmd = conn.CreateCommand())
{
getSeriesCmd.Transaction = tran;
getSeriesCmd.CommandText = @"SELECT Id, Value FROM Config WHERE Key = 'filedate'";
using (IDataReader seriesReader = getSeriesCmd.ExecuteReader())
{
while (seriesReader.Read())
{
var id = seriesReader.GetInt32(0);
var value = seriesReader.GetString(1);
using (IDbCommand updateCmd = conn.CreateCommand())
{
updateCmd.Transaction = tran;
updateCmd.CommandText = "UPDATE Config SET Value = 'Release' WHERE Id = ?";
updateCmd.AddParameter(id);
updateCmd.ExecuteNonQuery();
}
}
}
}
}
public static string ToUrlSlug(string value)
{
//First to lower case
value = value.ToLowerInvariant();
//Remove all accents
var bytes = Encoding.GetEncoding("Cyrillic").GetBytes(value);
value = Encoding.ASCII.GetString(bytes);
//Replace spaces
value = Regex.Replace(value, @"\s", "-", RegexOptions.Compiled);
//Remove invalid chars
value = Regex.Replace(value, @"[^a-z0-9\s-_]", "", RegexOptions.Compiled);
//Trim dashes from end
value = value.Trim('-', '_');
//Replace double occurences of - or _
value = Regex.Replace(value, @"([-_]){2,}", "$1", RegexOptions.Compiled);
return value;
}
}
}
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
using System.Data;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(122)]
public class add_movieid_to_blacklist : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Alter.Table("Blacklist").AddColumn("MovieId").AsInt32().Nullable().WithDefaultValue(0);
Alter.Table("Blacklist").AlterColumn("SeriesId").AsInt32().Nullable();
Alter.Table("Blacklist").AlterColumn("EpisodeIds").AsString().Nullable();
}
}
}
@@ -0,0 +1,27 @@
using FluentMigrator;
using FluentMigrator.Expressions;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(123)]
public class create_netimport_table : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
if (!this.Schema.Schema("dbo").Table("NetImport").Exists())
{
Create.TableForModel("NetImport")
.WithColumn("Enabled").AsBoolean()
.WithColumn("Name").AsString().Unique()
.WithColumn("Implementation").AsString()
.WithColumn("ConfigContract").AsString().Nullable()
.WithColumn("Settings").AsString().Nullable()
.WithColumn("EnableAuto").AsInt32()
.WithColumn("RootFolderPath").AsString()
.WithColumn("ShouldMonitor").AsInt32()
.WithColumn("ProfileId").AsInt32();
}
}
}
}
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
using System.Data;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(124)]
public class add_preferred_tags_to_profile : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Alter.Table("Profiles").AddColumn("PreferredTags").AsString().Nullable();
}
}
}
@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
using System.Data;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(125)]
public class fix_imdb_unique : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Execute.WithConnection(DeleteUniqueIndex);
}
private void DeleteUniqueIndex(IDbConnection conn, IDbTransaction tran)
{
using (IDbCommand getSeriesCmd = conn.CreateCommand())
{
getSeriesCmd.Transaction = tran;
getSeriesCmd.CommandText = @"DROP INDEX 'IX_Movies_ImdbId'";
getSeriesCmd.ExecuteNonQuery();
}
}
}
}
@@ -0,0 +1,35 @@
using System.Data;
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(126)]
public class update_qualities_and_profiles : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Execute.WithConnection(ConvertProfile);
}
private void ConvertProfile(IDbConnection conn, IDbTransaction tran)
{
var updater = new ProfileUpdater70(conn, tran);
updater.SplitQualityAppend(0, 27); // TELECINE AFTER Unknown
updater.SplitQualityAppend(0, 26); // TELESYNC AFTER Unknown
updater.SplitQualityAppend(0, 25); // CAM AFTER Unknown
updater.SplitQualityAppend(0, 24); // WORKPRINT AFTER Unknown
updater.SplitQualityPrepend(2, 23); // DVDR BEFORE DVD
updater.SplitQualityPrepend(2, 28); // DVDSCR BEFORE DVD
updater.SplitQualityPrepend(2, 29); // REGIONAL BEFORE DVD
updater.SplitQualityAppend(2, 21); // Bluray576p AFTER SDTV
updater.SplitQualityAppend(2, 20); // Bluray480p AFTER SDTV
updater.AppendQuality(22);
updater.Commit();
}
}
}
@@ -0,0 +1,14 @@
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(127)]
public class remove_wombles : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Delete.FromTable("Indexers").Row(new { Implementation = "Wombles" });
}
}
}
@@ -0,0 +1,14 @@
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(128)]
public class remove_kickass : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Delete.FromTable("Indexers").Row(new { Implementation = "Kickass Torrents" });
}
}
}
@@ -0,0 +1,14 @@
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(129)]
public class remove_kickass_again : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Delete.FromTable("Indexers").Row(new { Implementation = "KickassTorrents" });
}
}
}
@@ -34,6 +34,7 @@ using NzbDrone.Core.Extras.Metadata.Files;
using NzbDrone.Core.Extras.Others;
using NzbDrone.Core.Extras.Subtitles;
using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.NetImport;
namespace NzbDrone.Core.Datastore
{
@@ -55,6 +56,11 @@ namespace NzbDrone.Core.Datastore
.Ignore(i => i.SupportsRss)
.Ignore(i => i.SupportsSearch);
Mapper.Entity<NetImportDefinition>().RegisterDefinition("NetImport")
.Ignore(i => i.Enable)
.Relationship()
.HasOne(n => n.Profile, n => n.ProfileId);
Mapper.Entity<NotificationDefinition>().RegisterDefinition("Notifications")
.Ignore(i => i.SupportsOnGrab)
.Ignore(i => i.SupportsOnDownload)
@@ -23,6 +23,7 @@ namespace NzbDrone.Core.DecisionEngine
var comparers = new List<CompareDelegate>
{
CompareQuality,
ComparePreferredWords,
CompareProtocol,
ComparePeersIfTorrent,
CompareAgeIfUsenet,
@@ -65,9 +66,40 @@ namespace NzbDrone.Core.DecisionEngine
CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.ParsedEpisodeInfo.Quality.Revision.Version));
}
private int ComparePreferredWords(DownloadDecision x, DownloadDecision y)
{
return CompareBy(x.RemoteMovie, y.RemoteMovie, remoteMovie =>
{
var title = remoteMovie.Release.Title;
remoteMovie.Movie.Profile.LazyLoad();
var preferredWords = remoteMovie.Movie.Profile.Value.PreferredTags;
if (preferredWords == null)
{
return 0;
}
var num = preferredWords.AsEnumerable().Count(w => title.ToLower().Contains(w.ToLower()));
return num;
});
; }
private int CompareProtocol(DownloadDecision x, DownloadDecision y)
{
if (x.IsForMovie)
{
return CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode =>
{
var delayProfile = _delayProfileService.BestForTags(remoteEpisode.Movie.Tags);
var downloadProtocol = remoteEpisode.Release.DownloadProtocol;
return downloadProtocol == delayProfile.PreferredProtocol;
});
}
var result = CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode =>
{
var delayProfile = _delayProfileService.BestForTags(remoteEpisode.Series.Tags);
@@ -75,15 +107,7 @@ namespace NzbDrone.Core.DecisionEngine
return downloadProtocol == delayProfile.PreferredProtocol;
});
if (x.IsForMovie)
{
result = CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode =>
{
var delayProfile = _delayProfileService.BestForTags(remoteEpisode.Movie.Tags);
var downloadProtocol = remoteEpisode.Release.DownloadProtocol;
return downloadProtocol == delayProfile.PreferredProtocol;
});
}
return result;
}
@@ -125,8 +149,8 @@ namespace NzbDrone.Core.DecisionEngine
private int CompareAgeIfUsenet(DownloadDecision x, DownloadDecision y)
{
if (x.RemoteEpisode.Release.DownloadProtocol != DownloadProtocol.Usenet ||
y.RemoteEpisode.Release.DownloadProtocol != DownloadProtocol.Usenet)
if (x.RemoteMovie.Release.DownloadProtocol != DownloadProtocol.Usenet ||
y.RemoteMovie.Release.DownloadProtocol != DownloadProtocol.Usenet)
{
return 0;
}
@@ -32,7 +32,7 @@ namespace NzbDrone.Core.DecisionEngine
public List<DownloadDecision> GetRssDecision(List<ReleaseInfo> reports)
{
return GetDecisions(reports).ToList();
return GetMovieDecisions(reports).ToList();
}
public List<DownloadDecision> GetSearchDecision(List<ReleaseInfo> reports, SearchCriteriaBase searchCriteriaBase)
@@ -34,11 +34,11 @@ namespace NzbDrone.Core.DecisionEngine
public List<DownloadDecision> PrioritizeDecisionsForMovies(List<DownloadDecision> decisions)
{
return decisions.Where(c => c.RemoteMovie.Movie != null)
/*.GroupBy(c => c.RemoteMovie.Movie.Id, (movieId, downloadDecisions) =>
.GroupBy(c => c.RemoteMovie.Movie.Id, (movieId, downloadDecisions) =>
{
return downloadDecisions.OrderByDescending(decision => decision, new DownloadDecisionComparer(_delayProfileService));
})
.SelectMany(c => c)*/
.SelectMany(c => c)
.Union(decisions.Where(c => c.RemoteMovie.Movie == null))
.ToList();
}
@@ -33,7 +33,11 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
public Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria)
{
throw new NotImplementedException();
if (_blacklistService.Blacklisted(subject.Movie.Id, subject.Release))
{
_logger.Debug("{0} is blacklisted, rejecting.", subject.Release.Title);
return Decision.Reject("Release is blacklisted");
}
return Decision.Accept();
}
@@ -36,7 +36,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
return Decision.Accept();
}
public Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria)
public virtual Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria)
{
if (subject.Movie.MovieFile.Value != null)
{
@@ -41,6 +41,21 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
var delay = delayProfile.GetProtocolDelay(subject.Release.DownloadProtocol);
var isPreferredProtocol = subject.Release.DownloadProtocol == delayProfile.PreferredProtocol;
// Preferred word count
var title = subject.Release.Title;
var preferredWords = subject.Movie.Profile.Value.PreferredTags;
var preferredCount = 0;
if (preferredWords == null)
{
preferredCount = 1;
_logger.Debug("Preferred words is null, setting preffered count to 1.");
}
else
{
preferredCount = preferredWords.AsEnumerable().Count(w => title.ToLower().Contains(w.ToLower()));
}
if (delay == 0)
{
_logger.Debug("Profile does not require a waiting period before download for {0}.", subject.Release.DownloadProtocol);
@@ -49,7 +64,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
var comparer = new QualityModelComparer(profile);
if (isPreferredProtocol)
if (isPreferredProtocol && (subject.Movie.MovieFileId != 0) && (preferredCount > 0 || preferredWords == null))
{
var upgradable = _qualityUpgradableSpecification.IsUpgradable(profile, subject.Movie.MovieFile.Value.Quality, subject.ParsedMovieInfo.Quality);
@@ -59,7 +74,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
if (revisionUpgrade)
{
_logger.Debug("New quality is a better revision for existing quality, skipping delay");
_logger.Debug("New quality is a better revision for existing quality and preferred word count is {0}, skipping delay", preferredCount);
return Decision.Accept();
}
}
@@ -68,11 +83,11 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
// If quality meets or exceeds the best allowed quality in the profile accept it immediately
var bestQualityInProfile = new QualityModel(profile.LastAllowedQuality());
var isBestInProfile = comparer.Compare(subject.ParsedEpisodeInfo.Quality, bestQualityInProfile) >= 0;
var isBestInProfile = comparer.Compare(subject.ParsedMovieInfo.Quality, bestQualityInProfile) >= 0;
if (isBestInProfile && isPreferredProtocol)
if (isBestInProfile && isPreferredProtocol && (preferredCount > 0 || preferredWords == null))
{
_logger.Debug("Quality is highest in profile for preferred protocol, will not delay");
_logger.Debug("Quality is highest in profile for preferred protocol and preferred word count is {0}, will not delay.", preferredCount);
return Decision.Accept();
}
@@ -82,13 +97,13 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
if (oldest != null && oldest.Release.AgeMinutes > delay)
{
return Decision.Accept();
}
}*/
if (subject.Release.AgeMinutes < delay)
{
_logger.Debug("Waiting for better quality release, There is a {0} minute delay on {1}", delay, subject.Release.DownloadProtocol);
return Decision.Reject("Waiting for better quality release");
}*/ //TODO: Update for movies!
} //TODO: Update for movies!
return Decision.Accept();
}
@@ -19,7 +19,21 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
public Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria)
{
throw new NotImplementedException();
if (searchCriteria != null)
{
if (searchCriteria.UserInvokedSearch)
{
_logger.Debug("Skipping monitored check during search");
return Decision.Accept();
}
}
if (!subject.Movie.Monitored)
{
return Decision.Reject("Movie is not monitored");
}
return Decision.Accept();
}
public virtual Decision IsSatisfiedBy(RemoteEpisode subject, SearchCriteriaBase searchCriteria)
@@ -39,6 +39,17 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
}
protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string hash, string magnetLink)
{
throw new NotImplementedException("Episodes are not working with Radarr");
}
protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent)
{
throw new NotImplementedException("Episodes are not working with Radarr");
}
protected override string AddFromMagnetLink(RemoteMovie remoteEpisode, string hash, string magnetLink)
{
if (!Settings.SaveMagnetFiles)
{
@@ -62,7 +73,7 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
return null;
}
protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent)
protected override string AddFromTorrentFile(RemoteMovie remoteEpisode, string hash, string filename, byte[] fileContent)
{
var title = remoteEpisode.Release.Title;
@@ -93,7 +104,7 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
{
DownloadClient = Definition.Name,
DownloadId = Definition.Name + "_" + item.DownloadId,
Category = "sonarr",
Category = "radarr",
Title = item.Title,
TotalSize = item.TotalSize,
@@ -34,20 +34,7 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
protected override string AddFromNzbFile(RemoteEpisode remoteEpisode, string filename, byte[] fileContents)
{
var title = remoteEpisode.Release.Title;
title = FileNameBuilder.CleanFileName(title);
var filepath = Path.Combine(Settings.NzbFolder, title + ".nzb");
using (var stream = _diskProvider.OpenWriteStream(filepath))
{
stream.Write(fileContents, 0, fileContents.Length);
}
_logger.Debug("NZB Download succeeded, saved to: {0}", filepath);
return null;
throw new NotImplementedException("Episodes are not working with Radarr");
}
protected override string AddFromNzbFile(RemoteMovie remoteMovie, string filename, byte[] fileContents)
@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge
public DelugeSettingsValidator()
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.Port).GreaterThan(0);
RuleFor(c => c.Port).InclusiveBetween(1, 65535);
RuleFor(c => c.MovieCategory).Matches("^[-a-z]*$").WithMessage("Allowed characters a-z and -");
}
@@ -150,13 +150,23 @@ namespace NzbDrone.Core.Download.Clients.Hadouken
}
protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string hash, string magnetLink)
{
throw new NotImplementedException("Episodes are not working with Radarr");
}
protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent)
{
throw new NotImplementedException("Episodes are not working with Radarr");
}
protected override string AddFromMagnetLink(RemoteMovie remoteEpisode, string hash, string magnetLink)
{
_proxy.AddTorrentUri(Settings, magnetLink);
return hash.ToUpper();
}
protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent)
protected override string AddFromTorrentFile(RemoteMovie remoteEpisode, string hash, string filename, byte[] fileContent)
{
return _proxy.AddTorrentFile(Settings, fileContent).ToUpper();
}
@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Download.Clients.Hadouken
public HadoukenSettingsValidator()
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.Port).GreaterThan(0);
RuleFor(c => c.Port).InclusiveBetween(1, 65535);
RuleFor(c => c.Username).NotEmpty()
.WithMessage("Username must not be empty.");
@@ -28,7 +28,7 @@ namespace NzbDrone.Core.Download.Clients.Hadouken
{
Host = "localhost";
Port = 7070;
Category = "sonarr-tv";
Category = "radarr";
}
[FieldDefinition(0, Label = "Host", Type = FieldType.Textbox)]
@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Download.Clients.NzbVortex
public NzbVortexSettingsValidator()
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.Port).GreaterThan(0);
RuleFor(c => c.Port).InclusiveBetween(1, 65535);
RuleFor(c => c.ApiKey).NotEmpty()
.WithMessage("API Key is required");
@@ -32,9 +32,12 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
protected override string AddFromNzbFile(RemoteEpisode remoteEpisode, string filename, byte[] fileContents)
{
var category = Settings.TvCategory;
var priority = remoteEpisode.IsRecentEpisode() ? Settings.RecentTvPriority : Settings.OlderTvPriority;
var response = _proxy.DownloadNzb(fileContents, filename, category, priority, Settings);
var addpaused = Settings.AddPaused;
var response = _proxy.DownloadNzb(fileContents, filename, category, priority, addpaused, Settings);
if (response == null)
{
@@ -47,9 +50,12 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
protected override string AddFromNzbFile(RemoteMovie remoteMovie, string filename, byte[] fileContents)
{
var category = Settings.TvCategory; // TODO: Update this to MovieCategory?
var priority = Settings.RecentTvPriority;
var response = _proxy.DownloadNzb(fileContents, filename, category, priority, Settings);
var addpaused = Settings.AddPaused;
var response = _proxy.DownloadNzb(fileContents, filename, category, priority, addpaused, Settings);
if(response == null)
{
@@ -11,7 +11,7 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
{
public interface INzbgetProxy
{
string DownloadNzb(byte[] nzbData, string title, string category, int priority, NzbgetSettings settings);
string DownloadNzb(byte[] nzbData, string title, string category, int priority, bool addpaused, NzbgetSettings settings);
NzbgetGlobalStatus GetGlobalStatus(NzbgetSettings settings);
List<NzbgetQueueItem> GetQueue(NzbgetSettings settings);
List<NzbgetHistoryItem> GetHistory(NzbgetSettings settings);
@@ -45,12 +45,12 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
return version >= minimumVersion;
}
public string DownloadNzb(byte[] nzbData, string title, string category, int priority, NzbgetSettings settings)
public string DownloadNzb(byte[] nzbData, string title, string category, int priority, bool addpaused, NzbgetSettings settings)
{
if (HasVersion(16, settings))
{
var droneId = Guid.NewGuid().ToString().Replace("-", "");
var response = ProcessRequest<int>(settings, "append", title, nzbData, category, priority, false, false, string.Empty, 0, "all", new string[] { "drone", droneId });
var response = ProcessRequest<int>(settings, "append", title, nzbData, category, priority, false, addpaused, string.Empty, 0, "all", new string[] { "drone", droneId });
if (response <= 0)
{
return null;
@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
public NzbgetSettingsValidator()
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.Port).GreaterThan(0);
RuleFor(c => c.Port).InclusiveBetween(1, 65535);
RuleFor(c => c.Username).NotEmpty().When(c => !string.IsNullOrWhiteSpace(c.Password));
RuleFor(c => c.Password).NotEmpty().When(c => !string.IsNullOrWhiteSpace(c.Username));
@@ -57,6 +57,9 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
[FieldDefinition(7, Label = "Use SSL", Type = FieldType.Checkbox)]
public bool UseSsl { get; set; }
[FieldDefinition(8, Label = "Add Paused", Type = FieldType.Checkbox, HelpText = "This option requires at least NzbGet version 16.0")]
public bool AddPaused { get; set; }
public NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));
@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
public QBittorrentSettingsValidator()
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.Port).InclusiveBetween(0, 65535);
RuleFor(c => c.Port).InclusiveBetween(1, 65535);
}
}
@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
public SabnzbdSettingsValidator()
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.Port).GreaterThan(0);
RuleFor(c => c.Port).InclusiveBetween(1, 65535);
RuleFor(c => c.ApiKey).NotEmpty()
.WithMessage("API Key is required when username/password are not configured")
@@ -12,7 +12,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission
public TransmissionSettingsValidator()
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.Port).GreaterThan(0);
RuleFor(c => c.Port).InclusiveBetween(1, 65535);
RuleFor(c => c.UrlBase).ValidUrlBase();
@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
public RTorrentSettingsValidator()
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.Port).InclusiveBetween(0, 65535);
RuleFor(c => c.Port).InclusiveBetween(1, 65535);
RuleFor(c => c.MovieCategory).NotEmpty()
.WithMessage("A category is recommended")
.AsWarning();
@@ -26,7 +26,7 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
Host = "localhost";
Port = 8080;
UrlBase = "RPC2";
MovieCategory = "movies-radarr";
MovieCategory = "radarr";
}
[FieldDefinition(0, Label = "Host", Type = FieldType.Textbox)]
@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
public UTorrentSettingsValidator()
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.Port).InclusiveBetween(0, 65535);
RuleFor(c => c.Port).InclusiveBetween(1, 65535);
RuleFor(c => c.TvCategory).NotEmpty();
}
}
@@ -23,7 +23,7 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
{
Host = "localhost";
Port = 9091;
TvCategory = "tv-sonarr";
TvCategory = "radarr";
}
[FieldDefinition(0, Label = "Host", Type = FieldType.Textbox)]
@@ -33,7 +33,7 @@ namespace NzbDrone.Core.Download
public ProcessedDecisions ProcessDecisions(List<DownloadDecision> decisions)
{
//var qualifiedReports = GetQualifiedReports(decisions);
var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(decisions);
var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisionsForMovies(decisions);
var grabbed = new List<DownloadDecision>();
var pending = new List<DownloadDecision>();
@@ -5,6 +5,7 @@ using NzbDrone.Core.IndexerSearch;
using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Tv;
using System.Collections.Generic;
namespace NzbDrone.Core.Download
{
@@ -38,7 +39,7 @@ namespace NzbDrone.Core.Download
{
_logger.Debug("Failed download contains a movie, searching again.");
_commandQueueManager.Push(new MoviesSearchCommand { MovieId = message.MovieId });
_commandQueueManager.Push(new MoviesSearchCommand { MovieIds = new List<int> { message.MovieId } });
return;
}
@@ -56,7 +56,6 @@ namespace NzbDrone.Core.Download.TrackedDownloads
try
{
var parsedEpisodeInfo = Parser.Parser.ParseTitle(trackedDownload.DownloadItem.Title);
var parsedMovieInfo = Parser.Parser.ParseMovieTitle(trackedDownload.DownloadItem.Title);
var historyItems = _historyService.FindByDownloadId(downloadItem.DownloadId);
@@ -65,33 +64,25 @@ namespace NzbDrone.Core.Download.TrackedDownloads
trackedDownload.RemoteMovie = _parsingService.Map(parsedMovieInfo, "", null);
}
if (parsedEpisodeInfo != null)
{
trackedDownload.RemoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0, 0);
}
if (historyItems.Any())
{
var firstHistoryItem = historyItems.OrderByDescending(h => h.Date).First();
trackedDownload.State = GetStateFromHistory(firstHistoryItem.EventType);
if ((parsedEpisodeInfo == null ||
trackedDownload.RemoteEpisode == null ||
trackedDownload.RemoteEpisode.Series == null ||
trackedDownload.RemoteEpisode.Episodes.Empty()) && trackedDownload.RemoteMovie == null)
if (parsedMovieInfo == null ||
trackedDownload.RemoteMovie == null ||
trackedDownload.RemoteMovie.Movie == null)
{
// Try parsing the original source title and if that fails, try parsing it as a special
// TODO: Pass the TVDB ID and TVRage IDs in as well so we have a better chance for finding the item
parsedEpisodeInfo = Parser.Parser.ParseTitle(firstHistoryItem.SourceTitle) ?? _parsingService.ParseSpecialEpisodeTitle(firstHistoryItem.SourceTitle, 0, 0);
parsedMovieInfo = Parser.Parser.ParseMovieTitle(firstHistoryItem.SourceTitle);
if (parsedEpisodeInfo != null)
if (parsedMovieInfo != null)
{
trackedDownload.RemoteEpisode = _parsingService.Map(parsedEpisodeInfo, firstHistoryItem.SeriesId, historyItems.Where(v => v.EventType == HistoryEventType.Grabbed).Select(h => h.EpisodeId).Distinct());
trackedDownload.RemoteMovie = _parsingService.Map(parsedMovieInfo, "", null);
}
}
}
if (trackedDownload.RemoteEpisode == null && trackedDownload.RemoteMovie == null)
if (trackedDownload.RemoteMovie == null)
{
return null;
}
+6 -6
View File
@@ -102,13 +102,13 @@ namespace NzbDrone.Core.Extras
public void Handle(MediaCoversUpdatedEvent message)
{
var series = message.Series;
var episodeFiles = GetEpisodeFiles(series.Id);
//var series = message.Series;
//var episodeFiles = GetEpisodeFiles(series.Id);
foreach (var extraFileManager in _extraFileManagers)
{
extraFileManager.CreateAfterSeriesScan(series, episodeFiles);
}
//foreach (var extraFileManager in _extraFileManagers)
//{
// extraFileManager.CreateAfterSeriesScan(series, episodeFiles);
//}
}
//TODO: Implementing this will fix a lot of our warning exceptions
@@ -0,0 +1,13 @@
using NzbDrone.Core.Messaging.Commands;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NzbDrone.Core.IndexerSearch
{
public class MissingMoviesSearchCommand : Command
{
public override bool SendUpdatesToClient => true;
}
}
@@ -1,10 +1,11 @@
using NzbDrone.Core.Messaging.Commands;
using System.Collections.Generic;
namespace NzbDrone.Core.IndexerSearch
{
public class MoviesSearchCommand : Command
{
public int MovieId { get; set; }
public List<int> MovieIds { get; set; }
public override bool SendUpdatesToClient => true;
}
@@ -4,22 +4,23 @@ using NzbDrone.Common.Instrumentation.Extensions;
using NzbDrone.Core.Download;
using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Datastore;
namespace NzbDrone.Core.IndexerSearch
{
public class MovieSearchService : IExecute<MoviesSearchCommand>
public class MovieSearchService : IExecute<MoviesSearchCommand>, IExecute<MissingMoviesSearchCommand>
{
private readonly IMovieService _seriesService;
private readonly IMovieService _movieService;
private readonly ISearchForNzb _nzbSearchService;
private readonly IProcessDownloadDecisions _processDownloadDecisions;
private readonly Logger _logger;
public MovieSearchService(IMovieService seriesService,
public MovieSearchService(IMovieService movieService,
ISearchForNzb nzbSearchService,
IProcessDownloadDecisions processDownloadDecisions,
Logger logger)
{
_seriesService = seriesService;
_movieService = movieService;
_nzbSearchService = nzbSearchService;
_processDownloadDecisions = processDownloadDecisions;
_logger = logger;
@@ -27,20 +28,35 @@ namespace NzbDrone.Core.IndexerSearch
public void Execute(MoviesSearchCommand message)
{
var series = _seriesService.GetMovie(message.MovieId);
var downloadedCount = 0;
foreach (var movieId in message.MovieIds)
{
var series = _movieService.GetMovie(movieId);
if (!series.Monitored)
{
_logger.Debug("Movie {0} is not monitored, skipping search", series.Title);
}
var decisions = _nzbSearchService.MovieSearch(message.MovieId, false);//_nzbSearchService.SeasonSearch(message.MovieId, season.SeasonNumber, false, message.Trigger == CommandTrigger.Manual);
var decisions = _nzbSearchService.MovieSearch(movieId, false);//_nzbSearchService.SeasonSearch(message.MovieId, season.SeasonNumber, false, message.Trigger == CommandTrigger.Manual);
downloadedCount += _processDownloadDecisions.ProcessDecisions(decisions).Grabbed.Count;
}
_logger.ProgressInfo("Movie search completed. {0} reports downloaded.", downloadedCount);
}
public void Execute(MissingMoviesSearchCommand message)
{
var movies = _movieService.MoviesWithoutFiles(new PagingSpec<Movie>
{
Page = 1,
PageSize = 100000,
SortDirection = SortDirection.Ascending,
SortKey = "Id",
FilterExpression =
v =>
v.Monitored == true
}).Records.ToList();
}
}
}
@@ -54,13 +54,19 @@ namespace NzbDrone.Core.Indexers.AwesomeHD
private IEnumerable<IndexerRequest> GetRequest(string searchParameters)
{
var onlyInternal = "";
if (Settings.Internal)
{
onlyInternal = "&internal=true";
}
if (searchParameters != null)
{
yield return new IndexerRequest(string.Format("{0}/searchapi.php?action=imdbsearch&passkey={1}&imdb={2}", Settings.BaseUrl.Trim().TrimEnd('/'), Settings.Passkey.Trim(), searchParameters), HttpAccept.Rss);
yield return new IndexerRequest($"{Settings.BaseUrl.Trim().TrimEnd('/')}/searchapi.php?action=imdbsearch&passkey={Settings.Passkey.Trim()}&imdb={searchParameters}", HttpAccept.Rss);
}
else
{
yield return new IndexerRequest(string.Format("{0}/searchapi.php?action=latestmovies&passkey={1}", Settings.BaseUrl.Trim().TrimEnd('/'), Settings.Passkey.Trim()), HttpAccept.Rss);
yield return new IndexerRequest($"{Settings.BaseUrl.Trim().TrimEnd('/')}/searchapi.php?action=latestmovies&passkey={Settings.Passkey.Trim()}{onlyInternal}", HttpAccept.Rss);
}
}
@@ -29,6 +29,9 @@ namespace NzbDrone.Core.Indexers.AwesomeHD
[FieldDefinition(1, Label = "Passkey")]
public string Passkey { get; set; }
[FieldDefinition(2, Type = FieldType.Checkbox, Label = "Require Internal", HelpText = "Will only include internal releases for RSS Sync.")]
public bool Internal { get; set; }
public NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));
@@ -1,4 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Common.Http;
@@ -45,17 +44,34 @@ namespace NzbDrone.Core.Indexers.HDBits
return new IndexerPageableRequestChain();
}
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
public virtual IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
var queryBase = new TorrentQuery();
var query = queryBase.Clone();
query.ImdbInfo.Id = int.Parse(searchCriteria.Movie.ImdbId.Substring(2));
pageableRequests.Add(GetRequest(query));
if (TryAddSearchParameters(queryBase, searchCriteria))
{
var query = queryBase.Clone();
query.ImdbInfo.Id = int.Parse(searchCriteria.Movie.ImdbId.Substring(2));
pageableRequests.Add(GetRequest(query));
}
return pageableRequests;
}
private bool TryAddSearchParameters(TorrentQuery query, SearchCriteriaBase searchCriteria)
{
var imdbId = int.Parse(searchCriteria.Movie.ImdbId.Substring(2));
if (imdbId != 0)
{
query.ImdbInfo = query.ImdbInfo ?? new ImdbInfo();
query.ImdbInfo.Id = imdbId;
return true;
}
return false;
}
private IEnumerable<IndexerRequest> GetRequest(TorrentQuery query)
{
var request = new HttpRequestBuilder(Settings.BaseUrl)

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