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

Compare commits

..

4 Commits

Author SHA1 Message Date
Taloth Saldono 83ff02545e Prevent ProgressMessageTarget from ever reading the command from the database. 2015-06-04 19:15:47 +02:00
Mark McDowall 2d25c74758 Fixed: Premature cleanup of completed tasks cache causes tasks to get stuck till reboot. 2015-06-04 19:15:17 +02:00
Taloth Saldono 4d924688d8 Fixed: A bug caused way too much data being read during MediaInfo discovery (often the entire file).
Fixed: Further optimized the MediaInfo discovery to reduce the read data to a couple of dozen kbytes, but less detailed.
2015-06-03 22:14:36 +02:00
Taloth Saldono 3b805c4591 Fixed: Now also ratelimiting indexer api requests instead of only nzb downloads. 2015-06-03 22:14:35 +02:00
1755 changed files with 43821 additions and 78677 deletions
Vendored
BIN
View File
Binary file not shown.
-25
View File
@@ -1,25 +0,0 @@
# This file is for unifying the coding style for different editors and IDEs
# editorconfig.org
root = true
[*.{cs,html,js,hbs}]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4
[*.less]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
# They have troubles with TABS. Use 2 spaces
[{package.json,.travis.yml}]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
-5
View File
@@ -1,5 +0,0 @@
Provide a description of the feature request or bug, the more details the better.
Please use https://forums.sonarr.tv/ for support or other questions. (When in doubt, use the forums)
-14
View File
@@ -1,14 +0,0 @@
#### Database Migration
YES | NO
#### Description
A few sentences describing the overall goals of the pull request's commits.
#### Todos
- [ ] Tests
- [ ] Documentation
#### Issues Fixed or Closed by this PR
*
+5 -19
View File
@@ -10,7 +10,6 @@ src/**/[Oo]bj/
*.suo *.suo
*.user *.user
*.sln.docstates *.sln.docstates
.vs/
# Build results # Build results
*_i.c *_i.c
@@ -42,9 +41,6 @@ src/**/[Oo]bj/
_ReSharper* _ReSharper*
_dotCover* _dotCover*
# DevExpress CodeRush
src/.cr/
# NCrunch # NCrunch
*.ncrunch* *.ncrunch*
.*crunch*.local.xml .*crunch*.local.xml
@@ -101,7 +97,7 @@ App_Data/*.ldf
_NCrunch_* _NCrunch_*
_TeamCity* _TeamCity*
# Sonarr # NzbDrone
config.xml config.xml
nzbdrone.log*txt nzbdrone.log*txt
UpdateLogs/ UpdateLogs/
@@ -109,7 +105,7 @@ UpdateLogs/
*.test-cache *.test-cache
*.userprefs *.userprefs
*/test-results/* */test-results/*
src/UI/.idea/* .idea/*
*log.txt *log.txt
node_modules/ node_modules/
_output* _output*
@@ -117,23 +113,13 @@ _rawPackage/
_dotTrace* _dotTrace*
_tests/ _tests/
*.Result.xml *.Result.xml
wix/*.msi
wix/*.wixobj
wix/*.wixpdb
setup/Output/ setup/Output/
*.~is *.~is
UI.Phantom/
#VS outout folders #VS outout folders
bin bin
obj obj
output/* output/*
#Packages
Radarr_*/
Radarr_*.zip
#OS X metadata files
._*
.DS_Store
_start
_temp_*/**/*
-4
View File
@@ -1,4 +0,0 @@
[submodule "src/ExternalModules/CurlSharp"]
path = src/ExternalModules/CurlSharp
url = https://github.com/Sonarr/CurlSharp.git
branch = master
Generated
-1
View File
@@ -1 +0,0 @@
Sonarr
-25
View File
@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.idea" />
<excludeFolder url="file://$MODULE_DIR$/Logo" />
<excludeFolder url="file://$MODULE_DIR$/_output" />
<excludeFolder url="file://$MODULE_DIR$/_output_mono" />
<excludeFolder url="file://$MODULE_DIR$/_output_osx" />
<excludeFolder url="file://$MODULE_DIR$/_output_osx_app" />
<excludeFolder url="file://$MODULE_DIR$/_start" />
<excludeFolder url="file://$MODULE_DIR$/_tests" />
<excludeFolder url="file://$MODULE_DIR$/debian" />
<excludeFolder url="file://$MODULE_DIR$/node_modules" />
<excludeFolder url="file://$MODULE_DIR$/osx" />
<excludeFolder url="file://$MODULE_DIR$/schemas" />
<excludeFolder url="file://$MODULE_DIR$/setup" />
<excludeFolder url="file://$MODULE_DIR$/src" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Sonarr node_modules" level="project" />
</component>
</module>
-59
View File
@@ -1,59 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectCodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value>
<option name="LINE_SEPARATOR" value="&#13;&#10;" />
<option name="RIGHT_MARGIN" value="190" />
<option name="HTML_ATTRIBUTE_WRAP" value="0" />
<option name="HTML_KEEP_LINE_BREAKS" value="false" />
<option name="HTML_KEEP_BLANK_LINES" value="1" />
<option name="HTML_ALIGN_ATTRIBUTES" value="false" />
<option name="HTML_INLINE_ELEMENTS" value="" />
<option name="HTML_DONT_ADD_BREAKS_IF_INLINE_CONTENT" value="" />
<CssCodeStyleSettings>
<option name="HEX_COLOR_LOWER_CASE" value="true" />
<option name="HEX_COLOR_LONG_FORMAT" value="true" />
<option name="VALUE_ALIGNMENT" value="1" />
</CssCodeStyleSettings>
<JSCodeStyleSettings>
<option name="SPACE_BEFORE_PROPERTY_COLON" value="true" />
<option name="ALIGN_OBJECT_PROPERTIES" value="2" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="OBJECT_LITERAL_WRAP" value="2" />
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
</JSCodeStyleSettings>
<XML>
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>
<codeStyleSettings language="CSS">
<indentOptions>
<option name="SMART_TABS" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JavaScript">
<option name="LINE_COMMENT_AT_FIRST_COLUMN" value="true" />
<option name="KEEP_LINE_BREAKS" value="false" />
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="CATCH_ON_NEW_LINE" value="true" />
<option name="FINALLY_ON_NEW_LINE" value="true" />
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
<option name="SPACE_BEFORE_METHOD_PARENTHESES" value="true" />
<option name="CALL_PARAMETERS_WRAP" value="1" />
<option name="BINARY_OPERATION_WRAP" value="1" />
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
<option name="ARRAY_INITIALIZER_WRAP" value="2" />
<option name="ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE" value="true" />
<option name="ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE" value="true" />
<option name="IF_BRACE_FORCE" value="3" />
<option name="DOWHILE_BRACE_FORCE" value="3" />
<option name="WHILE_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
</codeStyleSettings>
</value>
</option>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component>
</project>
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<includedPredefinedLibrary name="ECMAScript 6" />
</component>
</project>
-14
View File
@@ -1,14 +0,0 @@
<component name="libraryTable">
<library name="Sonarr node_modules" type="javaScript">
<properties>
<option name="frameworkName" value="node_modules" />
<sourceFilesUrls>
<item url="file://$PROJECT_DIR$/node_modules" />
</sourceFilesUrls>
</properties>
<CLASSES>
<root url="file://$PROJECT_DIR$/node_modules" />
</CLASSES>
<SOURCES />
</library>
</component>
-14
View File
@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" />
</project>
-8
View File
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Sonarr.iml" filepath="$PROJECT_DIR$/.idea/Sonarr.iml" />
</modules>
</component>
</project>
Generated
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
-12
View File
@@ -1,12 +0,0 @@
language: csharp
solution: src/NzbDrone.sln
script: # the following commands are just examples, use whatever your build process requires
- ./build.sh
- chmod +x test.sh
# - ./test.sh Linux Unit Takes far too long, maybe even crashes travis :/
install:
- sudo apt-get install nodejs
- sudo apt-get install npm
after_success:
- chmod +x package.sh
- ./package.sh
+2 -2
View File
@@ -1,6 +1,6 @@
# Sonarr Individual Contributor License Agreement # # NzbDrone Individual Contributor License Agreement #
Thank you for your interest in contributing to Sonarr ("We" or "Us"). Thank you for your interest in contributing to NzbDrone ("We" or "Us").
This contributor agreement ("Agreement") documents the rights granted by contributors to Us. To make this document effective, please complete the form below. This is a legally binding document, so please read it carefully before agreeing to it. The Agreement may cover more than one software project managed by Us. This contributor agreement ("Agreement") documents the rights granted by contributors to Us. To make this document effective, please complete the form below. This is a legally binding document, so please read it carefully before agreeing to it. The Agreement may cover more than one software project managed by Us.
## 1. Definitions ## ## 1. Definitions ##
+8 -10
View File
@@ -1,6 +1,6 @@
# How to Contribute # # How to Contribute #
We're always looking for people to help make Sonarr even better, there are a number of ways to contribute. We're always looking for people to help make NzbDrone even better, there are a number of ways to contribute. To get started, <a href="http://www.clahub.com/agreements/NzbDrone/NzbDrone">sign the Contributor License Agreement</a>.
## Documentation ## ## Documentation ##
Setup guides, FAQ, the more information we have on the wiki the better. Setup guides, FAQ, the more information we have on the wiki the better.
@@ -8,24 +8,22 @@ Setup guides, FAQ, the more information we have on the wiki the better.
## Development ## ## Development ##
### Tools required ### ### Tools required ###
- Visual Studio 2015 - Visual Studio 2013
- HTML/Javascript editor of choice (Sublime Text/Webstorm/Atom/etc) - HTML/Javascript editor of choice (Sublime Text/Webstorm/etc)
- npm (node package manager) - npm (node package manager)
- git - git
### Getting started ### ### Getting started ###
1. Fork Sonarr 1. Fork NzbDrone
2. Clone (develop branch) *you may need pull in submodules separately if you client doesn't clone them automatically (CurlSharp)* 2. Clone (develop branch)
3. Run `npm install` 3. Run `npm install`
4. Run `npm start` - Used to compile the UI components and copy them. 4. Run `gulp watch` - Used to compile the UI components and copy them (leave this window open)
Leave this window open.
If you have gulp globally installed you can use `gulp watch` instead
5. Compile in Visual Studio 5. Compile in Visual Studio
### Contributing Code ### ### Contributing Code ###
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Sonarr/Sonarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first) - If you're adding a new, already requested feature, please comment on [Trello](https://trello.sonarr.tv "Trello") so work is not duplicated (If you want to add something not already on there, please talk to us first)
- Rebase from Sonarr's develop branch, don't merge - Rebase from NzbDrone's develop branch, don't merge
- Make meaningful commits, or squash them - Make meaningful commits, or squash them
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements - Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
- Reach out to us on the forums or on IRC if you have any questions - Reach out to us on the forums or on IRC if you have any questions
+720
View File
@@ -0,0 +1,720 @@
<Config xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:b="http://schemas.datacontract.org/2004/07/System.Drawing" xmlns:d="http://schemas.datacontract.org/2004/07/Prosa.Log4View.Db" xmlns:f="http://schemas.datacontract.org/2004/07/Prosa.Log4View.Receiver.File" xmlns:l="http://schemas.datacontract.org/2004/07/Prosa.Log4View.Level" xmlns:m="http://schemas.datacontract.org/2004/07/Prosa.Log4View.Receiver.Msg" xmlns:n="http://schemas.datacontract.org/2004/07/Prosa.Log4View.Receiver.Net" xmlns:t="http://schemas.datacontract.org/2004/07/Prosa.Log4View.LoggerTree" xmlns:u="http://schemas.datacontract.org/2004/07/Prosa.Log4View.Utils" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" xmlns="http://schemas.datacontract.org/2004/07/Prosa.Log4View.Configuration">
<Id>
<u:Value>1</u:Value>
</Id>
<Data z:Id="2">
<Id>
<u:Value>2</u:Value>
</Id>
<Version>17</Version>
<_receivers z:Id="3" z:Size="1">
<ReceiverConfig z:Id="4" i:type="n:NetReceiverConfig">
<Id>
<u:Value>16</u:Value>
</Id>
<BackColor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4293654015</b:value>
</BackColor>
<BufferSize>500000</BufferSize>
<Encoding z:Id="5">Windows-1252</Encoding>
<LevelFilter z:Id="6" i:type="LogLevelSurrogated">
<LevelName z:Id="7">ALL</LevelName>
</LevelFilter>
<LoggingFrameworkId z:Id="8">Log4net</LoggingFrameworkId>
<Name z:Id="9">NzbDrone</Name>
<ParserType>XML</ParserType>
<ReadAdjacentMessages>0</ReadAdjacentMessages>
<ReadFrom>0001-01-01T00:00:00</ReadFrom>
<ReadUntil>0001-01-01T00:00:00</ReadUntil>
<SourceId>0</SourceId>
<TimeOffset>0</TimeOffset>
<TimeZone z:Id="10">Pacific Standard Time</TimeZone>
<UseFilter>false</UseFilter>
<Window>18</Window>
<n:HostName z:Id="11">localhost</n:HostName>
<n:Port>20480</n:Port>
<n:Protocol>Udp</n:Protocol>
</ReceiverConfig>
</_receivers>
<_sources z:Id="12" z:Size="0" />
</Data>
<Presentation z:Id="13">
<Id>
<u:Value>3</u:Value>
</Id>
<DefaultLogLevel z:Ref="6" i:nil="true" />
<ShowCodeDetails>false</ShowCodeDetails>
<ShowMessageDetails>true</ShowMessageDetails>
<ShowMultiField>true</ShowMultiField>
<ShowOutputOnDebug>true</ShowOutputOnDebug>
<ShowProcessDetails>false</ShowProcessDetails>
<ToolTipLogLevel z:Id="14" i:type="LogLevelSurrogated">
<LevelName z:Id="15">OFF</LevelName>
</ToolTipLogLevel>
<Version>17</Version>
<_charts z:Id="16" z:Size="0" />
<_columns z:Id="17" z:Size="29">
<ColumnConfig z:Id="18">
<Id>
<u:Value>78</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="19">Id</FieldName>
<Name z:Ref="19" i:nil="true" />
<Position>-1</Position>
<Width>45</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="20">
<Id>
<u:Value>79</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="21">OriginalTime</FieldName>
<Name z:Ref="21" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="22">
<Id>
<u:Value>80</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="23">Time</FieldName>
<Name z:Ref="23" i:nil="true" />
<Position>1</Position>
<Width>80</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="24">
<Id>
<u:Value>81</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="25">LocalTime</FieldName>
<Name z:Ref="25" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="26">
<Id>
<u:Value>82</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="27">UtcTime</FieldName>
<Name z:Ref="27" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="28">
<Id>
<u:Value>83</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="29">Date</FieldName>
<Name z:Ref="29" i:nil="true" />
<Position>-1</Position>
<Width>70</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="30">
<Id>
<u:Value>84</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="31">Key</FieldName>
<Name z:Ref="31" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="32">
<Id>
<u:Value>85</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="33">Level</FieldName>
<Name z:Ref="33" i:nil="true" />
<Position>-1</Position>
<Width>85</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="34">
<Id>
<u:Value>86</u:Value>
</Id>
<ClipMode>ClipMiddle</ClipMode>
<FieldName z:Id="35">Logger</FieldName>
<Name z:Ref="35" i:nil="true" />
<Position>2</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="36">
<Id>
<u:Value>87</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="37">Source</FieldName>
<Name z:Ref="37" i:nil="true" />
<Position>-1</Position>
<Width>90</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="38">
<Id>
<u:Value>88</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="39">Message</FieldName>
<Name z:Ref="39" i:nil="true" />
<Position>3</Position>
<Width>874</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="40">
<Id>
<u:Value>89</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="41">Thread</FieldName>
<Name z:Ref="41" i:nil="true" />
<Position>-1</Position>
<Width>95</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="42">
<Id>
<u:Value>90</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="43">Host</FieldName>
<Name z:Ref="43" i:nil="true" />
<Position>-1</Position>
<Width>90</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="44">
<Id>
<u:Value>91</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="45">Exception</FieldName>
<Name z:Ref="45" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="46">
<Id>
<u:Value>92</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="47">Domain</FieldName>
<Name z:Ref="47" i:nil="true" />
<Position>-1</Position>
<Width>90</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="48">
<Id>
<u:Value>93</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="49">Identity</FieldName>
<Name z:Ref="49" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="50">
<Id>
<u:Value>94</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="51">User</FieldName>
<Name z:Ref="51" i:nil="true" />
<Position>-1</Position>
<Width>90</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="52">
<Id>
<u:Value>95</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="53">Class</FieldName>
<Name z:Ref="53" i:nil="true" />
<Position>-1</Position>
<Width>90</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="54">
<Id>
<u:Value>96</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="55">Method</FieldName>
<Name z:Ref="55" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="56">
<Id>
<u:Value>97</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="57">File</FieldName>
<Name z:Ref="57" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="58">
<Id>
<u:Value>98</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="59">Line</FieldName>
<Name z:Ref="59" i:nil="true" />
<Position>-1</Position>
<Width>45</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="60">
<Id>
<u:Value>99</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="61">NDC</FieldName>
<Name z:Ref="61" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="62">
<Id>
<u:Value>100</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="63">MDC</FieldName>
<Name z:Ref="63" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="64">
<Id>
<u:Value>101</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="65">Comment</FieldName>
<Name z:Ref="65" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="66">
<Id>
<u:Value>102</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="67">StackTrace</FieldName>
<Name z:Ref="67" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="68">
<Id>
<u:Value>103</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="69">ProcessId</FieldName>
<Name z:Ref="69" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="70">
<Id>
<u:Value>104</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="71">ThreadId</FieldName>
<Name z:Ref="71" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="72">
<Id>
<u:Value>105</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="73">CallStack</FieldName>
<Name z:Ref="73" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
<ColumnConfig z:Id="74">
<Id>
<u:Value>106</u:Value>
</Id>
<ClipMode>ClipRight</ClipMode>
<FieldName z:Id="75">assembly</FieldName>
<Name z:Ref="75" i:nil="true" />
<Position>-1</Position>
<Width>120</Width>
<WindowId>18</WindowId>
</ColumnConfig>
</_columns>
<_filters z:Id="76" z:Size="0" />
<_formats z:Id="77" z:Size="1">
<FormatConfig z:Id="78">
<Id>
<u:Value>0</u:Value>
</Id>
<ConditionFieldName z:Ref="39" i:nil="true" />
<ConditionRelation z:Id="79"></ConditionRelation>
<ConditionText z:Ref="79" i:nil="true" />
<Formats z:Id="80" z:Size="12">
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="81" i:type="LogLevelSurrogated">
<LevelName z:Id="82">VERBOSE</LevelName>
</a:Key>
<a:Value z:Id="83">
<Id>
<u:Value>4</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="84">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4290032820</b:value>
</Forecolor>
<Loglevel z:Ref="81" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="85" i:type="LogLevelSurrogated">
<LevelName z:Id="86">TRACE</LevelName>
</a:Key>
<a:Value z:Id="87">
<Id>
<u:Value>5</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="88">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4288716960</b:value>
</Forecolor>
<Loglevel z:Ref="85" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="89" i:type="LogLevelSurrogated">
<LevelName z:Id="90">DEBUG</LevelName>
</a:Key>
<a:Value z:Id="91">
<Id>
<u:Value>6</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="92">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4286743170</b:value>
</Forecolor>
<Loglevel z:Ref="89" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="93" i:type="LogLevelSurrogated">
<LevelName z:Id="94">INFO</LevelName>
</a:Key>
<a:Value z:Id="95">
<Id>
<u:Value>7</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="96">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4278190080</b:value>
</Forecolor>
<Loglevel z:Ref="93" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="97" i:type="LogLevelSurrogated">
<LevelName z:Id="98">NOTICE</LevelName>
</a:Key>
<a:Value z:Id="99">
<Id>
<u:Value>8</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="100">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4281957177</b:value>
</Forecolor>
<Loglevel z:Ref="97" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="101" i:type="LogLevelSurrogated">
<LevelName z:Id="102">WARN</LevelName>
</a:Key>
<a:Value z:Id="103">
<Id>
<u:Value>9</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="104">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4294934528</b:value>
</Forecolor>
<Loglevel z:Ref="101" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="105" i:type="LogLevelSurrogated">
<LevelName z:Id="106">ERROR</LevelName>
</a:Key>
<a:Value z:Id="107">
<Id>
<u:Value>10</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="108">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4294901760</b:value>
</Forecolor>
<Loglevel z:Ref="105" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="109" i:type="LogLevelSurrogated">
<LevelName z:Id="110">SEVERE</LevelName>
</a:Key>
<a:Value z:Id="111">
<Id>
<u:Value>11</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="112">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4293067295</b:value>
</Forecolor>
<Loglevel z:Ref="109" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="113" i:type="LogLevelSurrogated">
<LevelName z:Id="114">CRITICAL</LevelName>
</a:Key>
<a:Value z:Id="115">
<Id>
<u:Value>12</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="116">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4289400377</b:value>
</Forecolor>
<Loglevel z:Ref="113" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="117" i:type="LogLevelSurrogated">
<LevelName z:Id="118">ALERT</LevelName>
</a:Key>
<a:Value z:Id="119">
<Id>
<u:Value>13</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="120">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4294902015</b:value>
</Forecolor>
<Loglevel z:Ref="117" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="121" i:type="LogLevelSurrogated">
<LevelName z:Id="122">FATAL</LevelName>
</a:Key>
<a:Value z:Id="123">
<Id>
<u:Value>14</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="124">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4287309977</b:value>
</Forecolor>
<Loglevel z:Ref="121" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
<a:Key z:Id="125" i:type="LogLevelSurrogated">
<LevelName z:Id="126">EMERGENCY</LevelName>
</a:Key>
<a:Value z:Id="127">
<Id>
<u:Value>15</u:Value>
</Id>
<Backcolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>0</b:state>
<b:value>0</b:value>
</Backcolor>
<FontName z:Id="128">Tahoma</FontName>
<Forecolor>
<b:knownColor>0</b:knownColor>
<b:name i:nil="true" />
<b:state>2</b:state>
<b:value>4285932413</b:value>
</Forecolor>
<Loglevel z:Ref="125" i:nil="true" />
<Size>8.25</Size>
<Style>Regular</Style>
</a:Value>
</a:KeyValueOfLogLevelLoggerFormatConfigxIppDzWS>
</Formats>
<IgnoreCase>false</IgnoreCase>
<Name z:Id="129">Default Format Settings</Name>
</FormatConfig>
</_formats>
<_logLevels z:Id="130" z:Size="0" />
<_loggers z:Id="131" z:Size="1">
<LoggerConfig z:Id="132">
<Id>
<u:Value>77</u:Value>
</Id>
<LogLevel z:Ref="6" i:nil="true" />
<LoggerPath z:Ref="79" i:nil="true" />
<ReceiverId>16</ReceiverId>
</LoggerConfig>
</_loggers>
</Presentation>
<Version>17</Version>
</Config>
+2
View File
@@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/Environment/ExternalSources/Decompiler/DecompileMethodBodies/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>
+257 -1
View File
@@ -1 +1,257 @@
Write-Warning "DEPRECATED -- Please use build.sh instead." $msBuild = 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe'
$outputFolder = '.\_output'
$outputFolderMono = '.\_output_mono'
$outputFolderOsx = '.\_output_osx'
$outputFolderOsxApp = '.\_output_osx_app'
$testPackageFolder = '.\_tests\'
$testSearchPattern = '*.Test\bin\x86\Release'
$sourceFolder = '.\src'
$updateFolder = $outputFolder + '\NzbDrone.Update'
$updateFolderMono = $outputFolderMono + '\NzbDrone.Update'
Function Build()
{
Write-Host "##teamcity[progressStart 'Build']"
$clean = $msbuild + " src\nzbdrone.sln /t:Clean /m"
$build = $msbuild + " src\nzbdrone.sln /p:Configuration=Release /p:Platform=x86 /t:Build /m"
if(Test-Path $outputFolder)
{
Remove-Item -Recurse -Force $outputFolder -ErrorAction Continue
}
Invoke-Expression $clean
CheckExitCode
Invoke-Expression $build
CheckExitCode
CleanFolder $outputFolder
AddJsonNet
Write-Host "Removing Mono.Posix.dll"
Remove-Item "$outputFolder\Mono.Posix.dll"
Write-Host "##teamcity[progressFinish 'Build']"
}
Function CleanFolder($path, $keepConfigFiles)
{
Write-Host Removing XMLDoc files
get-childitem $path -File -Filter *.xml -Recurse | foreach ($_) {
$filename = $_.FullName
$exeFilename = $filename -replace "xml", "exe"
$dllFilename = $filename -replace "xml", "dll"
if (Test-Path $exeFilename) {
remove-item $_.fullname
}
if (Test-Path $dllFilename) {
remove-item $_.fullname
}
}
get-childitem $path -File -Filter *.transform -Recurse | foreach ($_) {remove-item $_.fullname}
if($keepConfigFiles -ne $true)
{
get-childitem $path -File -Filter *.dll.config -Recurse | foreach ($_) {remove-item $_.fullname}
}
Write-Host Removing FluentValidation.Resources files
get-childitem $path -File -Filter FluentValidation.resources.dll -recurse | foreach ($_) {remove-item $_.fullname}
get-childitem $path -File -Filter app.config -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing .less files
get-childitem $path -File -Filter *.less -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing vshost files
get-childitem $path -File -Filter *.vshost.exe -Recurse | foreach ($_) {remove-item $_.fullname}
if(Test-Path $$path\NuGet)
{
Write-Host Removing NuGet
Remove-Item -Recurse -Force "$path\NuGet"
}
Write-Host Removing Empty folders
while (Get-ChildItem $path -recurse | where {!@(Get-ChildItem -force $_.fullname)} | Test-Path)
{
Get-ChildItem $path -Directory -recurse | where {!@(Get-ChildItem -force $_.fullname)} | Remove-Item
}
}
Function PackageMono()
{
Write-Host "##teamcity[progressStart 'Creating Mono Package']"
if(Test-Path $outputFolderMono)
{
Remove-Item -Recurse -Force $outputFolderMono -ErrorAction Continue
}
Copy-Item $outputFolder $outputFolderMono -recurse
Write-Host Creating MDBs
get-childitem $outputFolderMono -File -Include @("*.exe", "*.dll") -Exclude @("MediaInfo.dll", "sqlite3.dll") -Recurse | foreach ($_) {
Write-Host "Creating .mdb for $_"
& "tools\pdb2mdb\pdb2mdb.exe" $_.fullname
}
Write-Host Removing PDBs
get-childitem $outputFolderMono -File -Filter *.pdb -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing Service helpers
get-childitem $outputFolderMono -File -Filter ServiceUninstall.* -Recurse | foreach ($_) {remove-item $_.fullname}
get-childitem $outputFolderMono -File -Filter ServiceInstall.* -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing native windows binaries Sqlite, MediaInfo
get-childitem $outputFolderMono -File -Filter sqlite3.* -Recurse | foreach ($_) {remove-item $_.fullname}
get-childitem $outputFolderMono -File -Filter MediaInfo.* -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host "Adding NzbDrone.Core.dll.config (for dllmap)"
Copy-Item "$sourceFolder\NzbDrone.Core\NzbDrone.Core.dll.config" $outputFolderMono
Write-Host Renaming NzbDrone.Console.exe to NzbDrone.exe
Get-ChildItem $outputFolderMono -File -Filter "NzbDrone.exe*" -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Removing NzbDrone.Windows
get-childitem $outputFolderMono -File -Filter NzbDrone.Windows.* -Recurse | foreach ($_) {remove-item $_.fullname}
Get-ChildItem $outputFolderMono -File -Filter "NzbDrone.Console.exe*" -Recurse | foreach ($_) {
$newName = $_.fullname -Replace ".Console",""
Rename-Item $_.fullname $newName
}
Write-Host Adding NzbDrone.Mono to UpdatePackage
Copy-Item $outputFolderMono\* $updateFolderMono -Filter NzbDrone.Mono.*
Write-Host "##teamcity[progressFinish 'Creating Mono Package']"
}
Function PackageOsx()
{
Write-Host "##teamcity[progressStart 'Creating OS X Package']"
if(Test-Path $outputFolderOsx)
{
Remove-Item -Recurse -Force $outputFolderOsx -ErrorAction Continue
}
Copy-Item $outputFolderMono $outputFolderOsx -recurse
Write-Host "Adding sqlite dylibs"
Copy-Item "$sourceFolder\Libraries\sqlite\*.dylib" "$outputFolderOsx"
Write-Host "Adding MediaInfo dylib"
Copy-Item "$sourceFolder\Libraries\MediaInfo\*.dylib" "$outputFolderOsx"
Write-Host "Adding Startup script"
Copy-Item .\osx\Sonarr "$outputFolderOsx"
Write-Host "##teamcity[progressFinish 'Creating OS X Package']"
}
Function PackageOsxApp()
{
Write-Host "##teamcity[progressStart 'Creating OS X App Package']"
if(Test-Path $outputFolderOsxApp)
{
Remove-Item -Recurse -Force $outputFolderOsxApp -ErrorAction Continue
}
Copy-Item .\osx\Sonarr.app $outputFolderOsxApp\Sonarr.app -recurse
Copy-Item $outputFolderOsx $outputFolderOsxApp\Sonarr.app\Contents\MacOS -recurse
Write-Host "##teamcity[progressFinish 'Creating OS X App Package']"
}
Function AddJsonNet()
{
get-childitem $outputFolder -File -Filter Newtonsoft.Json.* -Recurse | foreach ($_) {remove-item $_.fullname}
Copy-Item .\src\packages\Newtonsoft.Json.*.*\lib\net35\*.dll -Destination $outputFolder
Copy-Item .\src\packages\Newtonsoft.Json.*.*\lib\net35\*.dll -Destination $outputFolder\NzbDrone.Update
}
Function PackageTests()
{
Write-Host Packaging Tests
Write-Host "##teamcity[progressStart 'Creating Test Package']"
if(Test-Path $testPackageFolder)
{
Remove-Item -Recurse -Force $testPackageFolder -ErrorAction Continue
}
Get-ChildItem -Recurse -Directory | Where-Object {$_.FullName -like $testSearchPattern} | foreach($_){
Copy-Item -Recurse ($_.FullName + "\*") $testPackageFolder -ErrorAction Ignore
}
.\src\.nuget\NuGet.exe install NUnit.Runners -Version 2.6.1 -Output $testPackageFolder
Copy-Item $outputFolder\*.dll -Destination $testPackageFolder -Force
Copy-Item $outputFolder\*.pdb -Destination $testPackageFolder -Force
Copy-Item .\*.sh -Destination $testPackageFolder -Force
Write-Host Creating MDBs for tests
get-childitem $testPackageFolder -File -Include @("*.exe", "*.dll") -Exclude @("MediaInfo.dll", "sqlite3.dll") -Recurse | foreach ($_) {
Write-Host "Creating .mdb for $_"
& "tools\pdb2mdb\pdb2mdb.exe" $_.fullname
}
get-childitem $testPackageFolder -File -Filter *log.config | foreach ($_) {remove-item $_.fullname}
CleanFolder $testPackageFolder $true
Write-Host "Adding NzbDrone.Core.dll.config (for dllmap)"
Copy-Item "$sourceFolder\NzbDrone.Core\NzbDrone.Core.dll.config" -Destination $testPackageFolder -Force
Write-Host "##teamcity[progressFinish 'Creating Test Package']"
}
Function RunGulp()
{
Write-Host "##teamcity[progressStart 'Running Gulp']"
Invoke-Expression 'npm install'
CheckExitCode
Invoke-Expression 'gulp build' -ErrorAction Continue -Verbose
CheckExitCode
Write-Host "##teamcity[progressFinish 'Running Gulp']"
}
Function CheckExitCode()
{
if ($lastexitcode -ne 0)
{
Write-Host $errorMessage
exit 1
}
}
Function CleanupWindowsPackage()
{
Write-Host Removing NzbDrone.Mono
get-childitem $outputFolder -File -Filter NzbDrone.Mono.* -Recurse | foreach ($_) {remove-item $_.fullname}
Write-Host Adding NzbDrone.Windows to UpdatePackage
Copy-Item $outputFolder\* $updateFolder -Filter NzbDrone.Windows.*
}
Build
RunGulp
PackageMono
PackageOsx
PackageOsxApp
PackageTests
CleanupWindowsPackage
-265
View File
@@ -1,265 +0,0 @@
#! /bin/bash
msBuild='/c/Program Files (x86)/MSBuild/14.0/Bin'
outputFolder='./_output'
outputFolderMono='./_output_mono'
outputFolderOsx='./_output_osx'
outputFolderOsxApp='./_output_osx_app'
testPackageFolder='./_tests/'
testSearchPattern='*.Test/bin/x86/Release'
sourceFolder='./src'
slnFile=$sourceFolder/NzbDrone.sln
updateFolder=$outputFolder/NzbDrone.Update
updateFolderMono=$outputFolderMono/NzbDrone.Update
nuget='tools/nuget/nuget.exe';
CheckExitCode()
{
"$@"
local status=$?
if [ $status -ne 0 ]; then
echo "error with $1" >&2
exit 1
fi
return $status
}
CleanFolder()
{
local path=$1
local keepConfigFiles=$2
find $path -name "*.transform" -exec rm "{}" \;
if [ $keepConfigFiles != true ] ; then
find $path -name "*.dll.config" -exec rm "{}" \;
fi
echo "Removing FluentValidation.Resources files"
find $path -name "FluentValidation.resources.dll" -exec rm "{}" \;
find $path -name "App.config" -exec rm "{}" \;
echo "Removing .less files"
find $path -name "*.less" -exec rm "{}" \;
echo "Removing vshost files"
find $path -name "*.vshost.exe" -exec rm "{}" \;
echo "Removing dylib files"
find $path -name "*.dylib" -exec rm "{}" \;
echo "Removing Empty folders"
find $path -depth -empty -type d -exec rm -r "{}" \;
}
AddJsonNet()
{
rm $outputFolder/Newtonsoft.Json.*
cp $sourceFolder/packages/Newtonsoft.Json.*/lib/net35/*.dll $outputFolder
cp $sourceFolder/packages/Newtonsoft.Json.*/lib/net35/*.dll $outputFolder/NzbDrone.Update
}
BuildWithMSBuild()
{
export PATH=$msBuild:$PATH
CheckExitCode MSBuild.exe $slnFile //t:Clean //m
$nuget restore $slnFile
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb
}
BuildWithXbuild()
{
export MONO_IOMAP=case
CheckExitCode xbuild /t:Clean $slnFile
mono $nuget restore $slnFile
CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile
}
Build()
{
echo "##teamcity[progressStart 'Build']"
rm -rf $outputFolder
if [ $runtime = "dotnet" ] ; then
BuildWithMSBuild
else
BuildWithXbuild
fi
CleanFolder $outputFolder false
AddJsonNet
echo "Removing Mono.Posix.dll"
rm $outputFolder/Mono.Posix.dll
echo "##teamcity[progressFinish 'Build']"
}
RunGulp()
{
echo "##teamcity[progressStart 'npm install']"
npm-cache install npm || CheckExitCode npm install
echo "##teamcity[progressFinish 'npm install']"
echo "##teamcity[progressStart 'Running gulp']"
CheckExitCode npm run build
echo "##teamcity[progressFinish 'Running gulp']"
}
CreateMdbs()
{
local path=$1
if [ $runtime = "dotnet" ] ; then
local pdbFiles=( $(find $path -name "*.pdb") )
for filename in "${pdbFiles[@]}"
do
if [ -e ${filename%.pdb}.dll ] ; then
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.dll
fi
if [ -e ${filename%.pdb}.exe ] ; then
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.exe
fi
done
fi
}
PackageMono()
{
echo "##teamcity[progressStart 'Creating Mono Package']"
rm -rf $outputFolderMono
cp -r $outputFolder $outputFolderMono
echo "Creating MDBs"
CreateMdbs $outputFolderMono
echo "Removing PDBs"
find $outputFolderMono -name "*.pdb" -exec rm "{}" \;
echo "Removing Service helpers"
rm -f $outputFolderMono/ServiceUninstall.*
rm -f $outputFolderMono/ServiceInstall.*
echo "Removing native windows binaries Sqlite, MediaInfo"
rm -f $outputFolderMono/sqlite3.*
rm -f $outputFolderMono/MediaInfo.*
echo "Adding NzbDrone.Core.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Core/NzbDrone.Core.dll.config $outputFolderMono
echo "Adding CurlSharp.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Common/CurlSharp.dll.config $outputFolderMono
echo "Renaming NzbDrone.Console.exe to NzbDrone.exe"
rm $outputFolderMono/NzbDrone.exe*
for file in $outputFolderMono/NzbDrone.Console.exe*; do
mv "$file" "${file//.Console/}"
done
echo "Removing NzbDrone.Windows"
rm $outputFolderMono/NzbDrone.Windows.*
echo "Adding NzbDrone.Mono to UpdatePackage"
cp $outputFolderMono/NzbDrone.Mono.* $updateFolderMono
echo "##teamcity[progressFinish 'Creating Mono Package']"
}
PackageOsx()
{
echo "##teamcity[progressStart 'Creating OS X Package']"
rm -rf $outputFolderOsx
cp -r $outputFolderMono $outputFolderOsx
echo "Adding sqlite dylibs"
cp $sourceFolder/Libraries/Sqlite/*.dylib $outputFolderOsx
echo "Adding MediaInfo dylib"
cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderOsx
echo "Adding Startup script"
cp ./osx/Sonarr $outputFolderOsx
echo "##teamcity[progressFinish 'Creating OS X Package']"
}
PackageOsxApp()
{
echo "##teamcity[progressStart 'Creating OS X App Package']"
rm -rf $outputFolderOsxApp
mkdir $outputFolderOsxApp
cp -r ./osx/Radarr.app $outputFolderOsxApp
cp -r $outputFolderOsx $outputFolderOsxApp/Radarr.app/Contents/MacOS
echo "##teamcity[progressFinish 'Creating OS X App Package']"
}
PackageTests()
{
echo "Packaging Tests"
echo "##teamcity[progressStart 'Creating Test Package']"
rm -rf $testPackageFolder
mkdir $testPackageFolder
find $sourceFolder -path $testSearchPattern -exec cp -r -u -T "{}" $testPackageFolder \;
if [ $runtime = "dotnet" ] ; then
$nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
else
mono $nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
fi
cp $outputFolder/*.dll $testPackageFolder
cp ./*.sh $testPackageFolder
echo "Creating MDBs for tests"
CreateMdbs $testPackageFolder
rm -f $testPackageFolder/*.log.config
CleanFolder $testPackageFolder true
echo "Adding NzbDrone.Core.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Core/NzbDrone.Core.dll.config $testPackageFolder
echo "Adding CurlSharp.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Common/CurlSharp.dll.config $testPackageFolder
echo "Copying CurlSharp libraries"
cp $sourceFolder/ExternalModules/CurlSharp/libs/i386/* $testPackageFolder
echo "##teamcity[progressFinish 'Creating Test Package']"
}
CleanupWindowsPackage()
{
echo "Removing NzbDrone.Mono"
rm -f $outputFolder/NzbDrone.Mono.*
echo "Adding NzbDrone.Windows to UpdatePackage"
cp $outputFolder/NzbDrone.Windows.* $updateFolder
}
# Use mono or .net depending on OS
case "$(uname -s)" in
CYGWIN*|MINGW32*|MINGW64*|MSYS*)
# on windows, use dotnet
runtime="dotnet"
;;
*)
# otherwise use mono
runtime="mono"
;;
esac
Build
RunGulp
PackageMono
PackageOsx
PackageOsxApp
PackageTests
CleanupWindowsPackage
+50
View File
@@ -0,0 +1,50 @@
<Query Kind="Program" />
void Main()
{
var files = Directory.GetFiles("c:\\git\\sonarr\\src\\UI","*.js", SearchOption.AllDirectories);
var moduleRegex = new Regex(@"module.exports\s*=\s*\(function\s*\(\)\s*{\n\s*return\s*(\w|\W)*\)\.call\(this\);$");
var functionHead = new Regex(@"\s*\(function\s*\(\)\s*{\n\s*return\s*");
var functionTail = new Regex(@"\}\).call\(this\);$");
var multiVar = new Regex(@"^(?<d>var\s*\w*\s*=\s*require\(.*\)),");
var seperateDeclearatuin = new Regex(@"^((\w|\$|_)*\s=\srequire\(.*\))(,|;)", RegexOptions.Multiline);
foreach (var filePath in files)
{
var text = File.ReadAllText(filePath);
var newContent = text.Replace("// Generated by uRequire v0.7.0-beta.14 template: 'nodejs'","");
newContent = newContent.Replace("var __isAMD = !!(typeof define === 'function' && define.amd),","");
newContent = newContent.Replace("__isNode = (typeof exports === 'object'),","");
newContent = newContent.Replace("__isWeb = !__isNode;","");
newContent = newContent.Replace("\"use strict\";","'use strict';");
newContent = newContent.Trim();
if(moduleRegex.IsMatch(newContent))
{
filePath.Dump();
newContent = functionHead.Replace(newContent," ");
newContent = functionTail.Replace(newContent,"");
}
if(multiVar.IsMatch(newContent))
{
newContent = multiVar.Replace(newContent,"$1;"); //first one
}
newContent = seperateDeclearatuin.Replace(newContent,"var $1;"); //ones after
newContent.Replace("var $ = require('jquery'), var","var $ = require('jquery');");
File.WriteAllText(filePath,newContent.Trim());
}
}
// Define other methods and classes here
+1 -1
View File
@@ -3,7 +3,7 @@ Upstream-Name: nzbdrone
Source: https://github.com/Sonarr/Sonarr Source: https://github.com/Sonarr/Sonarr
Files: * Files: *
Copyright: 2010-2016 Sonarr <hello@sonarr.tv> Copyright: 2010-2014 Sonarr <hello@sonarr.tv>
License: GPL-3.0+ License: GPL-3.0+
+3 -9
View File
@@ -6,13 +6,7 @@ require('./less');
require('./handlebars'); require('./handlebars');
require('./copy'); require('./copy');
gulp.task('build', function() { gulp.task('build', function () {
return runSequence('clean', [ return runSequence('clean',
'webpack', ['webpack', 'less', 'handlebars', 'copyHtml', 'copyContent', 'copyJs']);
'less',
'handlebars',
'copyHtml',
'copyContent',
'copyJs'
]);
}); });
+2 -2
View File
@@ -3,6 +3,6 @@ var del = require('del');
var paths = require('./paths'); var paths = require('./paths');
gulp.task('clean', function(cb) { gulp.task('clean', function (cb) {
del([paths.dest.root], cb); del([paths.dest.root], cb);
}); });
+13 -17
View File
@@ -1,31 +1,27 @@
var gulp = require('gulp'); var gulp = require('gulp');
var print = require('gulp-print'); var print = require('gulp-print');
var cache = require('gulp-cached'); var cache = require('gulp-cached');
var livereload = require('gulp-livereload');
var paths = require('./paths.js'); var paths = require('./paths.js');
gulp.task('copyJs', function () { gulp.task('copyJs', function () {
return gulp.src( return gulp.src(
[ [
paths.src.root + 'polyfills.js', paths.src.root + "polyfills.js",
paths.src.root + 'JsLibraries/handlebars.runtime.js' paths.src.root + "JsLibraries/handlebars.runtime.js",
]) ])
.pipe(cache('copyJs')) .pipe(cache('copyJs'))
.pipe(print()) .pipe(print())
.pipe(gulp.dest(paths.dest.root)) .pipe(gulp.dest(paths.dest.root));
.pipe(livereload());
}); });
gulp.task('copyHtml', function () { gulp.task('copyHtml', function () {
return gulp.src(paths.src.html) return gulp.src(paths.src.html)
.pipe(cache('copyHtml')) .pipe(cache('copyHtml'))
.pipe(gulp.dest(paths.dest.root)) .pipe(gulp.dest(paths.dest.root));
.pipe(livereload());
}); });
gulp.task('copyContent', function () { gulp.task('copyContent', function () {
return gulp.src([paths.src.content + '**/*.*', '!**/*.less']) return gulp.src([paths.src.content + '**/*.*', '!**/*.less'])
.pipe(gulp.dest(paths.dest.content)) .pipe(gulp.dest(paths.dest.content));
.pipe(livereload());
}); });
+2 -2
View File
@@ -1,7 +1,7 @@
module.exports = { module.exports = {
onError : function(error) { onError:function (error) {
//If you want details of the error in the console //If you want details of the error in the console
console.log(error.toString()); console.log(error.toString());
this.emit('end'); this.emit('end');
} }
}; }
+2 -1
View File
@@ -8,4 +8,5 @@ require('./less.js');
require('./stripBom.js'); require('./stripBom.js');
require('./imageMin.js'); require('./imageMin.js');
require('./webpack.js'); require('./webpack.js');
require('./start.js');
+13 -16
View File
@@ -3,25 +3,21 @@ var handlebars = require('gulp-handlebars');
var declare = require('gulp-declare'); var declare = require('gulp-declare');
var concat = require('gulp-concat'); var concat = require('gulp-concat');
var wrap = require("gulp-wrap"); var wrap = require("gulp-wrap");
var livereload = require('gulp-livereload');
var path = require('path'); var path = require('path');
var streamqueue = require('streamqueue'); var streamqueue = require('streamqueue');
var stripbom = require('gulp-stripbom'); var stripbom = require('gulp-stripbom');
var paths = require('./paths.js'); var paths = require('./paths.js');
gulp.task('handlebars', function() { gulp.task('handlebars', function () {
var coreStream = gulp.src([ var coreStream = gulp.src([paths.src.templates, '!*/**/*Partial.*'])
paths.src.templates, .pipe(stripbom({ showLog: false }))
'!*/**/*Partial.*'
])
.pipe(stripbom({ showLog : false }))
.pipe(handlebars()) .pipe(handlebars())
.pipe(declare({ .pipe(declare({
namespace : 'T', namespace: 'T',
noRedeclare : true, noRedeclare: true,
processName : function(filePath) { processName: function (filePath) {
filePath = path.relative(paths.src.root, filePath); filePath = path.relative(paths.src.root, filePath);
@@ -33,12 +29,12 @@ gulp.task('handlebars', function() {
})); }));
var partialStream = gulp.src([paths.src.partials]) var partialStream = gulp.src([paths.src.partials])
.pipe(stripbom({ showLog : false })) .pipe(stripbom({ showLog: false }))
.pipe(handlebars()) .pipe(handlebars())
.pipe(wrap('Handlebars.template(<%= contents %>)')) .pipe(wrap('Handlebars.template(<%= contents %>)'))
.pipe(wrap('Handlebars.registerPartial(<%= processPartialName(file.relative) %>, <%= contents %>)', {}, { .pipe(wrap('Handlebars.registerPartial(<%= processPartialName(file.relative) %>, <%= contents %>)', {}, {
imports : { imports: {
processPartialName : function(fileName) { processPartialName: function (fileName) {
return JSON.stringify( return JSON.stringify(
path.basename(fileName, '.js') path.basename(fileName, '.js')
); );
@@ -46,10 +42,11 @@ gulp.task('handlebars', function() {
} }
})); }));
return streamqueue({ objectMode : true },
return streamqueue({ objectMode: true },
partialStream, partialStream,
coreStream coreStream
).pipe(concat('templates.js')) ).pipe(concat('templates.js'))
.pipe(gulp.dest(paths.dest.root))
.pipe(livereload()); .pipe(gulp.dest(paths.dest.root));
}); });
+5 -4
View File
@@ -2,13 +2,14 @@ var gulp = require('gulp');
var print = require('gulp-print'); var print = require('gulp-print');
var paths = require('./paths.js'); var paths = require('./paths.js');
gulp.task('imageMin', function() {
gulp.task('imageMin', function () {
var imagemin = require('gulp-imagemin'); var imagemin = require('gulp-imagemin');
return gulp.src(paths.src.images) return gulp.src(paths.src.images)
.pipe(imagemin({ .pipe(imagemin({
progressive : false, progressive: false,
optimizationLevel : 4, optimizationLevel :4,
svgoPlugins : [{ removeViewBox : false }] svgoPlugins: [{removeViewBox: false}]
})) }))
.pipe(print()) .pipe(print())
.pipe(gulp.dest(paths.src.content + 'Images/')); .pipe(gulp.dest(paths.src.content + 'Images/'));
+3 -5
View File
@@ -4,11 +4,9 @@ var stylish = require('jshint-stylish');
var cache = require('gulp-cached'); var cache = require('gulp-cached');
var paths = require('./paths.js'); var paths = require('./paths.js');
gulp.task('jshint', function() {
return gulp.src([ gulp.task('jshint', function () {
paths.src.scripts, return gulp.src([paths.src.scripts, paths.src.exclude.libs])
paths.src.exclude.libs
])
.pipe(cache('jshint')) .pipe(cache('jshint'))
.pipe(jshint()) .pipe(jshint())
.pipe(jshint.reporter(stylish)); .pipe(jshint.reporter(stylish));
+23 -38
View File
@@ -1,49 +1,34 @@
var gulp = require('gulp'); var gulp = require('gulp');
var less = require('gulp-less'); var less = require('gulp-less');
var postcss = require('gulp-postcss');
var sourcemaps = require('gulp-sourcemaps');
var autoprefixer = require('autoprefixer-core');
var livereload = require('gulp-livereload');
var print = require('gulp-print'); var print = require('gulp-print');
var paths = require('./paths'); var paths = require('./paths');
var errorHandler = require('./errorHandler'); var errorHandler = require('./errorHandler');
gulp.task('less', function() { gulp.task('less', function () {
return gulp.src([
var src = [ paths.src.content + 'bootstrap.less',
paths.src.content + 'bootstrap.less', paths.src.content + 'theme.less',
paths.src.content + 'theme.less', paths.src.content + 'overrides.less',
paths.src.content + 'overrides.less', paths.src.root + 'Series/series.less',
paths.src.root + 'Series/series.less', paths.src.root + 'Activity/activity.less',
paths.src.root + 'Activity/activity.less', paths.src.root + 'AddSeries/addSeries.less',
paths.src.root + 'AddSeries/addSeries.less', paths.src.root + 'Calendar/calendar.less',
paths.src.root + 'AddMovies/addMovies.less', paths.src.root + 'Cells/cells.less',
paths.src.root + 'Calendar/calendar.less', paths.src.root + 'ManualImport/manualimport.less',
paths.src.root + 'Cells/cells.less', paths.src.root + 'Settings/settings.less',
paths.src.root + 'ManualImport/manualimport.less', paths.src.root + 'System/Logs/logs.less',
paths.src.root + 'Settings/settings.less', paths.src.root + 'System/Update/update.less',
paths.src.root + 'System/Logs/logs.less', paths.src.root + 'System/Info/info.less',
paths.src.root + 'System/Update/update.less', ])
paths.src.root + 'System/Info/info.less',
paths.src.root + 'Movies/movies.less',
];
return gulp.src(src)
.pipe(print()) .pipe(print())
.pipe(sourcemaps.init())
.pipe(less({ .pipe(less({
dumpLineNumbers : 'false', dumpLineNumbers: 'false',
compress : true, compress: true,
yuicompress : true, yuicompress: true,
ieCompat : true, ieCompat: true,
strictImports : true strictImports: true
})) }))
.pipe(postcss([ autoprefixer({ browsers: ['last 2 versions'] }) ]))
.on('error', errorHandler.onError) .on('error', errorHandler.onError)
.pipe(sourcemaps.write(paths.dest.content)) .pipe(gulp.dest(paths.dest.content));
.pipe(gulp.dest(paths.dest.content))
.pipe(livereload());
}); });
+15 -17
View File
@@ -1,21 +1,19 @@
var paths = { module.exports = {
src : { src: {
root : './src/UI/', root: './src/UI/',
templates : './src/UI/**/*.hbs', templates: './src/UI/**/*.hbs',
html : './src/UI/*.html', html: './src/UI/*.html',
partials : './src/UI/**/*Partial.hbs', partials: './src/UI/**/*Partial.hbs',
scripts : './src/UI/**/*.js', scripts: './src/UI/**/*.js',
less : ['./src/UI/**/*.less'], less: ['./src/UI/**/*.less'],
content : './src/UI/Content/', content: './src/UI/Content/',
images : './src/UI/Content/Images/**/*', images: './src/UI/Content/Images/**/*',
exclude : { exclude :{
libs : '!./src/UI/JsLibraries/**' libs:'!./src/UI/JsLibraries/**'
} }
}, },
dest : { dest: {
root : './_output/UI/', root: './_output/UI/',
content : './_output/UI/Content/' content: './_output/UI/Content/'
} }
}; };
module.exports = paths;
-112
View File
@@ -1,112 +0,0 @@
// will download and run sonarr (server) in a non-windows enviroment
// you can use this if you don't care about the server code and just want to work
// with the web code.
var http = require('http');
var gulp = require('gulp');
var fs = require('fs');
var targz = require('tar.gz');
var del = require('del');
var print = require('gulp-print');
var spawn = require('child_process').spawn;
function download(url, dest, cb) {
console.log('Downloading ' + url + ' to ' + dest);
var file = fs.createWriteStream(dest);
var request = http.get(url, function (response) {
response.pipe(file);
file.on('finish', function () {
console.log('Download completed');
file.close(cb);
});
});
}
function getLatest(cb) {
var branch = 'develop';
process.argv.forEach(function (val) {
var branchMatch = /branch=([\S]*)/.exec(val);
if (branchMatch && branchMatch.length > 1) {
branch = branchMatch[1];
}
});
var url = 'http://services.sonarr.tv/v1/update/' + branch + '?os=osx';
console.log('Checking for latest version:', url);
http.get(url, function (res) {
var data = '';
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function () {
var updatePackage = JSON.parse(data).updatePackage;
console.log('Latest version available: ' + updatePackage.version + ' Release Date: ' + updatePackage.releaseDate);
cb(updatePackage);
});
}).on('error', function (e) {
console.log('problem with request: ' + e.message);
});
}
function extract(source, dest, cb) {
console.log('extracting download page to ' + dest);
new targz().extract(source, dest, function (err) {
if (err) {
console.log(err);
}
console.log('Update package extracted.');
cb();
});
}
gulp.task('getSonarr', function () {
//gulp.src('/Users/kayone/git/Sonarr/_start/2.0.0.3288/NzbDrone/*.*')
// .pipe(print())
// .pipe(gulp.dest('./_output
//return;
try {
fs.mkdirSync('./_start/');
} catch (e) {
if (e.code != 'EEXIST') {
throw e;
}
}
getLatest(function (package) {
var packagePath = "./_start/" + package.filename;
var dirName = "./_start/" + package.version;
download(package.url, packagePath, function () {
extract(packagePath, dirName, function () {
// clean old binaries
console.log('Cleaning old binaries');
del.sync(['./_output/*', '!./_output/UI/']);
console.log('copying binaries to target');
gulp.src(dirName + '/NzbDrone/*.*')
.pipe(gulp.dest('./_output/'));
});
});
});
});
gulp.task('startSonarr', function () {
var ls = spawn('mono', ['--debug', './_output/NzbDrone.exe']);
ls.stdout.on('data', function (data) {
process.stdout.write('' + data);
});
ls.stderr.on('data', function (data) {
process.stdout.write('' + data);
});
ls.on('close', function (code) {
console.log('child process exited with code ' + code);
});
});
-4
View File
@@ -7,10 +7,6 @@ var stripBom = function (dest) {
.pipe(stripbom({ showLog: false })) .pipe(stripbom({ showLog: false }))
.pipe(gulp.dest(dest)); .pipe(gulp.dest(dest));
gulp.src(paths.src.less)
.pipe(stripbom({ showLog: false }))
.pipe(gulp.dest(dest));
gulp.src(paths.src.templates) gulp.src(paths.src.templates)
.pipe(stripbom({ showLog: false })) .pipe(stripbom({ showLog: false }))
.pipe(gulp.dest(dest)); .pipe(gulp.dest(dest));
+23 -10
View File
@@ -1,5 +1,6 @@
var gulp = require('gulp'); var gulp = require('gulp');
var livereload = require('gulp-livereload'); //var livereload = require('gulp-livereload');
var paths = require('./paths.js'); var paths = require('./paths.js');
@@ -9,12 +10,24 @@ require('./less.js');
require('./copy.js'); require('./copy.js');
require('./webpack.js'); require('./webpack.js');
gulp.task('watch', ['jshint', 'handlebars', 'less', 'copyHtml', 'copyContent', 'copyJs'], function () {
livereload.listen(); gulp.task('watch', ['jshint', 'handlebars', 'less','copyHtml', 'copyContent','copyJs'], function () {
gulp.start('webpackWatch'); gulp.start('webpackWatch');
gulp.watch([paths.src.scripts, paths.src.exclude.libs], ['jshint', 'copyJs']); gulp.watch([paths.src.scripts, paths.src.exclude.libs], ['jshint','copyJs']);
gulp.watch(paths.src.templates, ['handlebars']); gulp.watch(paths.src.templates, ['handlebars']);
gulp.watch([paths.src.less, paths.src.exclude.libs], ['less']); gulp.watch([paths.src.less, paths.src.exclude.libs], ['less']);
gulp.watch([paths.src.html], ['copyHtml']); gulp.watch([paths.src.html], ['copyHtml']);
gulp.watch([paths.src.content + '**/*.*', '!**/*.less'], ['copyContent']); gulp.watch([paths.src.content + '**/*.*', '!**/*.less'], ['copyContent']);
}); });
gulp.task('liveReload', ['jshint', 'handlebars', 'less', 'webPack'], function () {
var server = livereload();
gulp.watch([
'app/**/*.js',
'app/**/*.css',
'app/index.html',
'app/login.html'
]).on('change', function (file) {
server.changed(file.path);
});
});
+12 -5
View File
@@ -1,13 +1,20 @@
var gulp = require('gulp'); var gulp = require('gulp');
var webpackStream = require('webpack-stream');
var livereload = require('gulp-livereload'); var gulpWebpack = require('gulp-webpack');
var webpack = require('webpack');
var webpackConfig = require('../webpack.config'); var webpackConfig = require('../webpack.config');
webpackConfig.devtool = "#source-map";
gulp.task('webpack', function() { gulp.task('webpack', function() {
return gulp.src('main.js').pipe(webpackStream(webpackConfig)).pipe(gulp.dest('')); return gulp.src('main.js')
.pipe(gulpWebpack(webpackConfig, webpack))
.pipe(gulp.dest(''));
}); });
gulp.task('webpackWatch', function() { gulp.task('webpackWatch', function() {
webpackConfig.watch = true; webpackConfig.watch = true;
return gulp.src('main.js').pipe(webpackStream(webpackConfig)).pipe(gulp.dest('')).pipe(livereload()); return gulp.src('main.js')
.pipe(gulpWebpack(webpackConfig, webpack))
.pipe(gulp.dest(''));
}); });
+7
View File
@@ -0,0 +1,7 @@
EXCLUDE="-exclude:Windows -include:IntegrationTest"
TESTDIR="."
NUNIT="$TESTDIR/NUnit.Runners.2.6.1/tools/nunit-console-x86.exe"
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Api.Result.xml $TESTDIR/NzbDrone.Api.Test.dll
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Core.Result.xml $TESTDIR/NzbDrone.Core.Test.dll
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Integration.Result.xml $TESTDIR/NzbDrone.Integration.Test.dll
+6 -23
View File
@@ -1,31 +1,17 @@
#!/bin/sh #!/bin/sh
#get the bundle's MacOS directory full path #get the bundle's MacOS directory full path
DIR=$(cd "$(dirname "$0")"; pwd) DIR=$(cd "$(dirname "$0")"; pwd)
#change these values to match your app #change these values to match your app
EXE_PATH="$DIR/NzbDrone.exe" EXE_PATH="$DIR/NzbDrone.exe"
APPNAME="Sonarr" APPNAME="Sonarr"
#set up environment #set up environment
if [[ -x '/opt/local/bin/mono' ]]; then MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export PATH="/opt/local/bin:$PATH" export DYLD_FALLBACK_LIBRARY_PATH="$DIR:$MONO_FRAMEWORK_PATH/lib:/lib:/usr/lib"
fi export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
export DYLD_FALLBACK_LIBRARY_PATH="$DIR"
if [ -e /Library/Frameworks/Mono.framework ]; then
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$MONO_FRAMEWORK_PATH/lib"
fi
if [[ -f '/opt/local/lib/libsqlite3.0.dylib' ]]; then
export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH"
fi
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$HOME/lib:/usr/local/lib:/lib:/usr/lib"
#mono version check #mono version check
REQUIRED_MAJOR=3 REQUIRED_MAJOR=3
REQUIRED_MINOR=10 REQUIRED_MINOR=10
@@ -35,9 +21,6 @@ VERSION_MSG="$APPNAME requires Mono Runtime Environment(MRE) $REQUIRED_MAJOR.$RE
DOWNLOAD_URL="http://www.mono-project.com/download/#download-mac" DOWNLOAD_URL="http://www.mono-project.com/download/#download-mac"
MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )" MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )"
# if [[ -o DEBUG ]]; then osascript -e "display dialog \"MONO_VERSION: $MONO_VERSION\""; fi
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)" MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)" MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
if [ -z "$MONO_VERSION" ] \ if [ -z "$MONO_VERSION" ] \
+18 -25
View File
@@ -4,43 +4,36 @@
"description": "Sonarr", "description": "Sonarr",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {
"build": "gulp build", "preinstall": ""
"start": "gulp watch"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/Sonarr/Sonarr.git" "url": "git://github.com/Sonarr/Sonarr.git"
}, },
"author": "", "author": "",
"license": "GPL-3.0", "license": "BSD",
"gitHead": "9ff7aa1bf7fe38c4c5bdb92f56c8ad556916ed67", "gitHead": "9ff7aa1bf7fe38c4c5bdb92f56c8ad556916ed67",
"readmeFilename": "readme.md", "readmeFilename": "readme.md",
"dependencies": { "dependencies": {
"autoprefixer-core": "5.2.1", "del": "1.1.1",
"del": "1.2.0", "gulp": "3.8.10",
"gulp": "3.9.0", "gulp-cached": "1.0.2",
"gulp-cached": "1.1.0", "gulp-concat": "2.4.3",
"gulp-concat": "2.6.0",
"gulp-declare": "0.3.0", "gulp-declare": "0.3.0",
"gulp-handlebars": "3.0.1", "gulp-handlebars": "3.0.1",
"gulp-jshint": "1.11.2", "gulp-jshint": "1.9.2",
"gulp-less": "3.0.3", "gulp-less": "2.0.1",
"gulp-livereload": "3.8.0",
"gulp-postcss": "6.0.0",
"gulp-print": "1.1.0", "gulp-print": "1.1.0",
"gulp-replace": "0.5.3", "gulp-replace": "0.5.2",
"gulp-run": "1.6.8",
"gulp-sourcemaps": "1.5.2",
"gulp-stripbom": "1.0.4", "gulp-stripbom": "1.0.4",
"gulp-webpack": "1.5.0", "gulp-run": "1.6.6",
"gulp-wrap": "0.11.0", "gulp-webpack": "1.2.0",
"handlebars": "3.0.3", "gulp-wrap": "0.10.1",
"jshint-loader": "0.8.3", "handlebars": "2.0.0",
"jshint-stylish": "2.0.1", "jshint-loader": "0.8.1",
"run-sequence": "1.1.1", "jshint-stylish": "1.0.0",
"streamqueue": "1.1.0", "run-sequence": "1.0.2",
"tar.gz": "0.1.1", "streamqueue": "0.1.1",
"webpack": "1.12.0", "webpack": "1.5.3"
"webpack-stream": "2.1.0"
} }
} }
-50
View File
@@ -1,50 +0,0 @@
if [ $# -eq 0 ]; then
if [ "$TRAVIS_PULL_REQUEST" != false ]; then
echo "Need to supply version argument" && exit;
fi
fi
if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
VERSION="`date +%H:%M:%S`"
YEAR="`date +%Y`"
MONTH="`date +%m`"
DAY="`date +%d`"
else
VERSION=$1
fi
outputFolder='./_output'
outputFolderMono='./_output_mono'
outputFolderOsx='./_output_osx'
outputFolderOsxApp='./_output_osx_app'
tr -d "\r" < $outputFolderOsxApp/Sonarr.app/Contents/MacOS/Sonarr > $outputFolderOsxApp/Sonarr.app/Contents/MacOS/Sonarr2
rm $outputFolderOsxApp/Sonarr.app/Contents/MacOS/Sonarr
chmod +x $outputFolderOsxApp/Sonarr.app/Contents/MacOS/Sonarr2
mv $outputFolderOsxApp/Sonarr.app/Contents/MacOS/Sonarr2 $outputFolderOsxApp/Sonarr.app/Contents/MacOS/Sonarr >& error.log
cp -r $outputFolder/ Radarr_Windows_$VERSION
cp -r $outputFolderMono/ Radarr_Mono_$VERSION
cp -r $outputFolderOsxApp/ Radarr_OSX_$VERSION
zip -r Radarr_Windows_$VERSION.zip Radarr_Windows_$VERSION >& /dev/null
zip -r Radarr_Mono_$VERSION.zip Radarr_Mono_$VERSION >& /dev/null
zip -r Radarr_OSX_$VERSION.zip Radarr_OSX_$VERSION >& /dev/null
ftp -n ftp.leonardogalli.ch << END_SCRIPT
passive
quote USER $FTP_USER
quote PASS $FTP_PASS
mkdir builds
cd builds
mkdir $YEAR
cd $YEAR
mkdir $MONTH
cd $MONTH
mkdir $DAY
cd $DAY
binary
put Radarr_Windows_$VERSION.zip
put Radarr_Mono_$VERSION.zip
put Radarr_OSX_$VERSION.zip
quit
END_SCRIPT
+11 -28
View File
@@ -1,30 +1,11 @@
# Radarr [![Build Status](https://travis-ci.org/galli-leo/Radarr.svg?branch=develop)](https://travis-ci.org/galli-leo/Radarr)# # Sonarr #
This fork of Sonarr aims to turn it into something like Couchpotato.
## Currently working: Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.
* Adding new movies
* Manually searching for releases of movies.
* Automatically searching for releases.
* Rarbg.to indexer (Other indexers are coming, I just need to find the right categories)
* QBittorrent download client (Other clients are coming)
## Planned Features:
* Scanning PreDB to know when a new release is available.
* Fixing the other Indexers and download clients.
* Fixing how movies are parsed.
* Fixing movie import.
* Importing of Sonarr config.
* New TorrentPotato Indexer.
## Download
The latest precompiled binary versions can be found here: https://github.com/galli-leo/Radarr/releases.
For more up to date versions (but also sometimes broken), daily builds can be found here: https://leonardogalli.ch/radarr/builds/.
## Major Features Include: ## ## Major Features Include: ##
* Support for major platforms: Windows, Linux, OSX, Raspberry Pi, etc. * Support for major platforms: Windows, Linux, OSX, Raspberry Pi, etc.
* Automatically detects new episodes * Automatically detects new episodes
* Can scan your existing library and download any missing episodes * Can scan your existing library and download any missing episodes
* Can watch for better quality of the episodes you already have and do an automatic upgrade. *eg. from DVD to Blu-Ray* * Can watch for better quality of the episodes you already have and do an automatic upgrade. *eg. from DVD to Blu-Ray*
@@ -36,32 +17,34 @@ For more up to date versions (but also sometimes broken), daily builds can be fo
* Full support for specials and multi-episode releases * Full support for specials and multi-episode releases
* And a beautiful UI * And a beautiful UI
## Configuring Development Environment: ## ## Configuring Development Environment: ##
### Requirements ### ### Requirements ###
- Visual Studio 2015 [Free Community Edition](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) or Mono - Visual Studio 2013 ([Express Edition](http://www.microsoft.com/visualstudio/eng/products/visual-studio-express-for-web "Express Edition") might work but not tested.)
- [Git](http://git-scm.com/downloads) - [Git](http://git-scm.com/downloads)
- [NodeJS](http://nodejs.org/download/) - [NodeJS](http://nodejs.org/download/)
- [Gulp](http://gulpjs.com)
### Setup ### ### Setup ###
- Make sure all the required software mentioned above are installed. - Make sure all the required software mentioned above are installed.
- Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories) - Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories)
- Grab the submodules `git submodule init && git submodule update`
- install the required Node Packages `npm install` - install the required Node Packages `npm install`
- start gulp to monitor your dev environment for any changes that need post processing using `npm start` command. - install gulp `npm install gulp -g`
- start gulp to monitor your dev environment for any changes that need post processing using `gulp watch` command.
*Please note gulp must be running at all times while you are working with Sonarr client source files.* *Please note gulp must be running at all times while you are working with NzbDrone client source files.*
### Development ### ### Development ###
- Open `NzbDrone.sln` in Visual Studio or run the build.sh script, if Mono is installed. - Open `NzbDrone.sln` in Visual Studio
- Make sure `NzbDrone.Console` is set as the startup project - Make sure `NzbDrone.Console` is set as the startup project
### License ### ### License ###
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html) * [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
Copyright 2010-2016 Copyright 2010-2014
### Sponsors ### ### Sponsors ###
+17
View File
@@ -0,0 +1,17 @@
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="A branch name is #requires required")]
[string]$branch,
[Parameter(Mandatory=$true, Position=1, HelpMessage="A version is required")]
[string]$version
)
if ($branch -eq "<default>")
{
$branch = "teamcity";
}
Write-Host $branch;
Write-Host $version;
Write-Host "NzbDrone.$branch.$version.zip";
Rename-Item "nzbdrone.zip" "NzbDrone.$branch.$version.zip"
-2
View File
@@ -75,8 +75,6 @@
<xs:enumeration value="seedtype" /> <!-- TBD, which criteria must be met. was going for 'ratio,seedtime,both' but afaik it's always 'either' --> <xs:enumeration value="seedtype" /> <!-- TBD, which criteria must be met. was going for 'ratio,seedtime,both' but afaik it's always 'either' -->
<xs:enumeration value="minimumratio" /> <xs:enumeration value="minimumratio" />
<xs:enumeration value="minimumseedtime" /> <xs:enumeration value="minimumseedtime" />
<xs:enumeration value="downloadvolumefactor" /> <!-- factor for the download volume, in most cases it should be set to 1, if a torrent is set to freeleech set it to 0, if only 50% is counted set it to 0.5 -->
<xs:enumeration value="uploadvolumefactor" /> <!-- factor for the upload volume, in most cases it should be set to 1, if a torrent is set to neutral leech (upload is not counted) set it to 0, if it's set to double upload set it to 2 -->
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:element name="attr"> <xs:element name="attr">
BIN
View File
Binary file not shown.
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
</configuration>
Binary file not shown.
+136
View File
@@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>
<!-- Enable the restore command to run before builds -->
<RestorePackages Condition=" '$(RestorePackages)' == '' ">false</RestorePackages>
<!-- Property that enables building a package from a project -->
<BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>
<!-- Determines if package restore consent is required to restore packages -->
<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>
<!-- Download NuGet.exe if it does not already exist -->
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageSources)' == '' ">
<!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
<!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
<!--
<PackageSource Include="https://www.nuget.org/api/v2/" />
<PackageSource Include="https://my-nuget-source/nuget/" />
-->
</ItemGroup>
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
<!-- Windows specific commands -->
<NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
<PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
</PropertyGroup>
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
<!-- We need to launch nuget.exe with the mono command if we're not on windows -->
<NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
<PackagesConfig>packages.config</PackagesConfig>
</PropertyGroup>
<PropertyGroup>
<!-- NuGet command -->
<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\NuGet.exe</NuGetExePath>
<PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>
<NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
<NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>
<PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>
<RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
<NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch>
<PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir>
<PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir>
<!-- Commands -->
<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>
<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>
<!-- We need to ensure packages are restored prior to assembly resolve -->
<BuildDependsOn Condition="$(RestorePackages) == 'true'">
RestorePackages;
$(BuildDependsOn);
</BuildDependsOn>
<!-- Make the build depend on restore packages -->
<BuildDependsOn Condition="$(BuildPackage) == 'true'">
$(BuildDependsOn);
BuildPackage;
</BuildDependsOn>
</PropertyGroup>
<Target Name="CheckPrerequisites">
<!-- Raise an error if we're unable to locate nuget.exe -->
<Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
<!--
Take advantage of MsBuild's build dependency tracking to make sure that we only ever download nuget.exe once.
This effectively acts as a lock that makes sure that the download operation will only happen once and all
parallel builds will have to wait for it to complete.
-->
<MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" />
</Target>
<Target Name="_DownloadNuGet">
<DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" />
</Target>
<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
<Exec Command="$(RestoreCommand)"
Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />
<Exec Command="$(RestoreCommand)"
LogStandardErrorAsError="true"
Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
</Target>
<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
<Exec Command="$(BuildCommand)"
Condition=" '$(OS)' != 'Windows_NT' " />
<Exec Command="$(BuildCommand)"
LogStandardErrorAsError="true"
Condition=" '$(OS)' == 'Windows_NT' " />
</Target>
<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<OutputFilename ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Core" />
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Using Namespace="System.Net" />
<Using Namespace="Microsoft.Build.Framework" />
<Using Namespace="Microsoft.Build.Utilities" />
<Code Type="Fragment" Language="cs">
<![CDATA[
try {
OutputFilename = Path.GetFullPath(OutputFilename);
Log.LogMessage("Downloading latest version of NuGet.exe...");
WebClient webClient = new WebClient();
webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename);
return true;
}
catch (Exception ex) {
Log.LogErrorFromException(ex);
return false;
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
Binary file not shown.
@@ -0,0 +1,9 @@
<?xml version ="1.0"?>
<!-- This allows mt.exe to run on machines with the CLR v4 installed but not 1.1 or 2.0 -->
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>
<supportedRuntime version="v1.1.4322"/>
</startup>
</configuration>
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -296,7 +296,7 @@ namespace LogentriesCore
WriteDebugMessages("HostName parameter is not defined - trying to get it from System.Environment.MachineName"); WriteDebugMessages("HostName parameter is not defined - trying to get it from System.Environment.MachineName");
m_HostName = "HostName=" + System.Environment.MachineName + " "; m_HostName = "HostName=" + System.Environment.MachineName + " ";
} }
catch (InvalidOperationException) catch (InvalidOperationException ex)
{ {
// Cannot get host name automatically, so assume that HostName is not used // Cannot get host name automatically, so assume that HostName is not used
// and log message is sent without it. // and log message is sent without it.
+7
View File
@@ -73,6 +73,13 @@
<PostBuildEvent> <PostBuildEvent>
</PostBuildEvent> </PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
@@ -1,4 +1,5 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
+9 -4
View File
@@ -51,9 +51,8 @@
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <Reference Include="NLog">
<HintPath>..\packages\NLog.4.3.11\lib\net40\NLog.dll</HintPath> <HintPath>..\packages\NLog.2.1.0\lib\net40\NLog.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
@@ -80,13 +79,19 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="fastJSON\license.txt" /> <None Include="fastJSON\license.txt" />
<None Include="packages.config" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent> <PostBuildEvent>
</PostBuildEvent> </PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
@@ -1,4 +1,5 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
+6 -7
View File
@@ -24,7 +24,6 @@ namespace LogentriesNLog.fastJSON
SerializeNullValues = false; SerializeNullValues = false;
UseOptimizedDatasetSchema = false; UseOptimizedDatasetSchema = false;
UsingGlobalTypes = false; UsingGlobalTypes = false;
UseUTCDateTime = true;
} }
public bool UseOptimizedDatasetSchema = true; public bool UseOptimizedDatasetSchema = true;
public bool UseFastGuid = true; public bool UseFastGuid = true;
@@ -40,7 +39,7 @@ namespace LogentriesNLog.fastJSON
return ToJSON(obj, UseSerializerExtension, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); return ToJSON(obj, UseSerializerExtension, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues);
} }
public string ToJSON(object obj, public string ToJSON(object obj,
bool enableSerializerExtensions, bool enableSerializerExtensions,
bool enableFastGuid, bool enableFastGuid,
@@ -50,13 +49,13 @@ namespace LogentriesNLog.fastJSON
return new JSONSerializer(enableOptimizedDatasetSchema, enableFastGuid, enableSerializerExtensions, serializeNullValues, IndentOutput).ConvertToJSON(obj); return new JSONSerializer(enableOptimizedDatasetSchema, enableFastGuid, enableSerializerExtensions, serializeNullValues, IndentOutput).ConvertToJSON(obj);
} }
public T ToObject<T>(string json) public T ToObject<T>(string json)
{ {
return (T)ToObject(json, typeof(T)); return (T)ToObject(json, typeof(T));
} }
public object ToObject(string json, Type type) public object ToObject(string json, Type type)
{ {
var ht = new JsonParser(json).Decode() as Dictionary<string, object>; var ht = new JsonParser(json).Decode() as Dictionary<string, object>;
@@ -321,7 +320,7 @@ namespace LogentriesNLog.fastJSON
} }
} }
_getterscache.Add(type, getters); _getterscache.Add(type, getters);
return getters; return getters;
} }
@@ -449,7 +448,7 @@ namespace LogentriesNLog.fastJSON
#if !SILVERLIGHT #if !SILVERLIGHT
else if (pi.isDictionary || pi.isHashtable) else if (pi.isDictionary || pi.isHashtable)
oset = CreateDictionary((ArrayList)v, pi.pt, pi.GenericTypes, globaltypes); oset = CreateDictionary((ArrayList)v, pi.pt, pi.GenericTypes, globaltypes);
#else #else
else if (pi.isDictionary) else if (pi.isDictionary)
oset = CreateDictionary((List<object>)v, pi.pt, pi.GenericTypes, globaltypes); oset = CreateDictionary((List<object>)v, pi.pt, pi.GenericTypes, globaltypes);
#endif #endif
@@ -818,4 +817,4 @@ namespace LogentriesNLog.fastJSON
} }
#endif #endif
} }
} }
@@ -170,8 +170,6 @@ namespace LogentriesNLog.fastJSON
_output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo)); _output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo));
_output.Append(":"); _output.Append(":");
_output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo)); _output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo));
_output.Append(".");
_output.Append(dt.Millisecond.ToString("000", NumberFormatInfo.InvariantInfo));
if (JSON.Instance.UseUTCDateTime) if (JSON.Instance.UseUTCDateTime)
_output.Append("Z"); _output.Append("Z");
+2 -2
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="NLog" version="4.3.11" targetFramework="net40" /> <package id="NLog" version="2.1.0" targetFramework="net40" />
</packages> </packages>
+1 -2
View File
@@ -198,8 +198,7 @@ namespace Marr.Data.Mapping
{ {
return AutoMapPropertiesWhere(m => return AutoMapPropertiesWhere(m =>
m.MemberType == MemberTypes.Property && m.MemberType == MemberTypes.Property &&
!DataHelper.IsSimpleType((m as PropertyInfo).PropertyType) && !DataHelper.IsSimpleType((m as PropertyInfo).PropertyType));
!MapRepository.Instance.TypeConverters.ContainsKey((m as PropertyInfo).PropertyType));
} }
/// <summary> /// <summary>
+1
View File
@@ -144,6 +144,7 @@
<PreBuildEvent> <PreBuildEvent>
</PreBuildEvent> </PreBuildEvent>
</PropertyGroup> </PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
@@ -1,6 +1,9 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information.
using System; using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading; using System.Threading;
namespace Microsoft.AspNet.SignalR.Infrastructure namespace Microsoft.AspNet.SignalR.Infrastructure
@@ -4,7 +4,7 @@ using System.Diagnostics;
namespace Microsoft.AspNet.SignalR.Infrastructure namespace Microsoft.AspNet.SignalR.Infrastructure
{ {
public class NoOpPerformanceCounter : IPerformanceCounter internal class NoOpPerformanceCounter : IPerformanceCounter
{ {
public string CounterName public string CounterName
{ {
@@ -56,7 +56,7 @@ namespace Microsoft.AspNet.SignalR.Infrastructure
} }
catch(NotImplementedException) catch(NotImplementedException)
{ {
// This happens on mono // This happens on mono
} }
} }
@@ -276,9 +276,10 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
</Target> </Target>
--> -->
</Project> </Project>
@@ -6,6 +6,7 @@ using System.Diagnostics;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Configuration; using Microsoft.AspNet.SignalR.Configuration;
using Microsoft.AspNet.SignalR.Hosting; using Microsoft.AspNet.SignalR.Hosting;
@@ -1,9 +1,13 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information.
using System; using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Infrastructure; using Microsoft.AspNet.SignalR.Infrastructure;
@@ -3,6 +3,7 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Hosting; using Microsoft.AspNet.SignalR.Hosting;
using Microsoft.AspNet.SignalR.Infrastructure; using Microsoft.AspNet.SignalR.Infrastructure;
@@ -102,6 +102,7 @@
</ItemGroup> </ItemGroup>
<Import Project="..\Common\Microsoft.AspNet.SignalR.targets" /> <Import Project="..\Common\Microsoft.AspNet.SignalR.targets" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
@@ -109,4 +110,4 @@
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
@@ -7,9 +7,11 @@ using System.Security.Principal;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Owin.Infrastructure; using Microsoft.AspNet.SignalR.Owin.Infrastructure;
using Microsoft.AspNet.SignalR.Hosting;
namespace Microsoft.AspNet.SignalR.Owin namespace Microsoft.AspNet.SignalR.Owin
{ {
using WebSocketFunc = Func<IDictionary<string, object>, Task>;
public partial class ServerRequest : public partial class ServerRequest :
#if NET45 #if NET45
IWebSocketRequest IWebSocketRequest
+1 -2
View File
@@ -774,8 +774,7 @@ namespace MonoTorrent
break; break;
case ("nodes"): case ("nodes"):
if (keypair.Value.ToString().Length != 0) this.nodes = (BEncodedList)keypair.Value;
this.nodes = (BEncodedList)keypair.Value;
break; break;
case ("comment.utf-8"): case ("comment.utf-8"):
@@ -0,0 +1,168 @@
using System;
using System.Collections.Generic;
using FizzWare.NBuilder;
using FluentAssertions;
using Marr.Data;
using NUnit.Framework;
using NzbDrone.Api.Commands;
using NzbDrone.Api.Config;
using NzbDrone.Api.Episodes;
using NzbDrone.Api.History;
using NzbDrone.Api.Indexers;
using NzbDrone.Api.Logs;
using NzbDrone.Api.Mapping;
using NzbDrone.Api.Profiles;
using NzbDrone.Api.RootFolders;
using NzbDrone.Api.Series;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Instrumentation;
using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Organizer;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Profiles;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.RootFolders;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Update.Commands;
using NzbDrone.Test.Common;
using System.Linq;
namespace NzbDrone.Api.Test.MappingTests
{
[TestFixture]
public class ResourceMappingFixture : TestBase
{
[TestCase(typeof(Core.Tv.Series), typeof(SeriesResource))]
[TestCase(typeof(Episode), typeof(EpisodeResource))]
[TestCase(typeof(RootFolder), typeof(RootFolderResource))]
[TestCase(typeof(NamingConfig), typeof(NamingConfigResource))]
// [TestCase(typeof(IndexerDefinition), typeof(IndexerResource))] //TODO: Ignoring because we don't have a good way to ignore properties with value injector
[TestCase(typeof(ReleaseInfo), typeof(ReleaseResource))]
[TestCase(typeof(ParsedEpisodeInfo), typeof(ReleaseResource))]
[TestCase(typeof(DownloadDecision), typeof(ReleaseResource))]
[TestCase(typeof(Core.History.History), typeof(HistoryResource))]
[TestCase(typeof(Profile), typeof(ProfileResource))]
[TestCase(typeof(ProfileQualityItem), typeof(ProfileQualityItemResource))]
[TestCase(typeof(Log), typeof(LogResource))]
[TestCase(typeof(Command), typeof(CommandResource))]
public void matching_fields(Type modelType, Type resourceType)
{
MappingValidation.ValidateMapping(modelType, resourceType);
}
[Test]
public void should_map_lazy_loaded_values_should_not_be_inject_if_not_loaded()
{
var modelWithLazy = new ModelWithLazy()
{
Guid = new TestLazyLoaded<Guid>()
};
modelWithLazy.InjectTo<ModelWithNoLazy>().Guid.Should().BeEmpty();
modelWithLazy.Guid.IsLoaded.Should().BeFalse();
}
[Test]
public void should_map_lay_loaded_values_should_be_inject_if_loaded()
{
var guid = Guid.NewGuid();
var modelWithLazy = new ModelWithLazy()
{
Guid = new LazyLoaded<Guid>(guid)
};
modelWithLazy.InjectTo<ModelWithNoLazy>().Guid.Should().Be(guid);
modelWithLazy.Guid.IsLoaded.Should().BeTrue();
}
[Test]
public void should_be_able_to_map_lists()
{
var modelList = Builder<TestModel>.CreateListOfSize(10).Build();
var resourceList = modelList.InjectTo<List<TestResource>>();
resourceList.Should().HaveSameCount(modelList);
}
[Test]
public void should_map_wrapped_models()
{
var modelList = Builder<TestModel>.CreateListOfSize(10).Build().ToList();
var wrapper = new TestModelWrapper
{
TestlList = modelList
};
wrapper.InjectTo<TestResourceWrapper>();
}
[Test]
public void should_map_profile()
{
var profileResource = new ProfileResource
{
Cutoff = Quality.WEBDL1080p,
Items = new List<ProfileQualityItemResource> { new ProfileQualityItemResource { Quality = Quality.WEBDL1080p, Allowed = true } }
};
profileResource.InjectTo<Profile>();
}
[Test]
public void should_map_tracked_command()
{
var commandResource = new CommandModel { Body = new ApplicationUpdateCommand() };
commandResource.InjectTo<CommandResource>();
}
}
public class ModelWithLazy
{
public LazyLoaded<Guid> Guid { get; set; }
}
public class ModelWithNoLazy
{
public Guid Guid { get; set; }
}
public class TestLazyLoaded<T> : LazyLoaded<T>
{
public override void Prepare(Func<IDataMapper> dataMapperFactory, object parent)
{
throw new InvalidOperationException();
}
}
public class TestModelWrapper
{
public List<TestModel> TestlList { get; set; }
}
public class TestResourceWrapper
{
public List<TestResource> TestList { get; set; }
}
public class TestModel
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}
public class TestResource
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}
}
+18 -14
View File
@@ -38,21 +38,17 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="FizzWare.NBuilder, Version=4.0.0.115, Culture=neutral, PublicKeyToken=5651b03e12e42c12, processorArchitecture=MSIL"> <Reference Include="FluentAssertions, Version=3.2.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\NBuilder.4.0.0\lib\net40\FizzWare.NBuilder.dll</HintPath> <SpecificVersion>False</SpecificVersion>
<Private>True</Private> <HintPath>..\packages\FluentAssertions.3.2.1\lib\net40\FluentAssertions.dll</HintPath>
</Reference> </Reference>
<Reference Include="FluentAssertions, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions.Core, Version=3.2.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.dll</HintPath> <SpecificVersion>False</SpecificVersion>
<Private>True</Private> <HintPath>..\packages\FluentAssertions.3.2.1\lib\net40\FluentAssertions.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="FluentAssertions.Core, Version=4.18.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="nunit.framework, Version=2.6.3.13283, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.18.0\lib\net40\FluentAssertions.Core.dll</HintPath> <SpecificVersion>False</SpecificVersion>
<Private>True</Private> <HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
@@ -61,12 +57,19 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="FizzWare.NBuilder">
<HintPath>..\packages\NBuilder.3.0.1.1\lib\FizzWare.NBuilder.dll</HintPath>
</Reference>
<Reference Include="Moq"> <Reference Include="Moq">
<HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath> <HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath>
</Reference> </Reference>
<Reference Include="Omu.ValueInjecter">
<HintPath>..\packages\ValueInjecter.2.3.3\lib\net35\Omu.ValueInjecter.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="ClientSchemaTests\SchemaBuilderFixture.cs" /> <Compile Include="ClientSchemaTests\SchemaBuilderFixture.cs" />
<Compile Include="MappingTests\ResourceMappingFixture.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -101,6 +104,7 @@
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
@@ -108,4 +112,4 @@
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
+5 -4
View File
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="FluentAssertions" version="4.18.0" targetFramework="net40" /> <package id="FluentAssertions" version="3.2.1" targetFramework="net40" />
<package id="Moq" version="4.0.10827" /> <package id="Moq" version="4.0.10827" />
<package id="NBuilder" version="4.0.0" targetFramework="net40" /> <package id="NBuilder" version="3.0.1.1" targetFramework="net40" />
<package id="NUnit" version="3.5.0" targetFramework="net40" /> <package id="NUnit" version="2.6.3" targetFramework="net40" />
</packages> <package id="ValueInjecter" version="2.3.3" targetFramework="net40" />
</packages>
@@ -3,7 +3,6 @@ using Nancy;
using Nancy.Authentication.Forms; using Nancy.Authentication.Forms;
using Nancy.Extensions; using Nancy.Extensions;
using Nancy.ModelBinding; using Nancy.ModelBinding;
using NzbDrone.Common.EnsureThat;
using NzbDrone.Core.Authentication; using NzbDrone.Core.Authentication;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
@@ -24,11 +23,6 @@ namespace NzbDrone.Api.Authentication
private Response Login(LoginResource resource) private Response Login(LoginResource resource)
{ {
Ensure.That(resource.Username, () => resource.Username).IsNotNullOrWhiteSpace();
// TODO: A null or empty password should not be allowed, uncomment in v3
//Ensure.That(resource.Password, () => resource.Password).IsNotNullOrWhiteSpace();
var user = _userService.FindUser(resource.Username, resource.Password); var user = _userService.FindUser(resource.Username, resource.Password);
if (user == null) if (user == null)
@@ -43,7 +37,7 @@ namespace NzbDrone.Api.Authentication
expiry = DateTime.UtcNow.AddDays(7); expiry = DateTime.UtcNow.AddDays(7);
} }
return this.LoginAndRedirect(user.Identifier, expiry, _configFileProvider.UrlBase + "/"); return this.LoginAndRedirect(user.Identifier, expiry);
} }
private Response Logout() private Response Logout()
@@ -22,7 +22,7 @@ namespace NzbDrone.Api.Authentication
private readonly IUserService _userService; private readonly IUserService _userService;
private static readonly NzbDroneUser AnonymousUser = new NzbDroneUser { UserName = "Anonymous" }; private static readonly NzbDroneUser AnonymousUser = new NzbDroneUser { UserName = "Anonymous" };
private static string API_KEY; private static String API_KEY;
private static AuthenticationType AUTH_METHOD; private static AuthenticationType AUTH_METHOD;
public AuthenticationService(IConfigFileProvider configFileProvider, IUserService userService) public AuthenticationService(IConfigFileProvider configFileProvider, IUserService userService)
@@ -27,8 +27,6 @@ namespace NzbDrone.Api.Authentication
_configFileProvider = configFileProvider; _configFileProvider = configFileProvider;
} }
public int Order => 10;
public void Register(IPipelines pipelines) public void Register(IPipelines pipelines)
{ {
if (_configFileProvider.AuthenticationMethod == AuthenticationType.Forms) if (_configFileProvider.AuthenticationMethod == AuthenticationType.Forms)
@@ -41,8 +39,8 @@ namespace NzbDrone.Api.Authentication
pipelines.EnableBasicAuthentication(new BasicAuthenticationConfiguration(_authenticationService, "Sonarr")); pipelines.EnableBasicAuthentication(new BasicAuthenticationConfiguration(_authenticationService, "Sonarr"));
} }
pipelines.BeforeRequest.AddItemToEndOfPipeline((Func<NancyContext, Response>) RequiresAuthentication); pipelines.BeforeRequest.AddItemToEndOfPipeline(RequiresAuthentication);
pipelines.AfterRequest.AddItemToEndOfPipeline((Action<NancyContext>) RemoveLoginHooksForApiCalls); pipelines.AfterRequest.AddItemToEndOfPipeline(RemoveLoginHooksForApiCalls);
} }
private Response RequiresAuthentication(NancyContext context) private Response RequiresAuthentication(NancyContext context)
@@ -77,7 +75,7 @@ namespace NzbDrone.Api.Authentication
if (context.Request.IsApiRequest()) if (context.Request.IsApiRequest())
{ {
if ((context.Response.StatusCode == HttpStatusCode.SeeOther && if ((context.Response.StatusCode == HttpStatusCode.SeeOther &&
context.Response.Headers["Location"].StartsWith($"{_configFileProvider.UrlBase}/login", StringComparison.InvariantCultureIgnoreCase)) || context.Response.Headers["Location"].StartsWith("/login", StringComparison.InvariantCultureIgnoreCase)) ||
context.Response.StatusCode == HttpStatusCode.Unauthorized) context.Response.StatusCode == HttpStatusCode.Unauthorized)
{ {
context.Response = new { Error = "Unauthorized" }.AsResponse(HttpStatusCode.Unauthorized); context.Response = new { Error = "Unauthorized" }.AsResponse(HttpStatusCode.Unauthorized);
@@ -16,9 +16,15 @@ namespace NzbDrone.Api.Blacklist
private PagingResource<BlacklistResource> GetBlacklist(PagingResource<BlacklistResource> pagingResource) private PagingResource<BlacklistResource> GetBlacklist(PagingResource<BlacklistResource> pagingResource)
{ {
var pagingSpec = pagingResource.MapToPagingSpec<BlacklistResource, Core.Blacklisting.Blacklist>("id", SortDirection.Ascending); var pagingSpec = new PagingSpec<Core.Blacklisting.Blacklist>
{
Page = pagingResource.Page,
PageSize = pagingResource.PageSize,
SortKey = pagingResource.SortKey,
SortDirection = pagingResource.SortDirection
};
return ApplyToPage(_blacklistService.Paged, pagingSpec, BlacklistResourceMapper.MapToResource); return ApplyToPage(_blacklistService.Paged, pagingSpec);
} }
private void DeleteBlacklist(int id) private void DeleteBlacklist(int id)
@@ -26,4 +32,4 @@ namespace NzbDrone.Api.Blacklist
_blacklistService.Delete(id); _blacklistService.Delete(id);
} }
} }
} }
@@ -20,28 +20,4 @@ namespace NzbDrone.Api.Blacklist
public SeriesResource Series { get; set; } public SeriesResource Series { get; set; }
} }
public static class BlacklistResourceMapper
{
public static BlacklistResource MapToResource(this Core.Blacklisting.Blacklist model)
{
if (model == null) return null;
return new BlacklistResource
{
Id = model.Id,
SeriesId = model.SeriesId,
EpisodeIds = model.EpisodeIds,
SourceTitle = model.SourceTitle,
Quality = model.Quality,
Date = model.Date,
Protocol = model.Protocol,
Indexer = model.Indexer,
Message = model.Message,
Series = model.Series.ToResource()
};
}
}
} }
+15 -77
View File
@@ -2,124 +2,62 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Ical.Net; using DDay.iCal;
using Ical.Net.DataTypes;
using Ical.Net.Interfaces.Serialization;
using Ical.Net.Serialization;
using Ical.Net.Serialization.iCalendar.Factory;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using Nancy.Responses; using Nancy.Responses;
using NzbDrone.Core.Tags;
using NzbDrone.Common.Extensions;
namespace NzbDrone.Api.Calendar namespace NzbDrone.Api.Calendar
{ {
public class CalendarFeedModule : NzbDroneFeedModule public class CalendarFeedModule : NzbDroneFeedModule
{ {
private readonly IEpisodeService _episodeService; private readonly IEpisodeService _episodeService;
private readonly ITagService _tagService;
public CalendarFeedModule(IEpisodeService episodeService, ITagService tagService) public CalendarFeedModule(IEpisodeService episodeService)
: base("calendar") : base("calendar")
{ {
_episodeService = episodeService; _episodeService = episodeService;
_tagService = tagService;
Get["/NzbDrone.ics"] = options => GetCalendarFeed(); Get["/NzbDrone.ics"] = options => GetCalendarFeed();
Get["/Sonarr.ics"] = options => GetCalendarFeed();
} }
private Response GetCalendarFeed() private Response GetCalendarFeed()
{ {
var pastDays = 7; var start = DateTime.Today.AddDays(-7);
var futureDays = 28; var end = DateTime.Today.AddDays(28);
var start = DateTime.Today.AddDays(-pastDays);
var end = DateTime.Today.AddDays(futureDays);
var unmonitored = false;
var premiersOnly = false;
var tags = new List<int>();
// TODO: Remove start/end parameters in v3, they don't work well for iCal
var queryStart = Request.Query.Start; var queryStart = Request.Query.Start;
var queryEnd = Request.Query.End; var queryEnd = Request.Query.End;
var queryPastDays = Request.Query.PastDays;
var queryFutureDays = Request.Query.FutureDays;
var queryUnmonitored = Request.Query.Unmonitored;
var queryPremiersOnly = Request.Query.PremiersOnly;
var queryTags = Request.Query.Tags;
if (queryStart.HasValue) start = DateTime.Parse(queryStart.Value); if (queryStart.HasValue) start = DateTime.Parse(queryStart.Value);
if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value); if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value);
if (queryPastDays.HasValue) var episodes = _episodeService.EpisodesBetweenDates(start, end, false);
{ var icalCalendar = new iCalendar();
pastDays = int.Parse(queryPastDays.Value);
start = DateTime.Today.AddDays(-pastDays);
}
if (queryFutureDays.HasValue)
{
futureDays = int.Parse(queryFutureDays.Value);
end = DateTime.Today.AddDays(futureDays);
}
if (queryUnmonitored.HasValue)
{
unmonitored = bool.Parse(queryUnmonitored.Value);
}
if (queryPremiersOnly.HasValue)
{
premiersOnly = bool.Parse(queryPremiersOnly.Value);
}
if (queryTags.HasValue)
{
var tagInput = (string)queryTags.Value.ToString();
tags.AddRange(tagInput.Split(',').Select(_tagService.GetTag).Select(t => t.Id));
}
var episodes = _episodeService.EpisodesBetweenDates(start, end, unmonitored);
var calendar = new Ical.Net.Calendar
{
ProductId = "-//sonarr.tv//Sonarr//EN"
};
foreach (var episode in episodes.OrderBy(v => v.AirDateUtc.Value)) foreach (var episode in episodes.OrderBy(v => v.AirDateUtc.Value))
{ {
if (premiersOnly && (episode.SeasonNumber == 0 || episode.EpisodeNumber != 1)) var occurrence = icalCalendar.Create<Event>();
{ occurrence.UID = "NzbDrone_episode_" + episode.Id.ToString();
continue;
}
if (tags.Any() && tags.None(episode.Series.Tags.Contains))
{
continue;
}
var occurrence = calendar.Create<Event>();
occurrence.Uid = "NzbDrone_episode_" + episode.Id;
occurrence.Status = episode.HasFile ? EventStatus.Confirmed : EventStatus.Tentative; occurrence.Status = episode.HasFile ? EventStatus.Confirmed : EventStatus.Tentative;
occurrence.Start = new CalDateTime(episode.AirDateUtc.Value) { HasTime = true }; occurrence.Start = new iCalDateTime(episode.AirDateUtc.Value) { HasTime = true };
occurrence.End = new CalDateTime(episode.AirDateUtc.Value.AddMinutes(episode.Series.Runtime)) { HasTime = true }; occurrence.End = new iCalDateTime(episode.AirDateUtc.Value.AddMinutes(episode.Series.Runtime)) { HasTime = true };
occurrence.Description = episode.Overview; occurrence.Description = episode.Overview;
occurrence.Categories = new List<string>() { episode.Series.Network }; occurrence.Categories = new List<string>() { episode.Series.Network };
switch (episode.Series.SeriesType) switch (episode.Series.SeriesType)
{ {
case SeriesTypes.Daily: case SeriesTypes.Daily:
occurrence.Summary = $"{episode.Series.Title} - {episode.Title}"; occurrence.Summary = string.Format("{0} - {1}", episode.Series.Title, episode.Title);
break; break;
default: default:
occurrence.Summary =$"{episode.Series.Title} - {episode.SeasonNumber}x{episode.EpisodeNumber:00} - {episode.Title}"; occurrence.Summary = string.Format("{0} - {1}x{2:00} - {3}", episode.Series.Title, episode.SeasonNumber, episode.EpisodeNumber, episode.Title);
break; break;
} }
} }
var serializer = (IStringSerializer) new SerializerFactory().Build(calendar.GetType(), new SerializationContext()); var serializer = new DDay.iCal.Serialization.iCalendar.SerializerFactory().Build(icalCalendar.GetType(), new DDay.iCal.Serialization.SerializationContext()) as DDay.iCal.Serialization.IStringSerializer;
var icalendar = serializer.SerializeToString(calendar); var icalendar = serializer.SerializeToString(icalCalendar);
return new TextResponse(icalendar, "text/calendar"); return new TextResponse(icalendar, "text/calendar");
} }
+1 -1
View File
@@ -33,7 +33,7 @@ namespace NzbDrone.Api.Calendar
if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value); if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value);
if (queryIncludeUnmonitored.HasValue) includeUnmonitored = Convert.ToBoolean(queryIncludeUnmonitored.Value); if (queryIncludeUnmonitored.HasValue) includeUnmonitored = Convert.ToBoolean(queryIncludeUnmonitored.Value);
var resources = MapToResource(_episodeService.EpisodesBetweenDates(start, end, includeUnmonitored), true, true); var resources = ToListResource(() => _episodeService.EpisodesBetweenDates(start, end, includeUnmonitored));
return resources.OrderBy(e => e.AirDateUtc).ToList(); return resources.OrderBy(e => e.AirDateUtc).ToList();
} }
+10 -9
View File
@@ -1,17 +1,18 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
namespace NzbDrone.Api.ClientSchema namespace NzbDrone.Api.ClientSchema
{ {
public class Field public class Field
{ {
public int Order { get; set; } public Int32 Order { get; set; }
public string Name { get; set; } public String Name { get; set; }
public string Label { get; set; } public String Label { get; set; }
public string HelpText { get; set; } public String HelpText { get; set; }
public string HelpLink { get; set; } public String HelpLink { get; set; }
public object Value { get; set; } public Object Value { get; set; }
public string Type { get; set; } public String Type { get; set; }
public bool Advanced { get; set; } public Boolean Advanced { get; set; }
public List<SelectOption> SelectOptions { get; set; } public List<SelectOption> SelectOptions { get; set; }
} }
} }
+28 -39
View File
@@ -6,6 +6,7 @@ using NzbDrone.Common.EnsureThat;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Reflection; using NzbDrone.Common.Reflection;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using Omu.ValueInjecter;
namespace NzbDrone.Api.ClientSchema namespace NzbDrone.Api.ClientSchema
{ {
@@ -27,15 +28,15 @@ namespace NzbDrone.Api.ClientSchema
{ {
var field = new Field var field = new Field
{ {
Name = propertyInfo.Name, Name = propertyInfo.Name,
Label = fieldAttribute.Label, Label = fieldAttribute.Label,
HelpText = fieldAttribute.HelpText, HelpText = fieldAttribute.HelpText,
HelpLink = fieldAttribute.HelpLink, HelpLink = fieldAttribute.HelpLink,
Order = fieldAttribute.Order, Order = fieldAttribute.Order,
Advanced = fieldAttribute.Advanced, Advanced = fieldAttribute.Advanced,
Type = fieldAttribute.Type.ToString().ToLowerInvariant() Type = fieldAttribute.Type.ToString().ToLowerInvariant()
}; };
var value = propertyInfo.GetValue(model, null); var value = propertyInfo.GetValue(model, null);
if (value != null) if (value != null)
@@ -55,7 +56,7 @@ namespace NzbDrone.Api.ClientSchema
return result.OrderBy(r => r.Order).ToList(); return result.OrderBy(r => r.Order).ToList();
} }
public static object ReadFromSchema(List<Field> fields, Type targetType) public static object ReadFormSchema(List<Field> fields, Type targetType, object defaults = null)
{ {
Ensure.That(targetType, () => targetType).IsNotNull(); Ensure.That(targetType, () => targetType).IsNotNull();
@@ -63,6 +64,11 @@ namespace NzbDrone.Api.ClientSchema
var target = Activator.CreateInstance(targetType); var target = Activator.CreateInstance(targetType);
if (defaults != null)
{
target.InjectFrom(defaults);
}
foreach (var propertyInfo in properties) foreach (var propertyInfo in properties)
{ {
var fieldAttribute = propertyInfo.GetAttribute<FieldDefinitionAttribute>(false); var fieldAttribute = propertyInfo.GetAttribute<FieldDefinitionAttribute>(false);
@@ -71,19 +77,19 @@ namespace NzbDrone.Api.ClientSchema
{ {
var field = fields.Find(f => f.Name == propertyInfo.Name); var field = fields.Find(f => f.Name == propertyInfo.Name);
if (propertyInfo.PropertyType == typeof(int)) if (propertyInfo.PropertyType == typeof(Int32))
{ {
var value = Convert.ToInt32(field.Value); var value = Convert.ToInt32(field.Value);
propertyInfo.SetValue(target, value, null); propertyInfo.SetValue(target, value, null);
} }
else if (propertyInfo.PropertyType == typeof(long)) else if (propertyInfo.PropertyType == typeof(Int64))
{ {
var value = Convert.ToInt64(field.Value); var value = Convert.ToInt64(field.Value);
propertyInfo.SetValue(target, value, null); propertyInfo.SetValue(target, value, null);
} }
else if (propertyInfo.PropertyType == typeof(int?)) else if (propertyInfo.PropertyType == typeof(Nullable<Int32>))
{ {
var value = field.Value.ToString().ParseInt32(); var value = field.Value.ToString().ParseInt32();
propertyInfo.SetValue(target, value, null); propertyInfo.SetValue(target, value, null);
@@ -95,37 +101,20 @@ namespace NzbDrone.Api.ClientSchema
propertyInfo.SetValue(target, value, null); propertyInfo.SetValue(target, value, null);
} }
else if (propertyInfo.PropertyType == typeof(IEnumerable<int>)) else if (propertyInfo.PropertyType == typeof (IEnumerable<Int32>))
{ {
IEnumerable<int> value; IEnumerable<Int32> value;
if (field.Value.GetType() == typeof(JArray)) if (field.Value.GetType() == typeof (JArray))
{ {
value = ((JArray)field.Value).Select(s => s.Value<int>()); value = ((JArray) field.Value).Select(s => s.Value<Int32>());
} }
else else
{ {
value = field.Value.ToString().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(s => Convert.ToInt32(s)); value = field.Value.ToString().Split(new []{','}, StringSplitOptions.RemoveEmptyEntries).Select(s => Convert.ToInt32(s));
} }
propertyInfo.SetValue(target, value, null);
}
else if (propertyInfo.PropertyType == typeof(IEnumerable<string>))
{
IEnumerable<string> value;
if (field.Value.GetType() == typeof(JArray))
{
value = ((JArray)field.Value).Select(s => s.Value<string>());
}
else
{
value = field.Value.ToString().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
propertyInfo.SetValue(target, value, null); propertyInfo.SetValue(target, value, null);
} }
@@ -140,9 +129,9 @@ namespace NzbDrone.Api.ClientSchema
} }
public static T ReadFromSchema<T>(List<Field> fields) public static T ReadFormSchema<T>(List<Field> fields)
{ {
return (T)ReadFromSchema(fields, typeof(T)); return (T)ReadFormSchema(fields, typeof(T));
} }
private static List<SelectOption> GetSelectOptions(Type selectOptions) private static List<SelectOption> GetSelectOptions(Type selectOptions)
@@ -153,4 +142,4 @@ namespace NzbDrone.Api.ClientSchema
return options.OrderBy(o => o.Value).ToList(); return options.OrderBy(o => o.Value).ToList();
} }
} }
} }
+8 -5
View File
@@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
using NzbDrone.Api.Mapping;
using NzbDrone.Api.Validation; using NzbDrone.Api.Validation;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Datastore.Events;
@@ -35,13 +36,15 @@ namespace NzbDrone.Api.Commands
private CommandResource GetCommand(int id) private CommandResource GetCommand(int id)
{ {
return _commandQueueManager.Get(id).ToResource(); return _commandQueueManager.Get(id).InjectTo<CommandResource>();
} }
private int StartCommand(CommandResource commandResource) private int StartCommand(CommandResource commandResource)
{ {
var commandType = _serviceFactory.GetImplementations(typeof(Command)) var commandType =
.Single(c => c.Name.Replace("Command", "").Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase)); _serviceFactory.GetImplementations(typeof (Command))
.Single(c => c.Name.Replace("Command", "")
.Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
dynamic command = Request.Body.FromJson(commandType); dynamic command = Request.Body.FromJson(commandType);
command.Trigger = CommandTrigger.Manual; command.Trigger = CommandTrigger.Manual;
@@ -52,14 +55,14 @@ namespace NzbDrone.Api.Commands
private List<CommandResource> GetStartedCommands() private List<CommandResource> GetStartedCommands()
{ {
return _commandQueueManager.GetStarted().ToResource(); return ToListResource(_commandQueueManager.GetStarted());
} }
public void Handle(CommandUpdatedEvent message) public void Handle(CommandUpdatedEvent message)
{ {
if (message.Command.Body.SendUpdatesToClient) if (message.Command.Body.SendUpdatesToClient)
{ {
BroadcastResourceChange(ModelAction.Updated, message.Command.ToResource()); BroadcastResourceChange(ModelAction.Updated, message.Command.InjectTo<CommandResource>());
} }
} }
} }
+6 -53
View File
@@ -1,6 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Commands;
@@ -9,9 +7,9 @@ namespace NzbDrone.Api.Commands
{ {
public class CommandResource : RestResource public class CommandResource : RestResource
{ {
public string Name { get; set; } public String Name { get; set; }
public string Message { get; set; } public String Message { get; set; }
public object Body { get; set; } public Command Body { get; set; }
public CommandPriority Priority { get; set; } public CommandPriority Priority { get; set; }
public CommandStatus Status { get; set; } public CommandStatus Status { get; set; }
public DateTime Queued { get; set; } public DateTime Queued { get; set; }
@@ -35,7 +33,7 @@ namespace NzbDrone.Api.Commands
set { } set { }
} }
public bool Manual public Boolean Manual
{ {
get get
{ {
@@ -68,23 +66,11 @@ namespace NzbDrone.Api.Commands
set { } set { }
} }
public bool SendUpdatesToClient public Boolean SendUpdatesToClient
{ {
get get
{ {
if (Body != null) return (Body as Command).SendUpdatesToClient; if (Body != null) return Body.SendUpdatesToClient;
return false;
}
set { }
}
public bool UpdateScheduledTask
{
get
{
if (Body != null) return (Body as Command).UpdateScheduledTask;
return false; return false;
} }
@@ -94,37 +80,4 @@ namespace NzbDrone.Api.Commands
public DateTime? LastExecutionTime { get; set; } public DateTime? LastExecutionTime { get; set; }
} }
public static class CommandResourceMapper
{
public static CommandResource ToResource(this CommandModel model)
{
if (model == null) return null;
return new CommandResource
{
Id = model.Id,
Name = model.Name,
Message = model.Message,
Body = model.Body,
Priority = model.Priority,
Status = model.Status,
Queued = model.QueuedAt,
Started = model.StartedAt,
Ended = model.EndedAt,
Duration = model.Duration,
Exception = model.Exception,
Trigger = model.Trigger,
CompletionMessage = model.Body.CompletionMessage,
LastExecutionTime = model.Body.LastExecutionTime
};
}
public static List<CommandResource> ToResource(this IEnumerable<CommandModel> models)
{
return models.Select(ToResource).ToList();
}
}
} }
@@ -1,4 +1,5 @@
using FluentValidation; using System;
using FluentValidation;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Validation.Paths; using NzbDrone.Core.Validation.Paths;
@@ -18,12 +19,7 @@ namespace NzbDrone.Api.Config
.SetValidator(rootFolderValidator) .SetValidator(rootFolderValidator)
.SetValidator(mappedNetworkDriveValidator) .SetValidator(mappedNetworkDriveValidator)
.SetValidator(pathExistsValidator) .SetValidator(pathExistsValidator)
.When(c => !string.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder)); .When(c => !String.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder));
}
protected override DownloadClientConfigResource ToResource(IConfigService model)
{
return DownloadClientConfigResourceMapper.ToResource(model);
} }
} }
} }
@@ -1,37 +1,18 @@
using NzbDrone.Api.REST; using System;
using NzbDrone.Core.Configuration; using NzbDrone.Api.REST;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
public class DownloadClientConfigResource : RestResource public class DownloadClientConfigResource : RestResource
{ {
public string DownloadedEpisodesFolder { get; set; } public String DownloadedEpisodesFolder { get; set; }
public string DownloadClientWorkingFolders { get; set; } public String DownloadClientWorkingFolders { get; set; }
public int DownloadedEpisodesScanInterval { get; set; } public Int32 DownloadedEpisodesScanInterval { get; set; }
public bool EnableCompletedDownloadHandling { get; set; } public Boolean EnableCompletedDownloadHandling { get; set; }
public bool RemoveCompletedDownloads { get; set; } public Boolean RemoveCompletedDownloads { get; set; }
public bool AutoRedownloadFailed { get; set; } public Boolean AutoRedownloadFailed { get; set; }
public bool RemoveFailedDownloads { get; set; } public Boolean RemoveFailedDownloads { get; set; }
}
public static class DownloadClientConfigResourceMapper
{
public static DownloadClientConfigResource ToResource(IConfigService model)
{
return new DownloadClientConfigResource
{
DownloadedEpisodesFolder = model.DownloadedEpisodesFolder,
DownloadClientWorkingFolders = model.DownloadClientWorkingFolders,
DownloadedEpisodesScanInterval = model.DownloadedEpisodesScanInterval,
EnableCompletedDownloadHandling = model.EnableCompletedDownloadHandling,
RemoveCompletedDownloads = model.RemoveCompletedDownloads,
AutoRedownloadFailed = model.AutoRedownloadFailed,
RemoveFailedDownloads = model.RemoveFailedDownloads
};
}
} }
} }
+11 -13
View File
@@ -8,51 +8,50 @@ using NzbDrone.Core.Configuration;
using NzbDrone.Core.Update; using NzbDrone.Core.Update;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
using NzbDrone.Core.Validation.Paths; using NzbDrone.Core.Validation.Paths;
using Omu.ValueInjecter;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
public class HostConfigModule : NzbDroneRestModule<HostConfigResource> public class HostConfigModule : NzbDroneRestModule<HostConfigResource>
{ {
private readonly IConfigFileProvider _configFileProvider; private readonly IConfigFileProvider _configFileProvider;
private readonly IConfigService _configService;
private readonly IUserService _userService; private readonly IUserService _userService;
public HostConfigModule(IConfigFileProvider configFileProvider, IConfigService configService, IUserService userService) public HostConfigModule(IConfigFileProvider configFileProvider, IUserService userService)
: base("/config/host") : base("/config/host")
{ {
_configFileProvider = configFileProvider; _configFileProvider = configFileProvider;
_configService = configService;
_userService = userService; _userService = userService;
GetResourceSingle = GetHostConfig; GetResourceSingle = GetHostConfig;
GetResourceById = GetHostConfig; GetResourceById = GetHostConfig;
UpdateResource = SaveHostConfig; UpdateResource = SaveHostConfig;
SharedValidator.RuleFor(c => c.BindAddress) SharedValidator.RuleFor(c => c.Branch).NotEmpty().WithMessage("Branch name is required, 'master' is the default");
.ValidIp4Address()
.NotListenAllIp4Address()
.When(c => c.BindAddress != "*");
SharedValidator.RuleFor(c => c.Port).ValidPort(); SharedValidator.RuleFor(c => c.Port).ValidPort();
SharedValidator.RuleFor(c => c.UrlBase).ValidUrlBase();
SharedValidator.RuleFor(c => c.Username).NotEmpty().When(c => c.AuthenticationMethod != AuthenticationType.None); SharedValidator.RuleFor(c => c.Username).NotEmpty().When(c => c.AuthenticationMethod != AuthenticationType.None);
SharedValidator.RuleFor(c => c.Password).NotEmpty().When(c => c.AuthenticationMethod != AuthenticationType.None); SharedValidator.RuleFor(c => c.Password).NotEmpty().When(c => c.AuthenticationMethod != AuthenticationType.None);
SharedValidator.RuleFor(c => c.SslPort).ValidPort().When(c => c.EnableSsl); SharedValidator.RuleFor(c => c.SslPort).ValidPort().When(c => c.EnableSsl);
SharedValidator.RuleFor(c => c.SslCertHash).NotEmpty().When(c => c.EnableSsl && OsInfo.IsWindows); SharedValidator.RuleFor(c => c.SslCertHash).NotEmpty().When(c => c.EnableSsl && OsInfo.IsWindows);
SharedValidator.RuleFor(c => c.Branch).NotEmpty().WithMessage("Branch name is required, 'master' is the default");
SharedValidator.RuleFor(c => c.UpdateScriptPath).IsValidPath().When(c => c.UpdateMechanism == UpdateMechanism.Script); SharedValidator.RuleFor(c => c.UpdateScriptPath).IsValidPath().When(c => c.UpdateMechanism == UpdateMechanism.Script);
SharedValidator.RuleFor(c => c.BindAddress)
.ValidIp4Address()
.NotListenAllIp4Address()
.When(c => c.BindAddress != "*");
} }
private HostConfigResource GetHostConfig() private HostConfigResource GetHostConfig()
{ {
var resource = _configFileProvider.ToResource(_configService); var resource = new HostConfigResource();
resource.InjectFrom(_configFileProvider);
resource.Id = 1; resource.Id = 1;
var user = _userService.FindUser(); var user = _userService.FindUser();
if (user != null) if (user != null)
{ {
resource.Username = user.Username; resource.Username = user.Username;
@@ -74,7 +73,6 @@ namespace NzbDrone.Api.Config
.ToDictionary(prop => prop.Name, prop => prop.GetValue(resource, null)); .ToDictionary(prop => prop.Name, prop => prop.GetValue(resource, null));
_configFileProvider.SaveConfigDictionary(dictionary); _configFileProvider.SaveConfigDictionary(dictionary);
_configService.SaveConfigDictionary(dictionary);
if (resource.Username.IsNotNullOrWhiteSpace() && resource.Password.IsNotNullOrWhiteSpace()) if (resource.Username.IsNotNullOrWhiteSpace() && resource.Password.IsNotNullOrWhiteSpace())
{ {
+18 -62
View File
@@ -1,73 +1,29 @@
using NzbDrone.Api.REST; using System;
using NzbDrone.Api.REST;
using NzbDrone.Core.Authentication; using NzbDrone.Core.Authentication;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Update; using NzbDrone.Core.Update;
using NzbDrone.Common.Http.Proxy;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
public class HostConfigResource : RestResource public class HostConfigResource : RestResource
{ {
public string BindAddress { get; set; } public String BindAddress { get; set; }
public int Port { get; set; } public Int32 Port { get; set; }
public int SslPort { get; set; } public Int32 SslPort { get; set; }
public bool EnableSsl { get; set; } public Boolean EnableSsl { get; set; }
public bool LaunchBrowser { get; set; } public Boolean LaunchBrowser { get; set; }
public AuthenticationType AuthenticationMethod { get; set; } public AuthenticationType AuthenticationMethod { get; set; }
public bool AnalyticsEnabled { get; set; } public Boolean AnalyticsEnabled { get; set; }
public string Username { get; set; } public String Username { get; set; }
public string Password { get; set; } public String Password { get; set; }
public string LogLevel { get; set; } public String LogLevel { get; set; }
public string Branch { get; set; } public String Branch { get; set; }
public string ApiKey { get; set; } public String ApiKey { get; set; }
public string SslCertHash { get; set; } public Boolean Torrent { get; set; }
public string UrlBase { get; set; } public String SslCertHash { get; set; }
public bool UpdateAutomatically { get; set; } public String UrlBase { get; set; }
public Boolean UpdateAutomatically { get; set; }
public UpdateMechanism UpdateMechanism { get; set; } public UpdateMechanism UpdateMechanism { get; set; }
public string UpdateScriptPath { get; set; } public String UpdateScriptPath { get; set; }
public bool ProxyEnabled { get; set; }
public ProxyType ProxyType { get; set; }
public string ProxyHostname { get; set; }
public int ProxyPort { get; set; }
public string ProxyUsername { get; set; }
public string ProxyPassword { get; set; }
public string ProxyBypassFilter { get; set; }
public bool ProxyBypassLocalAddresses { get; set; }
}
public static class HostConfigResourceMapper
{
public static HostConfigResource ToResource(this IConfigFileProvider model, IConfigService configService)
{
// TODO: Clean this mess up. don't mix data from multiple classes, use sub-resources instead?
return new HostConfigResource
{
BindAddress = model.BindAddress,
Port = model.Port,
SslPort = model.SslPort,
EnableSsl = model.EnableSsl,
LaunchBrowser = model.LaunchBrowser,
AuthenticationMethod = model.AuthenticationMethod,
AnalyticsEnabled = model.AnalyticsEnabled,
//Username
//Password
LogLevel = model.LogLevel,
Branch = model.Branch,
ApiKey = model.ApiKey,
SslCertHash = model.SslCertHash,
UrlBase = model.UrlBase,
UpdateAutomatically = model.UpdateAutomatically,
UpdateMechanism = model.UpdateMechanism,
UpdateScriptPath = model.UpdateScriptPath,
ProxyEnabled = configService.ProxyEnabled,
ProxyType = configService.ProxyType,
ProxyHostname = configService.ProxyHostname,
ProxyPort = configService.ProxyPort,
ProxyUsername = configService.ProxyUsername,
ProxyPassword = configService.ProxyPassword,
ProxyBypassFilter = configService.ProxyBypassFilter,
ProxyBypassLocalAddresses = configService.ProxyBypassLocalAddresses
};
}
} }
} }
@@ -1,5 +1,4 @@
using FluentValidation; using FluentValidation;
using NzbDrone.Api.Validation;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
@@ -17,12 +16,8 @@ namespace NzbDrone.Api.Config
.GreaterThanOrEqualTo(0); .GreaterThanOrEqualTo(0);
SharedValidator.RuleFor(c => c.RssSyncInterval) SharedValidator.RuleFor(c => c.RssSyncInterval)
.IsValidRssSyncInterval(); .InclusiveBetween(10, 120)
} .When(c => c.RssSyncInterval > 0);
protected override IndexerConfigResource ToResource(IConfigService model)
{
return IndexerConfigResourceMapper.ToResource(model);
} }
} }
} }
@@ -1,25 +1,12 @@
using NzbDrone.Api.REST; using System;
using NzbDrone.Core.Configuration; using NzbDrone.Api.REST;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
public class IndexerConfigResource : RestResource public class IndexerConfigResource : RestResource
{ {
public int MinimumAge { get; set; } public Int32 MinimumAge { get; set; }
public int Retention { get; set; } public Int32 Retention { get; set; }
public int RssSyncInterval { get; set; } public Int32 RssSyncInterval { get; set; }
}
public static class IndexerConfigResourceMapper
{
public static IndexerConfigResource ToResource(IConfigService model)
{
return new IndexerConfigResource
{
MinimumAge = model.MinimumAge,
Retention = model.Retention,
RssSyncInterval = model.RssSyncInterval,
};
}
} }
} }
@@ -1,4 +1,5 @@
using FluentValidation; using System;
using FluentValidation;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Validation.Paths; using NzbDrone.Core.Validation.Paths;
@@ -11,12 +12,7 @@ namespace NzbDrone.Api.Config
{ {
SharedValidator.RuleFor(c => c.FileChmod).NotEmpty(); SharedValidator.RuleFor(c => c.FileChmod).NotEmpty();
SharedValidator.RuleFor(c => c.FolderChmod).NotEmpty(); SharedValidator.RuleFor(c => c.FolderChmod).NotEmpty();
SharedValidator.RuleFor(c => c.RecycleBin).IsValidPath().SetValidator(pathExistsValidator).When(c => !string.IsNullOrWhiteSpace(c.RecycleBin)); SharedValidator.RuleFor(c => c.RecycleBin).IsValidPath().SetValidator(pathExistsValidator).When(c => !String.IsNullOrWhiteSpace(c.RecycleBin));
}
protected override MediaManagementConfigResource ToResource(IConfigService model)
{
return MediaManagementConfigResourceMapper.ToResource(model);
} }
} }
} }
@@ -1,52 +1,25 @@
using NzbDrone.Api.REST; using System;
using NzbDrone.Core.Configuration; using NzbDrone.Api.REST;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
public class MediaManagementConfigResource : RestResource public class MediaManagementConfigResource : RestResource
{ {
public bool AutoUnmonitorPreviouslyDownloadedEpisodes { get; set; } public Boolean AutoUnmonitorPreviouslyDownloadedEpisodes { get; set; }
public string RecycleBin { get; set; } public String RecycleBin { get; set; }
public bool AutoDownloadPropers { get; set; } public Boolean AutoDownloadPropers { get; set; }
public bool CreateEmptySeriesFolders { get; set; } public Boolean CreateEmptySeriesFolders { get; set; }
public FileDateType FileDate { get; set; } public FileDateType FileDate { get; set; }
public bool SetPermissionsLinux { get; set; } public Boolean SetPermissionsLinux { get; set; }
public string FileChmod { get; set; } public String FileChmod { get; set; }
public string FolderChmod { get; set; } public String FolderChmod { get; set; }
public string ChownUser { get; set; } public String ChownUser { get; set; }
public string ChownGroup { get; set; } public String ChownGroup { get; set; }
public bool SkipFreeSpaceCheckWhenImporting { get; set; } public Boolean SkipFreeSpaceCheckWhenImporting { get; set; }
public bool CopyUsingHardlinks { get; set; } public Boolean CopyUsingHardlinks { get; set; }
public string ExtraFileExtensions { get; set; } public Boolean EnableMediaInfo { get; set; }
public bool EnableMediaInfo { get; set; }
}
public static class MediaManagementConfigResourceMapper
{
public static MediaManagementConfigResource ToResource(IConfigService model)
{
return new MediaManagementConfigResource
{
AutoUnmonitorPreviouslyDownloadedEpisodes = model.AutoUnmonitorPreviouslyDownloadedEpisodes,
RecycleBin = model.RecycleBin,
AutoDownloadPropers = model.AutoDownloadPropers,
CreateEmptySeriesFolders = model.CreateEmptySeriesFolders,
FileDate = model.FileDate,
SetPermissionsLinux = model.SetPermissionsLinux,
FileChmod = model.FileChmod,
FolderChmod = model.FolderChmod,
ChownUser = model.ChownUser,
ChownGroup = model.ChownGroup,
SkipFreeSpaceCheckWhenImporting = model.SkipFreeSpaceCheckWhenImporting,
CopyUsingHardlinks = model.CopyUsingHardlinks,
ExtraFileExtensions = model.ExtraFileExtensions,
EnableMediaInfo = model.EnableMediaInfo
};
}
} }
} }
+12 -7
View File
@@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using FluentValidation; using FluentValidation;
using FluentValidation.Results; using FluentValidation.Results;
@@ -6,7 +7,9 @@ using Nancy.Responses;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Organizer; using NzbDrone.Core.Organizer;
using Nancy.ModelBinding; using Nancy.ModelBinding;
using NzbDrone.Api.Mapping;
using NzbDrone.Api.Extensions; using NzbDrone.Api.Extensions;
using Omu.ValueInjecter;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
@@ -43,7 +46,7 @@ namespace NzbDrone.Api.Config
private void UpdateNamingConfig(NamingConfigResource resource) private void UpdateNamingConfig(NamingConfigResource resource)
{ {
var nameSpec = resource.ToModel(); var nameSpec = resource.InjectTo<NamingConfig>();
ValidateFormatResult(nameSpec); ValidateFormatResult(nameSpec);
_namingConfigService.Save(nameSpec); _namingConfigService.Save(nameSpec);
@@ -52,14 +55,16 @@ namespace NzbDrone.Api.Config
private NamingConfigResource GetNamingConfig() private NamingConfigResource GetNamingConfig()
{ {
var nameSpec = _namingConfigService.GetConfig(); var nameSpec = _namingConfigService.GetConfig();
var resource = nameSpec.ToResource(); var resource = nameSpec.InjectTo<NamingConfigResource>();
if (resource.StandardEpisodeFormat.IsNotNullOrWhiteSpace()) if (String.IsNullOrWhiteSpace(resource.StandardEpisodeFormat))
{ {
var basicConfig = _filenameBuilder.GetBasicNamingConfig(nameSpec); return resource;
basicConfig.AddToResource(resource);
} }
var basicConfig = _filenameBuilder.GetBasicNamingConfig(nameSpec);
resource.InjectFrom(basicConfig);
return resource; return resource;
} }
@@ -70,7 +75,7 @@ namespace NzbDrone.Api.Config
private JsonResponse<NamingSampleResource> GetExamples(NamingConfigResource config) private JsonResponse<NamingSampleResource> GetExamples(NamingConfigResource config)
{ {
var nameSpec = config.ToModel(); var nameSpec = config.InjectTo<NamingConfig>();
var sampleResource = new NamingSampleResource(); var sampleResource = new NamingSampleResource();
var singleEpisodeSampleResult = _filenameSampleService.GetStandardSample(nameSpec); var singleEpisodeSampleResult = _filenameSampleService.GetStandardSample(nameSpec);
@@ -1,13 +1,12 @@
using NzbDrone.Api.REST; using System;
using NzbDrone.Core.Organizer; using NzbDrone.Api.REST;
namespace NzbDrone.Api.Config namespace NzbDrone.Api.Config
{ {
public class NamingConfigResource : RestResource public class NamingConfigResource : RestResource
{ {
public bool RenameEpisodes { get; set; } public Boolean RenameEpisodes { get; set; }
public bool ReplaceIllegalCharacters { get; set; } public Int32 MultiEpisodeStyle { get; set; }
public int MultiEpisodeStyle { get; set; }
public string StandardEpisodeFormat { get; set; } public string StandardEpisodeFormat { get; set; }
public string DailyEpisodeFormat { get; set; } public string DailyEpisodeFormat { get; set; }
public string AnimeEpisodeFormat { get; set; } public string AnimeEpisodeFormat { get; set; }
@@ -20,57 +19,4 @@ namespace NzbDrone.Api.Config
public string Separator { get; set; } public string Separator { get; set; }
public string NumberStyle { get; set; } public string NumberStyle { get; set; }
} }
public static class NamingConfigResourceMapper
{
public static NamingConfigResource ToResource(this NamingConfig model)
{
return new NamingConfigResource
{
Id = model.Id,
RenameEpisodes = model.RenameEpisodes,
ReplaceIllegalCharacters = model.ReplaceIllegalCharacters,
MultiEpisodeStyle = model.MultiEpisodeStyle,
StandardEpisodeFormat = model.StandardEpisodeFormat,
DailyEpisodeFormat = model.DailyEpisodeFormat,
AnimeEpisodeFormat = model.AnimeEpisodeFormat,
SeriesFolderFormat = model.SeriesFolderFormat,
SeasonFolderFormat = model.SeasonFolderFormat
//IncludeSeriesTitle
//IncludeEpisodeTitle
//IncludeQuality
//ReplaceSpaces
//Separator
//NumberStyle
};
}
public static void AddToResource(this BasicNamingConfig basicNamingConfig, NamingConfigResource resource)
{
resource.IncludeSeriesTitle = basicNamingConfig.IncludeSeriesTitle;
resource.IncludeEpisodeTitle = basicNamingConfig.IncludeEpisodeTitle;
resource.IncludeQuality = basicNamingConfig.IncludeQuality;
resource.ReplaceSpaces = basicNamingConfig.ReplaceSpaces;
resource.Separator = basicNamingConfig.Separator;
resource.NumberStyle = basicNamingConfig.NumberStyle;
}
public static NamingConfig ToModel(this NamingConfigResource resource)
{
return new NamingConfig
{
Id = resource.Id,
RenameEpisodes = resource.RenameEpisodes,
ReplaceIllegalCharacters = resource.ReplaceIllegalCharacters,
MultiEpisodeStyle = resource.MultiEpisodeStyle,
StandardEpisodeFormat = resource.StandardEpisodeFormat,
DailyEpisodeFormat = resource.DailyEpisodeFormat,
AnimeEpisodeFormat = resource.AnimeEpisodeFormat,
SeriesFolderFormat = resource.SeriesFolderFormat,
SeasonFolderFormat = resource.SeasonFolderFormat
};
}
}
} }

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