mirror of
https://github.com/Sonarr/Sonarr.git
synced 2026-03-05 13:20:20 -05:00
Compare commits
237 Commits
v2.0.0.335
...
v2.0.0.373
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b72c0e328 | ||
|
|
536aa350f0 | ||
|
|
7c382c0e0c | ||
|
|
dda0d3259f | ||
|
|
a96718f7b3 | ||
|
|
7ca67fe57a | ||
|
|
8373024f9d | ||
|
|
b62ef0c40c | ||
|
|
376481eda5 | ||
|
|
800fa42982 | ||
|
|
4e728c3a02 | ||
|
|
663d254ced | ||
|
|
8753c232c7 | ||
|
|
221f3ef08c | ||
|
|
b59175a87c | ||
|
|
37c621dcdb | ||
|
|
eaf3228bb7 | ||
|
|
c8debbf470 | ||
|
|
8dcd8d17b5 | ||
|
|
cfe121c777 | ||
|
|
b4f83d8a4e | ||
|
|
9039d7e694 | ||
|
|
7a25717da6 | ||
|
|
7e1c444c02 | ||
|
|
dc3f7c9bda | ||
|
|
de754169fb | ||
|
|
2d3c3bbb0c | ||
|
|
15cefe4a43 | ||
|
|
95da301975 | ||
|
|
e03906b294 | ||
|
|
7921dd3f96 | ||
|
|
9f066f7a6b | ||
|
|
81d131e732 | ||
|
|
0552b56b71 | ||
|
|
3952ee402b | ||
|
|
0b3e27cb44 | ||
|
|
4fa4b3507e | ||
|
|
8c211364e2 | ||
|
|
2d9917d074 | ||
|
|
d514699ab7 | ||
|
|
dc176a83b3 | ||
|
|
69e3516a89 | ||
|
|
c8a0f9fa7a | ||
|
|
c2b9504b15 | ||
|
|
2693a3df2e | ||
|
|
8062466ab8 | ||
|
|
6cde1dd5ae | ||
|
|
b6c4a97675 | ||
|
|
a9444cef30 | ||
|
|
bf217a7093 | ||
|
|
b6b5355261 | ||
|
|
bc37084ec4 | ||
|
|
0a1a30f2af | ||
|
|
7e023a7944 | ||
|
|
91f68de8a7 | ||
|
|
994e2a6c57 | ||
|
|
04da2d845a | ||
|
|
d3b87bc3e8 | ||
|
|
554c81f251 | ||
|
|
6de3f9dd0b | ||
|
|
e9692d5b9c | ||
|
|
1a74990e9b | ||
|
|
3b9ac8699d | ||
|
|
ea6ae85f7a | ||
|
|
b02b9f026f | ||
|
|
c419e7b710 | ||
|
|
cd9132520d | ||
|
|
08d19df3f7 | ||
|
|
b34879b4f6 | ||
|
|
6b9c4af591 | ||
|
|
c00c207517 | ||
|
|
6f7fea3591 | ||
|
|
83eebfe153 | ||
|
|
fce3f86be7 | ||
|
|
2d42c59d70 | ||
|
|
f0933b9786 | ||
|
|
e4e687c2a4 | ||
|
|
44de353b8b | ||
|
|
aac4938598 | ||
|
|
d37b24cd0b | ||
|
|
c9a36fe4b2 | ||
|
|
f01a21ce43 | ||
|
|
cc72699b8a | ||
|
|
04de0049fe | ||
|
|
330554edb0 | ||
|
|
a06a3fa5d6 | ||
|
|
e8d6d62fba | ||
|
|
9cc8ed545f | ||
|
|
8bf969983b | ||
|
|
4ee7d57b7d | ||
|
|
6ff754eec0 | ||
|
|
862f8024e3 | ||
|
|
d170c9ad07 | ||
|
|
20df619ddd | ||
|
|
f7859c8eb5 | ||
|
|
97cdcb8b19 | ||
|
|
e3c4070924 | ||
|
|
74403815d9 | ||
|
|
897937a778 | ||
|
|
b6ddc8756b | ||
|
|
25aa3b60b0 | ||
|
|
fe76d0f98f | ||
|
|
e13c89521d | ||
|
|
828071c1a5 | ||
|
|
408d86245e | ||
|
|
e67de6aae8 | ||
|
|
45cdb98c58 | ||
|
|
6585aed0a9 | ||
|
|
ef305b8d25 | ||
|
|
84c7f4cd8c | ||
|
|
9162e97dd5 | ||
|
|
1ad1d73c91 | ||
|
|
88ce0ec487 | ||
|
|
99f452e299 | ||
|
|
7af7c2003e | ||
|
|
bb482047b1 | ||
|
|
a39b36d157 | ||
|
|
0841bf1d2a | ||
|
|
97f1761092 | ||
|
|
0e90bf5227 | ||
|
|
192d001b61 | ||
|
|
68cd9ab8c8 | ||
|
|
4be0fe1b76 | ||
|
|
9ffa28f17c | ||
|
|
0b219e1169 | ||
|
|
ccfa13e383 | ||
|
|
d6a135857d | ||
|
|
6ed7a8b471 | ||
|
|
7426efd423 | ||
|
|
95017884d7 | ||
|
|
db5494e7ac | ||
|
|
2d7774c018 | ||
|
|
986dae590b | ||
|
|
99f6c65b76 | ||
|
|
0c7d8c2d38 | ||
|
|
c63b65eba1 | ||
|
|
3fc348d045 | ||
|
|
5dae0b24d3 | ||
|
|
07b70f9d3f | ||
|
|
4060a24eec | ||
|
|
d637ee1a2d | ||
|
|
30bcc662bc | ||
|
|
57afa668e1 | ||
|
|
d7eae958b7 | ||
|
|
c591a86b02 | ||
|
|
49dea2cd7f | ||
|
|
fa527d7820 | ||
|
|
81778cb0b0 | ||
|
|
e1afd89aae | ||
|
|
a2f62a5dcd | ||
|
|
19f09fdb86 | ||
|
|
68e12f1c5e | ||
|
|
5acaf9d60b | ||
|
|
741dc8f50b | ||
|
|
28a70a0cf1 | ||
|
|
bf10d420ec | ||
|
|
7286ccdd56 | ||
|
|
c5b25bcfee | ||
|
|
187064101c | ||
|
|
66e829f71e | ||
|
|
a28dd6269a | ||
|
|
53985a282d | ||
|
|
ffffd8ca69 | ||
|
|
d3b9ebf86c | ||
|
|
d41dd05d00 | ||
|
|
8f9e076325 | ||
|
|
ac587168cd | ||
|
|
bb144a6df6 | ||
|
|
4f38454825 | ||
|
|
3a59b38037 | ||
|
|
f032cc8cf6 | ||
|
|
1a872035e7 | ||
|
|
026e05dcee | ||
|
|
99fd1fd4c1 | ||
|
|
d6bfa561ad | ||
|
|
8d0dab6578 | ||
|
|
1a402a9cf4 | ||
|
|
211863d55d | ||
|
|
38c57ce73a | ||
|
|
372ba13fd2 | ||
|
|
9bcb6ff19a | ||
|
|
2627072aab | ||
|
|
7991a3f1c3 | ||
|
|
408991e03c | ||
|
|
5ea954695e | ||
|
|
648a16c1bb | ||
|
|
8090c853ba | ||
|
|
809c8a7f37 | ||
|
|
608cb296e6 | ||
|
|
7cf400975e | ||
|
|
4faf7ed959 | ||
|
|
25493654ff | ||
|
|
48f70815a3 | ||
|
|
a720e5f3b5 | ||
|
|
a84f39bb48 | ||
|
|
c56cf8860e | ||
|
|
2d968a725c | ||
|
|
b1d0d422e9 | ||
|
|
86b748b9eb | ||
|
|
129d7c9338 | ||
|
|
7f23d25fcf | ||
|
|
b82e830e86 | ||
|
|
2fbf7a4114 | ||
|
|
e05365a669 | ||
|
|
44e6c46337 | ||
|
|
ecb4835a16 | ||
|
|
8c31af608b | ||
|
|
9b1915a187 | ||
|
|
db879426db | ||
|
|
c274c7d589 | ||
|
|
8bd675f9f4 | ||
|
|
0a12989a70 | ||
|
|
5b58bd504d | ||
|
|
f4d9e3495a | ||
|
|
fcfbfae4c1 | ||
|
|
3f7ae250c7 | ||
|
|
645c9c25d1 | ||
|
|
c8b7446f7c | ||
|
|
293bc55e58 | ||
|
|
7eeabd7ca3 | ||
|
|
c16d02fc1d | ||
|
|
fc75783fbe | ||
|
|
58b01b91d5 | ||
|
|
c6c68c0c75 | ||
|
|
9fe8477a40 | ||
|
|
794a7957ef | ||
|
|
5c1d683e71 | ||
|
|
0789ace879 | ||
|
|
9b16e3b538 | ||
|
|
98acd0d886 | ||
|
|
760469fc5f | ||
|
|
5af12b67be | ||
|
|
a1bfecedcd | ||
|
|
f2a70677e4 | ||
|
|
6d046a8df8 | ||
|
|
23bd9440b3 | ||
|
|
0f2bba0615 |
7
.gitignore
vendored
7
.gitignore
vendored
@@ -97,7 +97,7 @@ App_Data/*.ldf
|
||||
_NCrunch_*
|
||||
_TeamCity*
|
||||
|
||||
# NzbDrone
|
||||
# Sonarr
|
||||
config.xml
|
||||
nzbdrone.log*txt
|
||||
UpdateLogs/
|
||||
@@ -105,7 +105,7 @@ UpdateLogs/
|
||||
*.test-cache
|
||||
*.userprefs
|
||||
*/test-results/*
|
||||
.idea/*
|
||||
src/UI/.idea/*
|
||||
*log.txt
|
||||
node_modules/
|
||||
_output*
|
||||
@@ -113,9 +113,6 @@ _rawPackage/
|
||||
_dotTrace*
|
||||
_tests/
|
||||
*.Result.xml
|
||||
wix/*.msi
|
||||
wix/*.wixobj
|
||||
wix/*.wixpdb
|
||||
setup/Output/
|
||||
*.~is
|
||||
|
||||
|
||||
1
.idea/.name
generated
Normal file
1
.idea/.name
generated
Normal file
@@ -0,0 +1 @@
|
||||
Sonarr
|
||||
25
.idea/Sonarr.iml
generated
Normal file
25
.idea/Sonarr.iml
generated
Normal file
@@ -0,0 +1,25 @@
|
||||
<?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
.idea/codeStyleSettings.xml
generated
Normal file
59
.idea/codeStyleSettings.xml
generated
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectCodeStyleSettingsManager">
|
||||
<option name="PER_PROJECT_SETTINGS">
|
||||
<value>
|
||||
<option name="LINE_SEPARATOR" value=" " />
|
||||
<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>
|
||||
7
.idea/jsLibraryMappings.xml
generated
Normal file
7
.idea/jsLibraryMappings.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JavaScriptLibraryMappings">
|
||||
<file url="file://$PROJECT_DIR$" libraries="{Sonarr node_modules}" />
|
||||
<includedPredefinedLibrary name="ECMAScript 6" />
|
||||
</component>
|
||||
</project>
|
||||
14
.idea/libraries/Sonarr_node_modules.xml
generated
Normal file
14
.idea/libraries/Sonarr_node_modules.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
||||
<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
.idea/misc.xml
generated
Normal file
14
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
||||
<?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
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?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>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
4
CLA.md
4
CLA.md
@@ -1,6 +1,6 @@
|
||||
# NzbDrone Individual Contributor License Agreement #
|
||||
# Sonarr Individual Contributor License Agreement #
|
||||
|
||||
Thank you for your interest in contributing to NzbDrone ("We" or "Us").
|
||||
Thank you for your interest in contributing to Sonarr ("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.
|
||||
|
||||
## 1. Definitions ##
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# How 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>.
|
||||
We're always looking for people to help make Sonarr even better, there are a number of ways to contribute. To get started, <a href="http://www.clahub.com/agreements/NzbDrone/NzbDrone">sign the Contributor License Agreement</a>.
|
||||
|
||||
## Documentation ##
|
||||
Setup guides, FAQ, the more information we have on the wiki the better.
|
||||
@@ -15,15 +15,15 @@ Setup guides, FAQ, the more information we have on the wiki the better.
|
||||
|
||||
### Getting started ###
|
||||
|
||||
1. Fork NzbDrone
|
||||
2. Clone (develop branch)
|
||||
1. Fork Sonarr
|
||||
2. Clone (develop branch) *you may need pull in submodules separately if you client doesn't clone them automatically (CurlSharp)*
|
||||
3. Run `npm install`
|
||||
4. Run `gulp watch` - Used to compile the UI components and copy them (leave this window open)
|
||||
5. Compile in Visual Studio
|
||||
|
||||
### 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)
|
||||
- Rebase from NzbDrone's develop branch, don't merge
|
||||
- Rebase from Sonarr's develop branch, don't merge
|
||||
- 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
|
||||
- Reach out to us on the forums or on IRC if you have any questions
|
||||
|
||||
@@ -1,720 +0,0 @@
|
||||
<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>
|
||||
@@ -1,2 +0,0 @@
|
||||
<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>
|
||||
@@ -33,6 +33,7 @@ Function Build()
|
||||
|
||||
Write-Host "Removing Mono.Posix.dll"
|
||||
Remove-Item "$outputFolder\Mono.Posix.dll"
|
||||
Get-ChildItem $outputFolder -File -Filter "*.dylib" -Recurse | foreach ($_) {Remove-Item $_.Fullname}
|
||||
|
||||
Write-Host "##teamcity[progressFinish 'Build']"
|
||||
}
|
||||
@@ -218,6 +219,9 @@ Function PackageTests()
|
||||
Write-Host "Adding NzbDrone.Core.dll.config (for dllmap)"
|
||||
Copy-Item "$sourceFolder\NzbDrone.Core\NzbDrone.Core.dll.config" -Destination $testPackageFolder -Force
|
||||
|
||||
Write-Host "Copying CurlSharp libraries"
|
||||
Copy-Item $sourceFolder\ExternalModules\CurlSharp\libs\i386\* $testPackageFolder
|
||||
|
||||
Write-Host "##teamcity[progressFinish 'Creating Test Package']"
|
||||
}
|
||||
|
||||
@@ -230,6 +234,9 @@ Function RunGulp()
|
||||
Invoke-Expression 'gulp build' -ErrorAction Continue -Verbose
|
||||
CheckExitCode
|
||||
|
||||
Invoke-Expression 'gulp build --phantom' -ErrorAction Continue -Verbose
|
||||
CheckExitCode
|
||||
|
||||
Write-Host "##teamcity[progressFinish 'Running Gulp']"
|
||||
}
|
||||
|
||||
|
||||
260
build.sh
Executable file
260
build.sh
Executable file
@@ -0,0 +1,260 @@
|
||||
#! /bin/bash
|
||||
msBuild='/c/Windows/Microsoft.NET/Framework64/v4.0.30319/'
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
echo "Removing XMLDoc files"
|
||||
local xmlfiles=( $(find $path -name "*.xml") )
|
||||
for filename in "${xmlfiles[@]}"
|
||||
do
|
||||
if [ -e ${filename%.xml}.dll ] || [ -e ${filename%.xml}.exe ] ; then
|
||||
rm $filename
|
||||
fi
|
||||
done
|
||||
|
||||
find $path -name "*.transform" -exec rm "{}" \;
|
||||
|
||||
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 "{}" \;
|
||||
|
||||
if [ -d $path/NuGet ] ; then
|
||||
echo "Removing NuGet"
|
||||
rm -rf $path/NuGet
|
||||
fi
|
||||
|
||||
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 $sourceFolder/NzbDrone.sln //t:Clean //m
|
||||
CheckExitCode MSBuild.exe $sourceFolder/NzbDrone.sln //p:Configuration=Release //p:Platform=x86 //t:Build //m
|
||||
}
|
||||
|
||||
BuildWithXbuild()
|
||||
{
|
||||
export MONO_IOMAP=case
|
||||
CheckExitCode xbuild /t:Clean $sourceFolder/NzbDrone.sln
|
||||
CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build $sourceFolder/NzbDrone.sln
|
||||
}
|
||||
|
||||
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 'Running Gulp']"
|
||||
|
||||
CheckExitCode npm install
|
||||
CheckExitCode gulp build
|
||||
|
||||
echo "##teamcity[progressFinish 'Running Gulp']"
|
||||
}
|
||||
|
||||
CreateMdbs()
|
||||
{
|
||||
local path=$1
|
||||
if [ $runtime = "dotnet" ] ; then
|
||||
find $path \( -name "*.exe" -o -name "*.dll" \) -not -name "MediaInfo.dll" -not -name "sqlite3.dll" -exec tools/pdb2mdb/pdb2mdb.exe "{}" \;
|
||||
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
|
||||
}
|
||||
|
||||
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/Sonarr.app $outputFolderOsxApp
|
||||
cp -r $outputFolderOsx $outputFolderOsxApp/Sonarr.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 . -maxdepth 6 -path $testSearchPattern -exec cp -r "{}" $testPackageFolder \;
|
||||
|
||||
if [ $runtime = "dotnet" ] ; then
|
||||
$sourceFolder/.nuget/NuGet.exe install NUnit.Runners -Version 2.6.1 -Output $testPackageFolder
|
||||
cp $outputFolder/*.pdb $testPackageFolder
|
||||
else
|
||||
mono $sourceFolder/.nuget/NuGet.exe install NUnit.Runners -Version 2.6.1 -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
|
||||
@@ -1,50 +0,0 @@
|
||||
<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
|
||||
@@ -6,7 +6,13 @@ require('./less');
|
||||
require('./handlebars');
|
||||
require('./copy');
|
||||
|
||||
gulp.task('build', function () {
|
||||
return runSequence('clean',
|
||||
['webpack', 'less', 'handlebars', 'copyHtml', 'copyContent', 'copyJs']);
|
||||
gulp.task('build', function() {
|
||||
return runSequence('clean', [
|
||||
'webpack',
|
||||
'less',
|
||||
'handlebars',
|
||||
'copyHtml',
|
||||
'copyContent',
|
||||
'copyJs'
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -3,6 +3,6 @@ var del = require('del');
|
||||
|
||||
var paths = require('./paths');
|
||||
|
||||
gulp.task('clean', function (cb) {
|
||||
del([paths.dest.root], cb);
|
||||
gulp.task('clean', function(cb) {
|
||||
del([paths.dest.root], cb);
|
||||
});
|
||||
|
||||
30
gulp/copy.js
30
gulp/copy.js
@@ -1,27 +1,31 @@
|
||||
var gulp = require('gulp');
|
||||
var print = require('gulp-print');
|
||||
var cache = require('gulp-cached');
|
||||
var livereload = require('gulp-livereload');
|
||||
|
||||
var paths = require('./paths.js');
|
||||
|
||||
gulp.task('copyJs', function () {
|
||||
return gulp.src(
|
||||
[
|
||||
paths.src.root + "polyfills.js",
|
||||
paths.src.root + "JsLibraries/handlebars.runtime.js",
|
||||
])
|
||||
.pipe(cache('copyJs'))
|
||||
.pipe(print())
|
||||
.pipe(gulp.dest(paths.dest.root));
|
||||
return gulp.src(
|
||||
[
|
||||
paths.src.root + 'polyfills.js',
|
||||
paths.src.root + 'JsLibraries/handlebars.runtime.js'
|
||||
])
|
||||
.pipe(cache('copyJs'))
|
||||
.pipe(print())
|
||||
.pipe(gulp.dest(paths.dest.root))
|
||||
.pipe(livereload());
|
||||
});
|
||||
|
||||
gulp.task('copyHtml', function () {
|
||||
return gulp.src(paths.src.html)
|
||||
.pipe(cache('copyHtml'))
|
||||
.pipe(gulp.dest(paths.dest.root));
|
||||
return gulp.src(paths.src.html)
|
||||
.pipe(cache('copyHtml'))
|
||||
.pipe(gulp.dest(paths.dest.root))
|
||||
.pipe(livereload());
|
||||
});
|
||||
|
||||
gulp.task('copyContent', function () {
|
||||
return gulp.src([paths.src.content + '**/*.*', '!**/*.less'])
|
||||
.pipe(gulp.dest(paths.dest.content));
|
||||
return gulp.src([paths.src.content + '**/*.*', '!**/*.less'])
|
||||
.pipe(gulp.dest(paths.dest.content))
|
||||
.pipe(livereload());
|
||||
});
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
module.exports = {
|
||||
onError:function (error) {
|
||||
onError : function(error) {
|
||||
//If you want details of the error in the console
|
||||
console.log(error.toString());
|
||||
this.emit('end');
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -3,21 +3,25 @@ var handlebars = require('gulp-handlebars');
|
||||
var declare = require('gulp-declare');
|
||||
var concat = require('gulp-concat');
|
||||
var wrap = require("gulp-wrap");
|
||||
var livereload = require('gulp-livereload');
|
||||
var path = require('path');
|
||||
var streamqueue = require('streamqueue');
|
||||
var stripbom = require('gulp-stripbom');
|
||||
|
||||
var paths = require('./paths.js');
|
||||
|
||||
gulp.task('handlebars', function () {
|
||||
gulp.task('handlebars', function() {
|
||||
|
||||
var coreStream = gulp.src([paths.src.templates, '!*/**/*Partial.*'])
|
||||
.pipe(stripbom({ showLog: false }))
|
||||
var coreStream = gulp.src([
|
||||
paths.src.templates,
|
||||
'!*/**/*Partial.*'
|
||||
])
|
||||
.pipe(stripbom({ showLog : false }))
|
||||
.pipe(handlebars())
|
||||
.pipe(declare({
|
||||
namespace: 'T',
|
||||
noRedeclare: true,
|
||||
processName: function (filePath) {
|
||||
namespace : 'T',
|
||||
noRedeclare : true,
|
||||
processName : function(filePath) {
|
||||
|
||||
filePath = path.relative(paths.src.root, filePath);
|
||||
|
||||
@@ -29,12 +33,12 @@ gulp.task('handlebars', function () {
|
||||
}));
|
||||
|
||||
var partialStream = gulp.src([paths.src.partials])
|
||||
.pipe(stripbom({ showLog: false }))
|
||||
.pipe(stripbom({ showLog : false }))
|
||||
.pipe(handlebars())
|
||||
.pipe(wrap('Handlebars.template(<%= contents %>)'))
|
||||
.pipe(wrap('Handlebars.registerPartial(<%= processPartialName(file.relative) %>, <%= contents %>)', {}, {
|
||||
imports: {
|
||||
processPartialName: function (fileName) {
|
||||
imports : {
|
||||
processPartialName : function(fileName) {
|
||||
return JSON.stringify(
|
||||
path.basename(fileName, '.js')
|
||||
);
|
||||
@@ -42,11 +46,10 @@ gulp.task('handlebars', function () {
|
||||
}
|
||||
}));
|
||||
|
||||
|
||||
return streamqueue({ objectMode: true },
|
||||
return streamqueue({ objectMode : true },
|
||||
partialStream,
|
||||
coreStream
|
||||
).pipe(concat('templates.js'))
|
||||
|
||||
.pipe(gulp.dest(paths.dest.root));
|
||||
.pipe(gulp.dest(paths.dest.root))
|
||||
.pipe(livereload());
|
||||
});
|
||||
|
||||
@@ -2,14 +2,13 @@ var gulp = require('gulp');
|
||||
var print = require('gulp-print');
|
||||
var paths = require('./paths.js');
|
||||
|
||||
|
||||
gulp.task('imageMin', function () {
|
||||
gulp.task('imageMin', function() {
|
||||
var imagemin = require('gulp-imagemin');
|
||||
return gulp.src(paths.src.images)
|
||||
.pipe(imagemin({
|
||||
progressive: false,
|
||||
optimizationLevel :4,
|
||||
svgoPlugins: [{removeViewBox: false}]
|
||||
progressive : false,
|
||||
optimizationLevel : 4,
|
||||
svgoPlugins : [{ removeViewBox : false }]
|
||||
}))
|
||||
.pipe(print())
|
||||
.pipe(gulp.dest(paths.src.content + 'Images/'));
|
||||
|
||||
@@ -4,9 +4,11 @@ var stylish = require('jshint-stylish');
|
||||
var cache = require('gulp-cached');
|
||||
var paths = require('./paths.js');
|
||||
|
||||
|
||||
gulp.task('jshint', function () {
|
||||
return gulp.src([paths.src.scripts, paths.src.exclude.libs])
|
||||
gulp.task('jshint', function() {
|
||||
return gulp.src([
|
||||
paths.src.scripts,
|
||||
paths.src.exclude.libs
|
||||
])
|
||||
.pipe(cache('jshint'))
|
||||
.pipe(jshint())
|
||||
.pipe(jshint.reporter(stylish));
|
||||
|
||||
69
gulp/less.js
69
gulp/less.js
@@ -1,34 +1,55 @@
|
||||
var gulp = require('gulp');
|
||||
var less = require('gulp-less');
|
||||
var print = require('gulp-print');
|
||||
|
||||
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 phantom = require('./phantom');
|
||||
var paths = require('./paths');
|
||||
var errorHandler = require('./errorHandler');
|
||||
|
||||
gulp.task('less', function () {
|
||||
return gulp.src([
|
||||
paths.src.content + 'bootstrap.less',
|
||||
paths.src.content + 'theme.less',
|
||||
paths.src.content + 'overrides.less',
|
||||
paths.src.root + 'Series/series.less',
|
||||
paths.src.root + 'Activity/activity.less',
|
||||
paths.src.root + 'AddSeries/addSeries.less',
|
||||
paths.src.root + 'Calendar/calendar.less',
|
||||
paths.src.root + 'Cells/cells.less',
|
||||
paths.src.root + 'ManualImport/manualimport.less',
|
||||
paths.src.root + 'Settings/settings.less',
|
||||
paths.src.root + 'System/Logs/logs.less',
|
||||
paths.src.root + 'System/Update/update.less',
|
||||
paths.src.root + 'System/Info/info.less',
|
||||
])
|
||||
gulp.task('less', function() {
|
||||
|
||||
var src = [
|
||||
paths.src.content + 'bootstrap.less',
|
||||
paths.src.content + 'theme.less',
|
||||
paths.src.content + 'overrides.less',
|
||||
paths.src.root + 'Series/series.less',
|
||||
paths.src.root + 'Activity/activity.less',
|
||||
paths.src.root + 'AddSeries/addSeries.less',
|
||||
paths.src.root + 'Calendar/calendar.less',
|
||||
paths.src.root + 'Cells/cells.less',
|
||||
paths.src.root + 'ManualImport/manualimport.less',
|
||||
paths.src.root + 'Settings/settings.less',
|
||||
paths.src.root + 'System/Logs/logs.less',
|
||||
paths.src.root + 'System/Update/update.less',
|
||||
paths.src.root + 'System/Info/info.less'
|
||||
];
|
||||
|
||||
if (phantom) {
|
||||
src = [
|
||||
paths.src.content + 'Bootstrap/bootstrap.less',
|
||||
paths.src.content + 'Vendor/vendor.less',
|
||||
paths.src.content + 'sonarr.less'
|
||||
];
|
||||
}
|
||||
|
||||
return gulp.src(src)
|
||||
.pipe(print())
|
||||
.pipe(sourcemaps.init())
|
||||
.pipe(less({
|
||||
dumpLineNumbers: 'false',
|
||||
compress: true,
|
||||
yuicompress: true,
|
||||
ieCompat: true,
|
||||
strictImports: true
|
||||
dumpLineNumbers : 'false',
|
||||
compress : true,
|
||||
yuicompress : true,
|
||||
ieCompat : true,
|
||||
strictImports : true
|
||||
}))
|
||||
.pipe(postcss([ autoprefixer({ browsers: ['last 2 versions'] }) ]))
|
||||
.on('error', errorHandler.onError)
|
||||
.pipe(gulp.dest(paths.dest.content));
|
||||
.pipe(sourcemaps.write(paths.dest.content))
|
||||
.pipe(gulp.dest(paths.dest.content))
|
||||
.pipe(livereload());
|
||||
});
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
var phantom = require('./phantom');
|
||||
|
||||
var paths = {
|
||||
src: {
|
||||
root: './src/UI/',
|
||||
templates: './src/UI/**/*.hbs',
|
||||
html: './src/UI/*.html',
|
||||
partials: './src/UI/**/*Partial.hbs',
|
||||
scripts: './src/UI/**/*.js',
|
||||
less: ['./src/UI/**/*.less'],
|
||||
content: './src/UI/Content/',
|
||||
images: './src/UI/Content/Images/**/*',
|
||||
exclude: {
|
||||
libs: '!./src/UI/JsLibraries/**'
|
||||
src : {
|
||||
root : './src/UI/',
|
||||
templates : './src/UI/**/*.hbs',
|
||||
html : './src/UI/*.html',
|
||||
partials : './src/UI/**/*Partial.hbs',
|
||||
scripts : './src/UI/**/*.js',
|
||||
less : ['./src/UI/**/*.less'],
|
||||
content : './src/UI/Content/',
|
||||
images : './src/UI/Content/Images/**/*',
|
||||
exclude : {
|
||||
libs : '!./src/UI/JsLibraries/**'
|
||||
}
|
||||
},
|
||||
dest : {
|
||||
root : './_output/UI/',
|
||||
content : './_output/UI/Content/'
|
||||
}
|
||||
},
|
||||
dest: {
|
||||
root: './_output/UI/',
|
||||
content: './_output/UI/Content/'
|
||||
}
|
||||
};
|
||||
|
||||
if (phantom) {
|
||||
paths = {
|
||||
src: {
|
||||
root: './src/UI.Phantom/',
|
||||
templates: './src/UI.Phantom/**/*.hbs',
|
||||
html: './src/UI.Phantom/*.html',
|
||||
partials: './src/UI.Phantom/**/*Partial.hbs',
|
||||
scripts: './src/UI.Phantom/**/*.js',
|
||||
less: ['./src/UI.Phantom/**/*.less'],
|
||||
content: './src/UI.Phantom/Content/',
|
||||
images: './src/UI.Phantom/Content/Images/**/*',
|
||||
exclude: {
|
||||
libs: '!./src/UI.Phantom/JsLibraries/**'
|
||||
}
|
||||
},
|
||||
dest: {
|
||||
root: './_output/UI.Phantom/',
|
||||
content: './_output/UI.Phantom/Content/'
|
||||
}
|
||||
};
|
||||
paths = {
|
||||
src : {
|
||||
root : './UI.Phantom/',
|
||||
templates : './UI.Phantom/**/*.hbs',
|
||||
html : './UI.Phantom/*.html',
|
||||
partials : './UI.Phantom/**/*Partial.hbs',
|
||||
scripts : './UI.Phantom/**/*.js',
|
||||
less : ['./UI.Phantom/**/*.less'],
|
||||
content : './UI.Phantom/Content/',
|
||||
images : './UI.Phantom/Content/Images/**/*',
|
||||
exclude : {
|
||||
libs : '!./UI.Phantom/JsLibraries/**'
|
||||
}
|
||||
},
|
||||
dest : {
|
||||
root : './_output/UI.Phantom/',
|
||||
content : './_output/UI.Phantom/Content/'
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = paths;
|
||||
|
||||
@@ -3,10 +3,12 @@
|
||||
// gulp --phantom
|
||||
|
||||
var phantom = false;
|
||||
process.argv.forEach(function (val, index, array) {
|
||||
if(val=== '--phantom'){
|
||||
phantom = true;
|
||||
}
|
||||
process.argv.forEach(function(val, index, array) {
|
||||
if (val === '--phantom') {
|
||||
phantom = true;
|
||||
}
|
||||
});
|
||||
|
||||
console.log('Phantom:', phantom);
|
||||
|
||||
module.exports = phantom;
|
||||
@@ -84,7 +84,7 @@ gulp.task('getSonarr', function () {
|
||||
download(package.url, packagePath, function () {
|
||||
extract(packagePath, dirName, function () {
|
||||
// clean old binaries
|
||||
console.log('Cleaning old binaries')
|
||||
console.log('Cleaning old binaries');
|
||||
del.sync(['./_output/*', '!./_output/UI/']);
|
||||
console.log('copying binaries to target');
|
||||
gulp.src(dirName + '/NzbDrone/*.*')
|
||||
|
||||
@@ -7,6 +7,10 @@ var stripBom = function (dest) {
|
||||
.pipe(stripbom({ showLog: false }))
|
||||
.pipe(gulp.dest(dest));
|
||||
|
||||
gulp.src(paths.src.less)
|
||||
.pipe(stripbom({ showLog: false }))
|
||||
.pipe(gulp.dest(dest));
|
||||
|
||||
gulp.src(paths.src.templates)
|
||||
.pipe(stripbom({ showLog: false }))
|
||||
.pipe(gulp.dest(dest));
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
var gulp = require('gulp');
|
||||
//var livereload = require('gulp-livereload');
|
||||
|
||||
var livereload = require('gulp-livereload');
|
||||
|
||||
var paths = require('./paths.js');
|
||||
|
||||
@@ -10,24 +9,12 @@ require('./less.js');
|
||||
require('./copy.js');
|
||||
require('./webpack.js');
|
||||
|
||||
|
||||
gulp.task('watch', ['jshint', 'handlebars', 'less','copyHtml', 'copyContent','copyJs'], function () {
|
||||
gulp.start('webpackWatch');
|
||||
gulp.watch([paths.src.scripts, paths.src.exclude.libs], ['jshint','copyJs']);
|
||||
gulp.watch(paths.src.templates, ['handlebars']);
|
||||
gulp.watch([paths.src.less, paths.src.exclude.libs], ['less']);
|
||||
gulp.watch([paths.src.html], ['copyHtml']);
|
||||
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);
|
||||
});
|
||||
});
|
||||
gulp.task('watch', ['jshint', 'handlebars', 'less', 'copyHtml', 'copyContent', 'copyJs'], function () {
|
||||
livereload.listen();
|
||||
gulp.start('webpackWatch');
|
||||
gulp.watch([paths.src.scripts, paths.src.exclude.libs], ['jshint', 'copyJs']);
|
||||
gulp.watch(paths.src.templates, ['handlebars']);
|
||||
gulp.watch([paths.src.less, paths.src.exclude.libs], ['less']);
|
||||
gulp.watch([paths.src.html], ['copyHtml']);
|
||||
gulp.watch([paths.src.content + '**/*.*', '!**/*.less'], ['copyContent']);
|
||||
});
|
||||
@@ -1,20 +1,13 @@
|
||||
var gulp = require('gulp');
|
||||
|
||||
var gulpWebpack = require('gulp-webpack');
|
||||
var webpack = require('webpack');
|
||||
var webpackStream = require('webpack-stream');
|
||||
var livereload = require('gulp-livereload');
|
||||
var webpackConfig = require('../webpack.config');
|
||||
|
||||
webpackConfig.devtool = "#source-map";
|
||||
|
||||
gulp.task('webpack', function() {
|
||||
return gulp.src('main.js')
|
||||
.pipe(gulpWebpack(webpackConfig, webpack))
|
||||
.pipe(gulp.dest(''));
|
||||
return gulp.src('main.js').pipe(webpackStream(webpackConfig)).pipe(gulp.dest(''));
|
||||
});
|
||||
|
||||
gulp.task('webpackWatch', function() {
|
||||
webpackConfig.watch = true;
|
||||
return gulp.src('main.js')
|
||||
.pipe(gulpWebpack(webpackConfig, webpack))
|
||||
.pipe(gulp.dest(''));
|
||||
webpackConfig.watch = true;
|
||||
return gulp.src('main.js').pipe(webpackStream(webpackConfig)).pipe(gulp.dest('')).pipe(livereload());
|
||||
});
|
||||
|
||||
@@ -5,3 +5,4 @@ NUNIT="$TESTDIR/NUnit.Runners.2.6.1/tools/nunit-console-x86.exe"
|
||||
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Api.Result.xml $TESTDIR/NzbDrone.Api.Test.dll
|
||||
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Core.Result.xml $TESTDIR/NzbDrone.Core.Test.dll
|
||||
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Integration.Result.xml $TESTDIR/NzbDrone.Integration.Test.dll
|
||||
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Common.Result.xml $TESTDIR/NzbDrone.Common.Test.dll
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"gitHead": "9ff7aa1bf7fe38c4c5bdb92f56c8ad556916ed67",
|
||||
"readmeFilename": "readme.md",
|
||||
"dependencies": {
|
||||
"autoprefixer-core": "5.2.1",
|
||||
"del": "1.2.0",
|
||||
"gulp": "3.9.0",
|
||||
"gulp-cached": "1.1.0",
|
||||
@@ -23,9 +24,12 @@
|
||||
"gulp-handlebars": "3.0.1",
|
||||
"gulp-jshint": "1.11.2",
|
||||
"gulp-less": "3.0.3",
|
||||
"gulp-livereload": "3.8.0",
|
||||
"gulp-postcss": "6.0.0",
|
||||
"gulp-print": "1.1.0",
|
||||
"gulp-replace": "0.5.3",
|
||||
"gulp-run": "1.6.8",
|
||||
"gulp-sourcemaps": "1.5.2",
|
||||
"gulp-stripbom": "1.0.4",
|
||||
"gulp-webpack": "1.5.0",
|
||||
"gulp-wrap": "0.11.0",
|
||||
@@ -34,7 +38,8 @@
|
||||
"jshint-stylish": "2.0.1",
|
||||
"run-sequence": "1.1.1",
|
||||
"streamqueue": "1.1.0",
|
||||
"tar.gz": "^0.1.1",
|
||||
"webpack": "1.10.1"
|
||||
"tar.gz": "0.1.1",
|
||||
"webpack": "1.12.0",
|
||||
"webpack-stream": "2.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS fee
|
||||
|
||||
## 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
|
||||
* 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*
|
||||
@@ -21,7 +21,7 @@ Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS fee
|
||||
## Configuring Development Environment: ##
|
||||
|
||||
### Requirements ###
|
||||
- Visual Studio 2013 [Free Community Edition](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx)
|
||||
- Visual Studio 2015 [Free Community Edition](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx)
|
||||
- [Git](http://git-scm.com/downloads)
|
||||
- [NodeJS](http://nodejs.org/download/)
|
||||
- [Gulp](http://gulpjs.com)
|
||||
@@ -35,7 +35,7 @@ Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS fee
|
||||
- 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 NzbDrone client source files.*
|
||||
*Please note gulp must be running at all times while you are working with Sonarr client source files.*
|
||||
|
||||
|
||||
### Development ###
|
||||
|
||||
@@ -3,6 +3,7 @@ using Nancy;
|
||||
using Nancy.Authentication.Forms;
|
||||
using Nancy.Extensions;
|
||||
using Nancy.ModelBinding;
|
||||
using NzbDrone.Common.EnsureThat;
|
||||
using NzbDrone.Core.Authentication;
|
||||
using NzbDrone.Core.Configuration;
|
||||
|
||||
@@ -23,6 +24,11 @@ namespace NzbDrone.Api.Authentication
|
||||
|
||||
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);
|
||||
|
||||
if (user == null)
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace NzbDrone.Api.Authentication
|
||||
private readonly IUserService _userService;
|
||||
private static readonly NzbDroneUser AnonymousUser = new NzbDroneUser { UserName = "Anonymous" };
|
||||
|
||||
private static String API_KEY;
|
||||
private static string API_KEY;
|
||||
private static AuthenticationType AUTH_METHOD;
|
||||
|
||||
public AuthenticationService(IConfigFileProvider configFileProvider, IUserService userService)
|
||||
|
||||
@@ -39,8 +39,8 @@ namespace NzbDrone.Api.Authentication
|
||||
pipelines.EnableBasicAuthentication(new BasicAuthenticationConfiguration(_authenticationService, "Sonarr"));
|
||||
}
|
||||
|
||||
pipelines.BeforeRequest.AddItemToEndOfPipeline(RequiresAuthentication);
|
||||
pipelines.AfterRequest.AddItemToEndOfPipeline(RemoveLoginHooksForApiCalls);
|
||||
pipelines.BeforeRequest.AddItemToEndOfPipeline((Func<NancyContext, Response>) RequiresAuthentication);
|
||||
pipelines.AfterRequest.AddItemToEndOfPipeline((Action<NancyContext>) RemoveLoginHooksForApiCalls);
|
||||
}
|
||||
|
||||
private Response RequiresAuthentication(NancyContext context)
|
||||
|
||||
@@ -22,15 +22,32 @@ namespace NzbDrone.Api.Calendar
|
||||
|
||||
private Response GetCalendarFeed()
|
||||
{
|
||||
var start = DateTime.Today.AddDays(-7);
|
||||
var end = DateTime.Today.AddDays(28);
|
||||
var pastDays = 7;
|
||||
var futureDays = 28;
|
||||
var start = DateTime.Today.AddDays(-pastDays);
|
||||
var end = DateTime.Today.AddDays(futureDays);
|
||||
|
||||
// TODO: Remove start/end parameters in v3, they don't work well for iCal
|
||||
var queryStart = Request.Query.Start;
|
||||
var queryEnd = Request.Query.End;
|
||||
var queryPastDays = Request.Query.PastDays;
|
||||
var queryFutureDays = Request.Query.FutureDays;
|
||||
|
||||
if (queryStart.HasValue) start = DateTime.Parse(queryStart.Value);
|
||||
if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value);
|
||||
|
||||
if (queryPastDays.HasValue)
|
||||
{
|
||||
pastDays = int.Parse(queryPastDays.Value);
|
||||
start = DateTime.Today.AddDays(-pastDays);
|
||||
}
|
||||
|
||||
if (queryFutureDays.HasValue)
|
||||
{
|
||||
futureDays = int.Parse(queryFutureDays.Value);
|
||||
end = DateTime.Today.AddDays(futureDays);
|
||||
}
|
||||
|
||||
var episodes = _episodeService.EpisodesBetweenDates(start, end, false);
|
||||
var icalCalendar = new iCalendar();
|
||||
|
||||
|
||||
@@ -5,14 +5,14 @@ namespace NzbDrone.Api.ClientSchema
|
||||
{
|
||||
public class Field
|
||||
{
|
||||
public Int32 Order { get; set; }
|
||||
public String Name { get; set; }
|
||||
public String Label { get; set; }
|
||||
public String HelpText { get; set; }
|
||||
public String HelpLink { get; set; }
|
||||
public Object Value { get; set; }
|
||||
public String Type { get; set; }
|
||||
public Boolean Advanced { get; set; }
|
||||
public int Order { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Label { get; set; }
|
||||
public string HelpText { get; set; }
|
||||
public string HelpLink { get; set; }
|
||||
public object Value { get; set; }
|
||||
public string Type { get; set; }
|
||||
public bool Advanced { get; set; }
|
||||
public List<SelectOption> SelectOptions { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -77,19 +77,19 @@ namespace NzbDrone.Api.ClientSchema
|
||||
{
|
||||
var field = fields.Find(f => f.Name == propertyInfo.Name);
|
||||
|
||||
if (propertyInfo.PropertyType == typeof(Int32))
|
||||
if (propertyInfo.PropertyType == typeof(int))
|
||||
{
|
||||
var value = Convert.ToInt32(field.Value);
|
||||
propertyInfo.SetValue(target, value, null);
|
||||
}
|
||||
|
||||
else if (propertyInfo.PropertyType == typeof(Int64))
|
||||
else if (propertyInfo.PropertyType == typeof(long))
|
||||
{
|
||||
var value = Convert.ToInt64(field.Value);
|
||||
propertyInfo.SetValue(target, value, null);
|
||||
}
|
||||
|
||||
else if (propertyInfo.PropertyType == typeof(Nullable<Int32>))
|
||||
else if (propertyInfo.PropertyType == typeof(int?))
|
||||
{
|
||||
var value = field.Value.ToString().ParseInt32();
|
||||
propertyInfo.SetValue(target, value, null);
|
||||
@@ -101,13 +101,13 @@ namespace NzbDrone.Api.ClientSchema
|
||||
propertyInfo.SetValue(target, value, null);
|
||||
}
|
||||
|
||||
else if (propertyInfo.PropertyType == typeof(IEnumerable<Int32>))
|
||||
else if (propertyInfo.PropertyType == typeof(IEnumerable<int>))
|
||||
{
|
||||
IEnumerable<Int32> value;
|
||||
IEnumerable<int> value;
|
||||
|
||||
if (field.Value.GetType() == typeof(JArray))
|
||||
{
|
||||
value = ((JArray)field.Value).Select(s => s.Value<Int32>());
|
||||
value = ((JArray)field.Value).Select(s => s.Value<int>());
|
||||
}
|
||||
|
||||
else
|
||||
|
||||
@@ -7,8 +7,8 @@ namespace NzbDrone.Api.Commands
|
||||
{
|
||||
public class CommandResource : RestResource
|
||||
{
|
||||
public String Name { get; set; }
|
||||
public String Message { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Message { get; set; }
|
||||
public Command Body { get; set; }
|
||||
public CommandPriority Priority { get; set; }
|
||||
public CommandStatus Status { get; set; }
|
||||
@@ -33,7 +33,7 @@ namespace NzbDrone.Api.Commands
|
||||
set { }
|
||||
}
|
||||
|
||||
public Boolean Manual
|
||||
public bool Manual
|
||||
{
|
||||
get
|
||||
{
|
||||
@@ -66,7 +66,7 @@ namespace NzbDrone.Api.Commands
|
||||
set { }
|
||||
}
|
||||
|
||||
public Boolean SendUpdatesToClient
|
||||
public bool SendUpdatesToClient
|
||||
{
|
||||
get
|
||||
{
|
||||
@@ -78,6 +78,18 @@ namespace NzbDrone.Api.Commands
|
||||
set { }
|
||||
}
|
||||
|
||||
public bool UpdateScheduledTask
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Body != null) return Body.UpdateScheduledTask;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
set { }
|
||||
}
|
||||
|
||||
public DateTime? LastExecutionTime { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace NzbDrone.Api.Config
|
||||
.SetValidator(rootFolderValidator)
|
||||
.SetValidator(mappedNetworkDriveValidator)
|
||||
.SetValidator(pathExistsValidator)
|
||||
.When(c => !String.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder));
|
||||
.When(c => !string.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,14 +5,14 @@ namespace NzbDrone.Api.Config
|
||||
{
|
||||
public class DownloadClientConfigResource : RestResource
|
||||
{
|
||||
public String DownloadedEpisodesFolder { get; set; }
|
||||
public String DownloadClientWorkingFolders { get; set; }
|
||||
public Int32 DownloadedEpisodesScanInterval { get; set; }
|
||||
public string DownloadedEpisodesFolder { get; set; }
|
||||
public string DownloadClientWorkingFolders { get; set; }
|
||||
public int DownloadedEpisodesScanInterval { get; set; }
|
||||
|
||||
public Boolean EnableCompletedDownloadHandling { get; set; }
|
||||
public Boolean RemoveCompletedDownloads { get; set; }
|
||||
public bool EnableCompletedDownloadHandling { get; set; }
|
||||
public bool RemoveCompletedDownloads { get; set; }
|
||||
|
||||
public Boolean AutoRedownloadFailed { get; set; }
|
||||
public Boolean RemoveFailedDownloads { get; set; }
|
||||
public bool AutoRedownloadFailed { get; set; }
|
||||
public bool RemoveFailedDownloads { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,23 +7,23 @@ namespace NzbDrone.Api.Config
|
||||
{
|
||||
public class HostConfigResource : RestResource
|
||||
{
|
||||
public String BindAddress { get; set; }
|
||||
public Int32 Port { get; set; }
|
||||
public Int32 SslPort { get; set; }
|
||||
public Boolean EnableSsl { get; set; }
|
||||
public Boolean LaunchBrowser { get; set; }
|
||||
public string BindAddress { get; set; }
|
||||
public int Port { get; set; }
|
||||
public int SslPort { get; set; }
|
||||
public bool EnableSsl { get; set; }
|
||||
public bool LaunchBrowser { get; set; }
|
||||
public AuthenticationType AuthenticationMethod { get; set; }
|
||||
public Boolean AnalyticsEnabled { get; set; }
|
||||
public String Username { get; set; }
|
||||
public String Password { get; set; }
|
||||
public String LogLevel { get; set; }
|
||||
public String Branch { get; set; }
|
||||
public String ApiKey { get; set; }
|
||||
public Boolean Torrent { get; set; }
|
||||
public String SslCertHash { get; set; }
|
||||
public String UrlBase { get; set; }
|
||||
public Boolean UpdateAutomatically { get; set; }
|
||||
public bool AnalyticsEnabled { get; set; }
|
||||
public string Username { get; set; }
|
||||
public string Password { get; set; }
|
||||
public string LogLevel { get; set; }
|
||||
public string Branch { get; set; }
|
||||
public string ApiKey { get; set; }
|
||||
public bool Torrent { get; set; }
|
||||
public string SslCertHash { get; set; }
|
||||
public string UrlBase { get; set; }
|
||||
public bool UpdateAutomatically { get; set; }
|
||||
public UpdateMechanism UpdateMechanism { get; set; }
|
||||
public String UpdateScriptPath { get; set; }
|
||||
public string UpdateScriptPath { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using FluentValidation;
|
||||
using NzbDrone.Api.Validation;
|
||||
using NzbDrone.Core.Configuration;
|
||||
|
||||
namespace NzbDrone.Api.Config
|
||||
@@ -16,8 +17,7 @@ namespace NzbDrone.Api.Config
|
||||
.GreaterThanOrEqualTo(0);
|
||||
|
||||
SharedValidator.RuleFor(c => c.RssSyncInterval)
|
||||
.InclusiveBetween(10, 120)
|
||||
.When(c => c.RssSyncInterval > 0);
|
||||
.IsValidRssSyncInterval();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,8 @@ namespace NzbDrone.Api.Config
|
||||
{
|
||||
public class IndexerConfigResource : RestResource
|
||||
{
|
||||
public Int32 MinimumAge { get; set; }
|
||||
public Int32 Retention { get; set; }
|
||||
public Int32 RssSyncInterval { get; set; }
|
||||
public int MinimumAge { get; set; }
|
||||
public int Retention { get; set; }
|
||||
public int RssSyncInterval { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace NzbDrone.Api.Config
|
||||
{
|
||||
SharedValidator.RuleFor(c => c.FileChmod).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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,20 +6,20 @@ namespace NzbDrone.Api.Config
|
||||
{
|
||||
public class MediaManagementConfigResource : RestResource
|
||||
{
|
||||
public Boolean AutoUnmonitorPreviouslyDownloadedEpisodes { get; set; }
|
||||
public String RecycleBin { get; set; }
|
||||
public Boolean AutoDownloadPropers { get; set; }
|
||||
public Boolean CreateEmptySeriesFolders { get; set; }
|
||||
public bool AutoUnmonitorPreviouslyDownloadedEpisodes { get; set; }
|
||||
public string RecycleBin { get; set; }
|
||||
public bool AutoDownloadPropers { get; set; }
|
||||
public bool CreateEmptySeriesFolders { get; set; }
|
||||
public FileDateType FileDate { get; set; }
|
||||
|
||||
public Boolean SetPermissionsLinux { get; set; }
|
||||
public String FileChmod { get; set; }
|
||||
public String FolderChmod { get; set; }
|
||||
public String ChownUser { get; set; }
|
||||
public String ChownGroup { get; set; }
|
||||
public bool SetPermissionsLinux { get; set; }
|
||||
public string FileChmod { get; set; }
|
||||
public string FolderChmod { get; set; }
|
||||
public string ChownUser { get; set; }
|
||||
public string ChownGroup { get; set; }
|
||||
|
||||
public Boolean SkipFreeSpaceCheckWhenImporting { get; set; }
|
||||
public Boolean CopyUsingHardlinks { get; set; }
|
||||
public Boolean EnableMediaInfo { get; set; }
|
||||
public bool SkipFreeSpaceCheckWhenImporting { get; set; }
|
||||
public bool CopyUsingHardlinks { get; set; }
|
||||
public bool EnableMediaInfo { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace NzbDrone.Api.Config
|
||||
var nameSpec = _namingConfigService.GetConfig();
|
||||
var resource = nameSpec.InjectTo<NamingConfigResource>();
|
||||
|
||||
if (String.IsNullOrWhiteSpace(resource.StandardEpisodeFormat))
|
||||
if (string.IsNullOrWhiteSpace(resource.StandardEpisodeFormat))
|
||||
{
|
||||
return resource;
|
||||
}
|
||||
|
||||
@@ -5,8 +5,9 @@ namespace NzbDrone.Api.Config
|
||||
{
|
||||
public class NamingConfigResource : RestResource
|
||||
{
|
||||
public Boolean RenameEpisodes { get; set; }
|
||||
public Int32 MultiEpisodeStyle { get; set; }
|
||||
public bool RenameEpisodes { get; set; }
|
||||
public bool ReplaceIllegalCharacters { get; set; }
|
||||
public int MultiEpisodeStyle { get; set; }
|
||||
public string StandardEpisodeFormat { get; set; }
|
||||
public string DailyEpisodeFormat { get; set; }
|
||||
public string AnimeEpisodeFormat { get; set; }
|
||||
|
||||
@@ -6,15 +6,15 @@ namespace NzbDrone.Api.Config
|
||||
public class UiConfigResource : RestResource
|
||||
{
|
||||
//Calendar
|
||||
public Int32 FirstDayOfWeek { get; set; }
|
||||
public String CalendarWeekColumnHeader { get; set; }
|
||||
public int FirstDayOfWeek { get; set; }
|
||||
public string CalendarWeekColumnHeader { get; set; }
|
||||
|
||||
//Dates
|
||||
public String ShortDateFormat { get; set; }
|
||||
public String LongDateFormat { get; set; }
|
||||
public String TimeFormat { get; set; }
|
||||
public Boolean ShowRelativeDates { get; set; }
|
||||
public string ShortDateFormat { get; set; }
|
||||
public string LongDateFormat { get; set; }
|
||||
public string TimeFormat { get; set; }
|
||||
public bool ShowRelativeDates { get; set; }
|
||||
|
||||
public Boolean EnableColorImpairedMode { get; set; }
|
||||
public bool EnableColorImpairedMode { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace NzbDrone.Api.DiskSpace
|
||||
{
|
||||
public string Path { get; set; }
|
||||
public string Label { get; set; }
|
||||
public Int64 FreeSpace { get; set; }
|
||||
public Int64 TotalSpace { get; set; }
|
||||
public long FreeSpace { get; set; }
|
||||
public long TotalSpace { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace NzbDrone.Api.DownloadClient
|
||||
{
|
||||
public class DownloadClientResource : ProviderResource
|
||||
{
|
||||
public Boolean Enable { get; set; }
|
||||
public bool Enable { get; set; }
|
||||
public DownloadProtocol Protocol { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -6,15 +6,15 @@ namespace NzbDrone.Api.EpisodeFiles
|
||||
{
|
||||
public class EpisodeFileResource : RestResource
|
||||
{
|
||||
public Int32 SeriesId { get; set; }
|
||||
public Int32 SeasonNumber { get; set; }
|
||||
public String RelativePath { get; set; }
|
||||
public String Path { get; set; }
|
||||
public Int64 Size { get; set; }
|
||||
public int SeriesId { get; set; }
|
||||
public int SeasonNumber { get; set; }
|
||||
public string RelativePath { get; set; }
|
||||
public string Path { get; set; }
|
||||
public long Size { get; set; }
|
||||
public DateTime DateAdded { get; set; }
|
||||
public String SceneName { get; set; }
|
||||
public string SceneName { get; set; }
|
||||
public QualityModel Quality { get; set; }
|
||||
|
||||
public Boolean QualityCutoffNotMet { get; set; }
|
||||
public bool QualityCutoffNotMet { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,5 +36,10 @@ namespace NzbDrone.Api.Episodes
|
||||
{
|
||||
_episodeService.SetEpisodeMonitored(episodeResource.Id, episodeResource.Monitored);
|
||||
}
|
||||
|
||||
protected override List<EpisodeResource> LoadSeries(List<EpisodeResource> resources)
|
||||
{
|
||||
return resources;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace NzbDrone.Api.Episodes
|
||||
ISeriesService seriesService,
|
||||
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
||||
IBroadcastSignalRMessage signalRBroadcaster,
|
||||
String resource)
|
||||
string resource)
|
||||
: base(signalRBroadcaster, resource)
|
||||
{
|
||||
_episodeService = episodeService;
|
||||
@@ -79,7 +79,8 @@ namespace NzbDrone.Api.Episodes
|
||||
{
|
||||
var resources = base.ToListResource(modelList);
|
||||
|
||||
return resources.LoadSubtype<EpisodeResource, SeriesResource, Core.Tv.Series>(e => e.SeriesId, _seriesService.GetSeries).ToList();
|
||||
return LoadSeries(resources);
|
||||
|
||||
}
|
||||
|
||||
public void Handle(EpisodeGrabbedEvent message)
|
||||
@@ -100,5 +101,10 @@ namespace NzbDrone.Api.Episodes
|
||||
BroadcastResourceChange(ModelAction.Updated, episode.Id);
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual List<EpisodeResource> LoadSeries(List<EpisodeResource> resources)
|
||||
{
|
||||
return resources.LoadSubtype<EpisodeResource, SeriesResource, Core.Tv.Series>(e => e.SeriesId, _seriesService.GetSeries).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,29 +8,30 @@ namespace NzbDrone.Api.Episodes
|
||||
{
|
||||
public class EpisodeResource : RestResource
|
||||
{
|
||||
public Int32 SeriesId { get; set; }
|
||||
public Int32 EpisodeFileId { get; set; }
|
||||
public Int32 SeasonNumber { get; set; }
|
||||
public Int32 EpisodeNumber { get; set; }
|
||||
public String Title { get; set; }
|
||||
public String AirDate { get; set; }
|
||||
public int SeriesId { get; set; }
|
||||
public int EpisodeFileId { get; set; }
|
||||
public int SeasonNumber { get; set; }
|
||||
public int EpisodeNumber { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string AirDate { get; set; }
|
||||
public DateTime? AirDateUtc { get; set; }
|
||||
public String Overview { get; set; }
|
||||
public string Overview { get; set; }
|
||||
public EpisodeFileResource EpisodeFile { get; set; }
|
||||
|
||||
public Boolean HasFile { get; set; }
|
||||
public Boolean Monitored { get; set; }
|
||||
public Nullable<Int32> AbsoluteEpisodeNumber { get; set; }
|
||||
public Nullable<Int32> SceneAbsoluteEpisodeNumber { get; set; }
|
||||
public Nullable<Int32> SceneEpisodeNumber { get; set; }
|
||||
public Nullable<Int32> SceneSeasonNumber { get; set; }
|
||||
public bool HasFile { get; set; }
|
||||
public bool Monitored { get; set; }
|
||||
public int? AbsoluteEpisodeNumber { get; set; }
|
||||
public int? SceneAbsoluteEpisodeNumber { get; set; }
|
||||
public int? SceneEpisodeNumber { get; set; }
|
||||
public int? SceneSeasonNumber { get; set; }
|
||||
public bool UnverifiedSceneNumbering { get; set; }
|
||||
public DateTime? EndTime { get; set; }
|
||||
public DateTime? GrabDate { get; set; }
|
||||
public String SeriesTitle { get; set; }
|
||||
public string SeriesTitle { get; set; }
|
||||
public SeriesResource Series { get; set; }
|
||||
|
||||
//Hiding this so people don't think its usable (only used to set the initial state)
|
||||
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
|
||||
public Boolean Grabbed { get; set; }
|
||||
public bool Grabbed { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,11 +6,11 @@ namespace NzbDrone.Api.Episodes
|
||||
{
|
||||
public class RenameEpisodeResource : RestResource
|
||||
{
|
||||
public Int32 SeriesId { get; set; }
|
||||
public Int32 SeasonNumber { get; set; }
|
||||
public List<Int32> EpisodeNumbers { get; set; }
|
||||
public Int32 EpisodeFileId { get; set; }
|
||||
public String ExistingPath { get; set; }
|
||||
public String NewPath { get; set; }
|
||||
public int SeriesId { get; set; }
|
||||
public int SeasonNumber { get; set; }
|
||||
public List<int> EpisodeNumbers { get; set; }
|
||||
public int EpisodeFileId { get; set; }
|
||||
public string ExistingPath { get; set; }
|
||||
public string NewPath { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ namespace NzbDrone.Api.ErrorManagement
|
||||
}.AsResponse(HttpStatusCode.Conflict);
|
||||
}
|
||||
|
||||
var sqlErrorMessage = String.Format("[{0} {1}]", context.Request.Method, context.Request.Path);
|
||||
var sqlErrorMessage = string.Format("[{0} {1}]", context.Request.Method, context.Request.Path);
|
||||
|
||||
_logger.ErrorException(sqlErrorMessage, sqLiteException);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace NzbDrone.Api.Extensions
|
||||
{
|
||||
private static readonly ICached<MethodInfo> SetterCache = new Cached<MethodInfo>();
|
||||
|
||||
public static IEnumerable<TParent> LoadSubtype<TParent, TChild, TSourceChild>(this IEnumerable<TParent> parents, Func<TParent, Int32> foreignKeySelector, Func<IEnumerable<Int32>, IEnumerable<TSourceChild>> sourceChildSelector)
|
||||
public static IEnumerable<TParent> LoadSubtype<TParent, TChild, TSourceChild>(this IEnumerable<TParent> parents, Func<TParent, int> foreignKeySelector, Func<IEnumerable<int>, IEnumerable<TSourceChild>> sourceChildSelector)
|
||||
where TSourceChild : ModelBase, new()
|
||||
where TChild : RestResource, new()
|
||||
where TParent : RestResource
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Nancy;
|
||||
using System;
|
||||
using Nancy;
|
||||
using Nancy.Bootstrapper;
|
||||
using NzbDrone.Api.Frontend;
|
||||
|
||||
@@ -15,7 +16,7 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
||||
|
||||
public void Register(IPipelines pipelines)
|
||||
{
|
||||
pipelines.AfterRequest.AddItemToStartOfPipeline(Handle);
|
||||
pipelines.AfterRequest.AddItemToStartOfPipeline((Action<NancyContext>) Handle);
|
||||
}
|
||||
|
||||
private void Handle(NancyContext context)
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
||||
{
|
||||
public void Register(IPipelines pipelines)
|
||||
{
|
||||
pipelines.AfterRequest.AddItemToEndOfPipeline(Handle);
|
||||
pipelines.AfterRequest.AddItemToEndOfPipeline((Action<NancyContext>) Handle);
|
||||
}
|
||||
|
||||
private void Handle(NancyContext context)
|
||||
@@ -31,7 +31,7 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
||||
allowedMethods = response.Headers["Allow"];
|
||||
}
|
||||
|
||||
var requestedHeaders = String.Join(", ", request.Headers[AccessControlHeaders.RequestHeaders]);
|
||||
var requestedHeaders = string.Join(", ", request.Headers[AccessControlHeaders.RequestHeaders]);
|
||||
|
||||
response.Headers.Add(AccessControlHeaders.AllowOrigin, "*");
|
||||
response.Headers.Add(AccessControlHeaders.AllowMethods, allowedMethods);
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using Nancy;
|
||||
using Nancy.Bootstrapper;
|
||||
using NzbDrone.Api.Frontend;
|
||||
@@ -15,7 +16,7 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
||||
|
||||
public void Register(IPipelines pipelines)
|
||||
{
|
||||
pipelines.BeforeRequest.AddItemToStartOfPipeline(Handle);
|
||||
pipelines.BeforeRequest.AddItemToStartOfPipeline((Func<NancyContext, Response>) Handle);
|
||||
}
|
||||
|
||||
private Response Handle(NancyContext context)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Nancy;
|
||||
using System;
|
||||
using Nancy;
|
||||
using Nancy.Bootstrapper;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
|
||||
@@ -8,7 +9,7 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
||||
{
|
||||
public void Register(IPipelines pipelines)
|
||||
{
|
||||
pipelines.AfterRequest.AddItemToStartOfPipeline(Handle);
|
||||
pipelines.AfterRequest.AddItemToStartOfPipeline((Action<NancyContext>) Handle);
|
||||
}
|
||||
|
||||
private void Handle(NancyContext context)
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace NzbDrone.Api.Frontend
|
||||
{
|
||||
public bool IsCacheable(NancyContext context)
|
||||
{
|
||||
if (BuildInfo.IsDebug)
|
||||
if (!RuntimeInfoBase.IsProduction)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3,17 +3,20 @@ using System.IO;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Core.Configuration;
|
||||
|
||||
namespace NzbDrone.Api.Frontend.Mappers
|
||||
{
|
||||
public class FaviconMapper : StaticResourceMapperBase
|
||||
{
|
||||
private readonly IAppFolderInfo _appFolderInfo;
|
||||
private readonly IConfigFileProvider _configFileProvider;
|
||||
|
||||
public FaviconMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, Logger logger)
|
||||
public FaviconMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider,IConfigFileProvider configFileProvider, Logger logger)
|
||||
: base(diskProvider, logger)
|
||||
{
|
||||
_appFolderInfo = appFolderInfo;
|
||||
_configFileProvider = configFileProvider;
|
||||
}
|
||||
|
||||
public override string Map(string resourceUrl)
|
||||
@@ -27,7 +30,7 @@ namespace NzbDrone.Api.Frontend.Mappers
|
||||
|
||||
var path = Path.Combine("Content", "Images", fileName);
|
||||
|
||||
return Path.Combine(_appFolderInfo.StartUpFolder, "UI", path);
|
||||
return Path.Combine(_appFolderInfo.StartUpFolder, _configFileProvider.UiFolder, path);
|
||||
}
|
||||
|
||||
public override bool CanHandle(string resourceUrl)
|
||||
|
||||
@@ -17,10 +17,10 @@ namespace NzbDrone.Api.Frontend.Mappers
|
||||
private readonly IAnalyticsService _analyticsService;
|
||||
private readonly Func<ICacheBreakerProvider> _cacheBreakProviderFactory;
|
||||
private readonly string _indexPath;
|
||||
private static readonly Regex ReplaceRegex = new Regex("(?<=(?:href|src)=\").*?(css|js|png|ico|ics)(?=\")", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private static readonly Regex ReplaceRegex = new Regex(@"(?:(?<attribute>href|src)=\"")(?<path>.*?(?<extension>css|js|png|ico|ics))(?:\"")(?:\s(?<nohash>data-no-hash))?", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private static String API_KEY;
|
||||
private static String URL_BASE;
|
||||
private static string API_KEY;
|
||||
private static string URL_BASE;
|
||||
private string _generatedContent
|
||||
;
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace NzbDrone.Api.Frontend.Mappers
|
||||
_configFileProvider = configFileProvider;
|
||||
_analyticsService = analyticsService;
|
||||
_cacheBreakProviderFactory = cacheBreakProviderFactory;
|
||||
_indexPath = Path.Combine(appFolderInfo.StartUpFolder, "UI", "index.html");
|
||||
_indexPath = Path.Combine(appFolderInfo.StartUpFolder, _configFileProvider.UiFolder, "index.html");
|
||||
|
||||
API_KEY = configFileProvider.ApiKey;
|
||||
URL_BASE = configFileProvider.UrlBase;
|
||||
@@ -85,8 +85,19 @@ namespace NzbDrone.Api.Frontend.Mappers
|
||||
|
||||
text = ReplaceRegex.Replace(text, match =>
|
||||
{
|
||||
var url = cacheBreakProvider.AddCacheBreakerToPath(match.Value);
|
||||
return URL_BASE + url;
|
||||
string url;
|
||||
|
||||
if (match.Groups["nohash"].Success)
|
||||
{
|
||||
url = match.Groups["path"].Value;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
url = cacheBreakProvider.AddCacheBreakerToPath(match.Groups["path"].Value);
|
||||
}
|
||||
|
||||
return string.Format("{0}=\"{1}{2}\"", match.Groups["attribute"].Value, URL_BASE, url);
|
||||
});
|
||||
|
||||
text = text.Replace("API_ROOT", URL_BASE + "/api");
|
||||
|
||||
@@ -12,11 +12,12 @@ namespace NzbDrone.Api.Frontend.Mappers
|
||||
public class LoginHtmlMapper : StaticResourceMapperBase
|
||||
{
|
||||
private readonly IDiskProvider _diskProvider;
|
||||
private readonly IConfigFileProvider _configFileProvider;
|
||||
private readonly Func<ICacheBreakerProvider> _cacheBreakProviderFactory;
|
||||
private readonly string _indexPath;
|
||||
private static readonly Regex ReplaceRegex = new Regex("(?<=(?:href|src|data-main)=\").*?(?=\")", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private static String URL_BASE;
|
||||
private static string URL_BASE;
|
||||
private string _generatedContent;
|
||||
|
||||
public LoginHtmlMapper(IAppFolderInfo appFolderInfo,
|
||||
@@ -27,8 +28,9 @@ namespace NzbDrone.Api.Frontend.Mappers
|
||||
: base(diskProvider, logger)
|
||||
{
|
||||
_diskProvider = diskProvider;
|
||||
_configFileProvider = configFileProvider;
|
||||
_cacheBreakProviderFactory = cacheBreakProviderFactory;
|
||||
_indexPath = Path.Combine(appFolderInfo.StartUpFolder, "UI", "login.html");
|
||||
_indexPath = Path.Combine(appFolderInfo.StartUpFolder, _configFileProvider.UiFolder, "login.html");
|
||||
|
||||
URL_BASE = configFileProvider.UrlBase;
|
||||
}
|
||||
|
||||
@@ -3,24 +3,27 @@ using System.IO;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Core.Configuration;
|
||||
|
||||
namespace NzbDrone.Api.Frontend.Mappers
|
||||
{
|
||||
public class RobotsTxtMapper : StaticResourceMapperBase
|
||||
{
|
||||
private readonly IAppFolderInfo _appFolderInfo;
|
||||
private readonly IConfigFileProvider _configFileProvider;
|
||||
|
||||
public RobotsTxtMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, Logger logger)
|
||||
public RobotsTxtMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, IConfigFileProvider configFileProvider, Logger logger)
|
||||
: base(diskProvider, logger)
|
||||
{
|
||||
_appFolderInfo = appFolderInfo;
|
||||
_configFileProvider = configFileProvider;
|
||||
}
|
||||
|
||||
public override string Map(string resourceUrl)
|
||||
{
|
||||
var path = Path.Combine("Content", "robots.txt");
|
||||
|
||||
return Path.Combine(_appFolderInfo.StartUpFolder, "UI", path);
|
||||
return Path.Combine(_appFolderInfo.StartUpFolder, _configFileProvider.UiFolder, path);
|
||||
}
|
||||
|
||||
public override bool CanHandle(string resourceUrl)
|
||||
|
||||
@@ -2,17 +2,20 @@ using System.IO;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Core.Configuration;
|
||||
|
||||
namespace NzbDrone.Api.Frontend.Mappers
|
||||
{
|
||||
public class StaticResourceMapper : StaticResourceMapperBase
|
||||
{
|
||||
private readonly IAppFolderInfo _appFolderInfo;
|
||||
private readonly IConfigFileProvider _configFileProvider;
|
||||
|
||||
public StaticResourceMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, Logger logger)
|
||||
public StaticResourceMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, IConfigFileProvider configFileProvider, Logger logger)
|
||||
: base(diskProvider, logger)
|
||||
{
|
||||
_appFolderInfo = appFolderInfo;
|
||||
_configFileProvider = configFileProvider;
|
||||
}
|
||||
|
||||
public override string Map(string resourceUrl)
|
||||
@@ -20,7 +23,7 @@ namespace NzbDrone.Api.Frontend.Mappers
|
||||
var path = resourceUrl.Replace('/', Path.DirectorySeparatorChar);
|
||||
path = path.Trim(Path.DirectorySeparatorChar);
|
||||
|
||||
return Path.Combine(_appFolderInfo.StartUpFolder, "UI", path);
|
||||
return Path.Combine(_appFolderInfo.StartUpFolder, _configFileProvider.UiFolder, path);
|
||||
}
|
||||
|
||||
public override bool CanHandle(string resourceUrl)
|
||||
@@ -30,7 +33,8 @@ namespace NzbDrone.Api.Frontend.Mappers
|
||||
resourceUrl.EndsWith(".map") ||
|
||||
resourceUrl.EndsWith(".css") ||
|
||||
(resourceUrl.EndsWith(".ico") && !resourceUrl.Equals("/favicon.ico")) ||
|
||||
resourceUrl.EndsWith(".swf");
|
||||
resourceUrl.EndsWith(".swf") ||
|
||||
resourceUrl.EndsWith("oauth.html");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,7 +43,7 @@ namespace NzbDrone.Api.Frontend
|
||||
{
|
||||
var urlBase = _configFileProvider.UrlBase;
|
||||
|
||||
if (!String.IsNullOrEmpty(urlBase))
|
||||
if (!string.IsNullOrEmpty(urlBase))
|
||||
{
|
||||
if (Request.Url.BasePath != urlBase)
|
||||
{
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace NzbDrone.Api.Health
|
||||
public class HealthResource : RestResource
|
||||
{
|
||||
public HealthCheckResult Type { get; set; }
|
||||
public String Message { get; set; }
|
||||
public string Message { get; set; }
|
||||
public Uri WikiUrl { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ namespace NzbDrone.Api.History
|
||||
{
|
||||
var id = (int)Request.Form.Id;
|
||||
_failedDownloadService.MarkAsFailed(id);
|
||||
return new Object().AsResponse();
|
||||
return new object().AsResponse();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ namespace NzbDrone.Api.History
|
||||
public int SeriesId { get; set; }
|
||||
public string SourceTitle { get; set; }
|
||||
public QualityModel Quality { get; set; }
|
||||
public Boolean QualityCutoffNotMet { get; set; }
|
||||
public bool QualityCutoffNotMet { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
public string Indexer { get; set; }
|
||||
public string ReleaseGroup { get; set; }
|
||||
|
||||
@@ -5,10 +5,10 @@ namespace NzbDrone.Api.Indexers
|
||||
{
|
||||
public class IndexerResource : ProviderResource
|
||||
{
|
||||
public Boolean EnableRss { get; set; }
|
||||
public Boolean EnableSearch { get; set; }
|
||||
public Boolean SupportsRss { get; set; }
|
||||
public Boolean SupportsSearch { get; set; }
|
||||
public bool EnableRss { get; set; }
|
||||
public bool EnableSearch { get; set; }
|
||||
public bool SupportsRss { get; set; }
|
||||
public bool SupportsSearch { get; set; }
|
||||
public DownloadProtocol Protocol { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -9,8 +9,6 @@ using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.IndexerSearch;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using Omu.ValueInjecter;
|
||||
using System.Linq;
|
||||
using Nancy.ModelBinding;
|
||||
using NzbDrone.Api.Extensions;
|
||||
using NzbDrone.Common.Cache;
|
||||
@@ -18,7 +16,7 @@ using HttpStatusCode = System.Net.HttpStatusCode;
|
||||
|
||||
namespace NzbDrone.Api.Indexers
|
||||
{
|
||||
public class ReleaseModule : NzbDroneRestModule<ReleaseResource>
|
||||
public class ReleaseModule : ReleaseModuleBase
|
||||
{
|
||||
private readonly IFetchAndParseRss _rssFetcherAndParser;
|
||||
private readonly ISearchForNzb _nzbSearchService;
|
||||
@@ -113,55 +111,10 @@ namespace NzbDrone.Api.Indexers
|
||||
return MapDecisions(prioritizedDecisions);
|
||||
}
|
||||
|
||||
private List<ReleaseResource> MapDecisions(IEnumerable<DownloadDecision> decisions)
|
||||
protected override ReleaseResource MapDecision(DownloadDecision decision, int initialWeight)
|
||||
{
|
||||
var result = new List<ReleaseResource>();
|
||||
|
||||
foreach (var downloadDecision in decisions)
|
||||
{
|
||||
_remoteEpisodeCache.Set(downloadDecision.RemoteEpisode.Release.Guid, downloadDecision.RemoteEpisode, TimeSpan.FromMinutes(30));
|
||||
|
||||
var release = new ReleaseResource();
|
||||
|
||||
release.InjectFrom(downloadDecision.RemoteEpisode.Release);
|
||||
release.InjectFrom(downloadDecision.RemoteEpisode.ParsedEpisodeInfo);
|
||||
release.InjectFrom(downloadDecision);
|
||||
release.Rejections = downloadDecision.Rejections.Select(r => r.Reason).ToList();
|
||||
release.DownloadAllowed = downloadDecision.RemoteEpisode.DownloadAllowed;
|
||||
|
||||
release.ReleaseWeight = result.Count;
|
||||
|
||||
if (downloadDecision.RemoteEpisode.Series != null)
|
||||
{
|
||||
release.QualityWeight = downloadDecision.RemoteEpisode
|
||||
.Series
|
||||
.Profile
|
||||
.Value
|
||||
.Items
|
||||
.FindIndex(v => v.Quality == release.Quality.Quality) * 100;
|
||||
}
|
||||
|
||||
release.QualityWeight += release.Quality.Revision.Real * 10;
|
||||
release.QualityWeight += release.Quality.Revision.Version;
|
||||
|
||||
var torrentRelease = downloadDecision.RemoteEpisode.Release as TorrentInfo;
|
||||
|
||||
if (torrentRelease != null)
|
||||
{
|
||||
release.Protocol = DownloadProtocol.Torrent;
|
||||
release.Seeders = torrentRelease.Seeders;
|
||||
//TODO: move this up the chains
|
||||
release.Leechers = torrentRelease.Peers - torrentRelease.Seeders;
|
||||
}
|
||||
else
|
||||
{
|
||||
release.Protocol = DownloadProtocol.Usenet;
|
||||
}
|
||||
|
||||
result.Add(release);
|
||||
}
|
||||
|
||||
return result;
|
||||
_remoteEpisodeCache.Set(decision.RemoteEpisode.Release.Guid, decision.RemoteEpisode, TimeSpan.FromMinutes(30));
|
||||
return base.MapDecision(decision, initialWeight);
|
||||
}
|
||||
}
|
||||
}
|
||||
67
src/NzbDrone.Api/Indexers/ReleaseModuleBase.cs
Normal file
67
src/NzbDrone.Api/Indexers/ReleaseModuleBase.cs
Normal file
@@ -0,0 +1,67 @@
|
||||
using System.Collections.Generic;
|
||||
using NzbDrone.Core.DecisionEngine;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using Omu.ValueInjecter;
|
||||
using System.Linq;
|
||||
|
||||
namespace NzbDrone.Api.Indexers
|
||||
{
|
||||
public abstract class ReleaseModuleBase : NzbDroneRestModule<ReleaseResource>
|
||||
{
|
||||
protected virtual List<ReleaseResource> MapDecisions(IEnumerable<DownloadDecision> decisions)
|
||||
{
|
||||
var result = new List<ReleaseResource>();
|
||||
|
||||
foreach (var downloadDecision in decisions)
|
||||
{
|
||||
var release = MapDecision(downloadDecision, result.Count);
|
||||
|
||||
result.Add(release);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
protected virtual ReleaseResource MapDecision(DownloadDecision decision, int initialWeight)
|
||||
{
|
||||
var release = new ReleaseResource();
|
||||
|
||||
release.InjectFrom(decision.RemoteEpisode.Release);
|
||||
release.InjectFrom(decision.RemoteEpisode.ParsedEpisodeInfo);
|
||||
release.InjectFrom(decision);
|
||||
release.Rejections = decision.Rejections.Select(r => r.Reason).ToList();
|
||||
release.DownloadAllowed = decision.RemoteEpisode.DownloadAllowed;
|
||||
release.ReleaseWeight = initialWeight;
|
||||
|
||||
if (decision.RemoteEpisode.Series != null)
|
||||
{
|
||||
release.QualityWeight = decision.RemoteEpisode
|
||||
.Series
|
||||
.Profile
|
||||
.Value
|
||||
.Items
|
||||
.FindIndex(v => v.Quality == release.Quality.Quality) * 100;
|
||||
}
|
||||
|
||||
release.QualityWeight += release.Quality.Revision.Real * 10;
|
||||
release.QualityWeight += release.Quality.Revision.Version;
|
||||
|
||||
var torrentRelease = decision.RemoteEpisode.Release as TorrentInfo;
|
||||
|
||||
if (torrentRelease != null)
|
||||
{
|
||||
release.Protocol = DownloadProtocol.Torrent;
|
||||
release.Seeders = torrentRelease.Seeders;
|
||||
//TODO: move this up the chains
|
||||
release.Leechers = torrentRelease.Peers - torrentRelease.Seeders;
|
||||
}
|
||||
else
|
||||
{
|
||||
release.Protocol = DownloadProtocol.Usenet;
|
||||
}
|
||||
|
||||
return release;
|
||||
}
|
||||
}
|
||||
}
|
||||
50
src/NzbDrone.Api/Indexers/ReleasePushModule.cs
Normal file
50
src/NzbDrone.Api/Indexers/ReleasePushModule.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using Nancy;
|
||||
using Nancy.ModelBinding;
|
||||
using FluentValidation;
|
||||
using NzbDrone.Core.DecisionEngine;
|
||||
using NzbDrone.Core.Download;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Api.Mapping;
|
||||
using NzbDrone.Api.Extensions;
|
||||
using NLog;
|
||||
|
||||
namespace NzbDrone.Api.Indexers
|
||||
{
|
||||
class ReleasePushModule : ReleaseModuleBase
|
||||
{
|
||||
private readonly IMakeDownloadDecision _downloadDecisionMaker;
|
||||
private readonly IProcessDownloadDecisions _downloadDecisionProcessor;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public ReleasePushModule(IMakeDownloadDecision downloadDecisionMaker,
|
||||
IProcessDownloadDecisions downloadDecisionProcessor,
|
||||
Logger logger)
|
||||
{
|
||||
_downloadDecisionMaker = downloadDecisionMaker;
|
||||
_downloadDecisionProcessor = downloadDecisionProcessor;
|
||||
_logger = logger;
|
||||
|
||||
Post["/push"] = x => ProcessRelease(this.Bind<ReleaseResource>());
|
||||
|
||||
PostValidator.RuleFor(s => s.Title).NotEmpty();
|
||||
PostValidator.RuleFor(s => s.DownloadUrl).NotEmpty();
|
||||
PostValidator.RuleFor(s => s.DownloadProtocol).NotEmpty();
|
||||
PostValidator.RuleFor(s => s.PublishDate).NotEmpty();
|
||||
}
|
||||
|
||||
private Response ProcessRelease(ReleaseResource release)
|
||||
{
|
||||
_logger.Info("Release pushed: {0} - {1}", release.Title, release.DownloadUrl);
|
||||
|
||||
var info = release.InjectTo<ReleaseInfo>();
|
||||
info.Guid = "PUSH-" + info.DownloadUrl;
|
||||
|
||||
var decisions = _downloadDecisionMaker.GetRssDecision(new List<ReleaseInfo> { info });
|
||||
var processed = _downloadDecisionProcessor.ProcessDecisions(decisions);
|
||||
|
||||
return MapDecisions(decisions).First().AsResponse();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,37 +9,39 @@ namespace NzbDrone.Api.Indexers
|
||||
{
|
||||
public class ReleaseResource : RestResource
|
||||
{
|
||||
public String Guid { get; set; }
|
||||
public string Guid { get; set; }
|
||||
public QualityModel Quality { get; set; }
|
||||
public Int32 QualityWeight { get; set; }
|
||||
public Int32 Age { get; set; }
|
||||
public Double AgeHours { get; set; }
|
||||
public Double AgeMinutes { get; set; }
|
||||
public Int64 Size { get; set; }
|
||||
public String Indexer { get; set; }
|
||||
public String ReleaseGroup { get; set; }
|
||||
public String SubGroup { get; set; }
|
||||
public String ReleaseHash { get; set; }
|
||||
public String Title { get; set; }
|
||||
public Boolean FullSeason { get; set; }
|
||||
public Boolean SceneSource { get; set; }
|
||||
public Int32 SeasonNumber { get; set; }
|
||||
public int QualityWeight { get; set; }
|
||||
public int Age { get; set; }
|
||||
public double AgeHours { get; set; }
|
||||
public double AgeMinutes { get; set; }
|
||||
public long Size { get; set; }
|
||||
public int IndexerId { get; set; }
|
||||
public string Indexer { get; set; }
|
||||
public string ReleaseGroup { get; set; }
|
||||
public string SubGroup { get; set; }
|
||||
public string ReleaseHash { get; set; }
|
||||
public string Title { get; set; }
|
||||
public bool FullSeason { get; set; }
|
||||
public bool SceneSource { get; set; }
|
||||
public int SeasonNumber { get; set; }
|
||||
public Language Language { get; set; }
|
||||
public String AirDate { get; set; }
|
||||
public String SeriesTitle { get; set; }
|
||||
public string AirDate { get; set; }
|
||||
public string SeriesTitle { get; set; }
|
||||
public int[] EpisodeNumbers { get; set; }
|
||||
public int[] AbsoluteEpisodeNumbers { get; set; }
|
||||
public Boolean Approved { get; set; }
|
||||
public Boolean TemporarilyRejected { get; set; }
|
||||
public Boolean Rejected { get; set; }
|
||||
public Int32 TvRageId { get; set; }
|
||||
public IEnumerable<String> Rejections { get; set; }
|
||||
public bool Approved { get; set; }
|
||||
public bool TemporarilyRejected { get; set; }
|
||||
public bool Rejected { get; set; }
|
||||
public int TvdbId { get; set; }
|
||||
public int TvRageId { get; set; }
|
||||
public IEnumerable<string> Rejections { get; set; }
|
||||
public DateTime PublishDate { get; set; }
|
||||
public String CommentUrl { get; set; }
|
||||
public String DownloadUrl { get; set; }
|
||||
public String InfoUrl { get; set; }
|
||||
public Boolean DownloadAllowed { get; set; }
|
||||
public Int32 ReleaseWeight { get; set; }
|
||||
public string CommentUrl { get; set; }
|
||||
public string DownloadUrl { get; set; }
|
||||
public string InfoUrl { get; set; }
|
||||
public bool DownloadAllowed { get; set; }
|
||||
public int ReleaseWeight { get; set; }
|
||||
|
||||
|
||||
public int? Seeders { get; set; }
|
||||
@@ -49,9 +51,9 @@ namespace NzbDrone.Api.Indexers
|
||||
//TODO: besides a test I don't think this is used...
|
||||
public DownloadProtocol DownloadProtocol { get; set; }
|
||||
|
||||
public Boolean IsDaily { get; set; }
|
||||
public Boolean IsAbsoluteNumbering { get; set; }
|
||||
public Boolean IsPossibleSpecialEpisode { get; set; }
|
||||
public Boolean Special { get; set; }
|
||||
public bool IsDaily { get; set; }
|
||||
public bool IsAbsoluteNumbering { get; set; }
|
||||
public bool IsPossibleSpecialEpisode { get; set; }
|
||||
public bool Special { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ namespace NzbDrone.Api.Logs
|
||||
|
||||
public LogFileModuleBase(IDiskProvider diskProvider,
|
||||
IConfigFileProvider configFileProvider,
|
||||
String route)
|
||||
string route)
|
||||
: base("log/file" + route)
|
||||
{
|
||||
_diskProvider = diskProvider;
|
||||
@@ -44,15 +44,15 @@ namespace NzbDrone.Api.Logs
|
||||
Id = i + 1,
|
||||
Filename = filename,
|
||||
LastWriteTime = _diskProvider.FileGetLastWrite(file),
|
||||
ContentsUrl = String.Format("{0}/api/{1}/{2}", _configFileProvider.UrlBase, Resource, filename),
|
||||
DownloadUrl = String.Format("{0}/{1}/{2}", _configFileProvider.UrlBase, DownloadUrlRoot, filename)
|
||||
ContentsUrl = string.Format("{0}/api/{1}/{2}", _configFileProvider.UrlBase, Resource, filename),
|
||||
DownloadUrl = string.Format("{0}/{1}/{2}", _configFileProvider.UrlBase, DownloadUrlRoot, filename)
|
||||
});
|
||||
}
|
||||
|
||||
return result.OrderByDescending(l => l.LastWriteTime).ToList();
|
||||
}
|
||||
|
||||
private Response GetLogFileResponse(String filename)
|
||||
private Response GetLogFileResponse(string filename)
|
||||
{
|
||||
var filePath = GetLogFilePath(filename);
|
||||
|
||||
@@ -64,9 +64,9 @@ namespace NzbDrone.Api.Logs
|
||||
return new TextResponse(data);
|
||||
}
|
||||
|
||||
protected abstract IEnumerable<String> GetLogFiles();
|
||||
protected abstract String GetLogFilePath(String filename);
|
||||
protected abstract IEnumerable<string> GetLogFiles();
|
||||
protected abstract string GetLogFilePath(string filename);
|
||||
|
||||
protected abstract String DownloadUrlRoot { get; }
|
||||
protected abstract string DownloadUrlRoot { get; }
|
||||
}
|
||||
}
|
||||
@@ -5,9 +5,9 @@ namespace NzbDrone.Api.Logs
|
||||
{
|
||||
public class LogFileResource : RestResource
|
||||
{
|
||||
public String Filename { get; set; }
|
||||
public string Filename { get; set; }
|
||||
public DateTime LastWriteTime { get; set; }
|
||||
public String ContentsUrl { get; set; }
|
||||
public String DownloadUrl { get; set; }
|
||||
public string ContentsUrl { get; set; }
|
||||
public string DownloadUrl { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,11 +6,11 @@ namespace NzbDrone.Api.Logs
|
||||
public class LogResource : RestResource
|
||||
{
|
||||
public DateTime Time { get; set; }
|
||||
public String Exception { get; set; }
|
||||
public String ExceptionType { get; set; }
|
||||
public String Level { get; set; }
|
||||
public String Logger { get; set; }
|
||||
public String Message { get; set; }
|
||||
public String Method { get; set; }
|
||||
public string Exception { get; set; }
|
||||
public string ExceptionType { get; set; }
|
||||
public string Level { get; set; }
|
||||
public string Logger { get; set; }
|
||||
public string Message { get; set; }
|
||||
public string Method { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,21 +24,21 @@ namespace NzbDrone.Api.Logs
|
||||
_diskProvider = diskProvider;
|
||||
}
|
||||
|
||||
protected override IEnumerable<String> GetLogFiles()
|
||||
protected override IEnumerable<string> GetLogFiles()
|
||||
{
|
||||
if (!_diskProvider.FolderExists(_appFolderInfo.GetUpdateLogFolder())) return Enumerable.Empty<String>();
|
||||
if (!_diskProvider.FolderExists(_appFolderInfo.GetUpdateLogFolder())) return Enumerable.Empty<string>();
|
||||
|
||||
return _diskProvider.GetFiles(_appFolderInfo.GetUpdateLogFolder(), SearchOption.TopDirectoryOnly)
|
||||
.Where(f => Regex.IsMatch(Path.GetFileName(f), LOGFILE_ROUTE.TrimStart('/'), RegexOptions.IgnoreCase))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
protected override String GetLogFilePath(String filename)
|
||||
protected override string GetLogFilePath(string filename)
|
||||
{
|
||||
return Path.Combine(_appFolderInfo.GetUpdateLogFolder(), filename);
|
||||
}
|
||||
|
||||
protected override String DownloadUrlRoot
|
||||
protected override string DownloadUrlRoot
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
@@ -30,10 +30,13 @@ namespace NzbDrone.Api.ManualImport
|
||||
|
||||
private ManualImportResource AddQualityWeight(ManualImportResource item)
|
||||
{
|
||||
item.QualityWeight = Quality.DefaultQualityDefinitions.Single(q => q.Quality == item.Quality.Quality).Weight;
|
||||
item.QualityWeight += item.Quality.Revision.Real * 10;
|
||||
item.QualityWeight += item.Quality.Revision.Version;
|
||||
|
||||
if (item.Quality != null)
|
||||
{
|
||||
item.QualityWeight = Quality.DefaultQualityDefinitions.Single(q => q.Quality == item.Quality.Quality).Weight;
|
||||
item.QualityWeight += item.Quality.Revision.Real * 10;
|
||||
item.QualityWeight += item.Quality.Revision.Version;
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace NzbDrone.Api.Mapping
|
||||
public class ResourceMappingException : ApplicationException
|
||||
{
|
||||
public ResourceMappingException(IEnumerable<string> error)
|
||||
: base(Environment.NewLine + String.Join(Environment.NewLine, error.OrderBy(c => c)))
|
||||
: base(Environment.NewLine + string.Join(Environment.NewLine, error.OrderBy(c => c)))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -4,6 +4,6 @@ namespace NzbDrone.Api.Metadata
|
||||
{
|
||||
public class MetadataResource : ProviderResource
|
||||
{
|
||||
public Boolean Enable { get; set; }
|
||||
public bool Enable { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
using NLog;
|
||||
using System;
|
||||
using NLog;
|
||||
using Nancy;
|
||||
using Nancy.Bootstrapper;
|
||||
using Nancy.Diagnostics;
|
||||
using NzbDrone.Api.ErrorManagement;
|
||||
@@ -36,7 +38,7 @@ namespace NzbDrone.Api
|
||||
container.Resolve<DatabaseTarget>().Register();
|
||||
container.Resolve<IEventAggregator>().PublishEvent(new ApplicationStartedEvent());
|
||||
|
||||
ApplicationPipelines.OnError.AddItemToEndOfPipeline(container.Resolve<NzbDroneErrorPipeline>().HandleException);
|
||||
ApplicationPipelines.OnError.AddItemToEndOfPipeline((Func<NancyContext, Exception, Response>) container.Resolve<NzbDroneErrorPipeline>().HandleException);
|
||||
}
|
||||
|
||||
private void RegisterPipelines(IPipelines pipelines)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace NzbDrone.Api.Notifications
|
||||
{
|
||||
@@ -9,6 +8,11 @@ namespace NzbDrone.Api.Notifications
|
||||
public bool OnGrab { get; set; }
|
||||
public bool OnDownload { get; set; }
|
||||
public bool OnUpgrade { get; set; }
|
||||
public bool OnRename { get; set; }
|
||||
public bool SupportsOnGrab { get; set; }
|
||||
public bool SupportsOnDownload { get; set; }
|
||||
public bool SupportsOnUpgrade { get; set; }
|
||||
public bool SupportsOnRename { get; set; }
|
||||
public string TestCommand { get; set; }
|
||||
public HashSet<int> Tags { get; set; }
|
||||
}
|
||||
|
||||
@@ -101,6 +101,8 @@
|
||||
<Compile Include="Extensions\Pipelines\CorsPipeline.cs" />
|
||||
<Compile Include="Frontend\Mappers\LoginHtmlMapper.cs" />
|
||||
<Compile Include="Frontend\Mappers\RobotsTxtMapper.cs" />
|
||||
<Compile Include="Indexers\ReleaseModuleBase.cs" />
|
||||
<Compile Include="Indexers\ReleasePushModule.cs" />
|
||||
<Compile Include="Parse\ParseModule.cs" />
|
||||
<Compile Include="Parse\ParseResource.cs" />
|
||||
<Compile Include="ManualImport\ManualImportModule.cs" />
|
||||
@@ -236,6 +238,7 @@
|
||||
<Compile Include="TinyIoCNancyBootstrapper.cs" />
|
||||
<Compile Include="Update\UpdateModule.cs" />
|
||||
<Compile Include="Update\UpdateResource.cs" />
|
||||
<Compile Include="Validation\RssSyncIntervalValidator.cs" />
|
||||
<Compile Include="Validation\EmptyCollectionValidator.cs" />
|
||||
<Compile Include="Validation\RuleBuilderExtensions.cs" />
|
||||
<Compile Include="Wanted\CutoffModule.cs" />
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace NzbDrone.Api.Parse
|
||||
return null;
|
||||
}
|
||||
|
||||
var remoteEpisode = _parsingService.Map(parsedEpisodeInfo);
|
||||
var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0, 0);
|
||||
|
||||
if (remoteEpisode == null)
|
||||
{
|
||||
|
||||
@@ -7,8 +7,8 @@ namespace NzbDrone.Api.Profiles.Languages
|
||||
public class LanguageResource : RestResource
|
||||
{
|
||||
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)]
|
||||
public Int32 Id { get; set; }
|
||||
public String Name { get; set; }
|
||||
public String NameLower { get { return Name.ToLowerInvariant(); } }
|
||||
public int Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string NameLower { get { return Name.ToLowerInvariant(); } }
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ namespace NzbDrone.Api.Profiles
|
||||
Get["/"] = x =>
|
||||
{
|
||||
string queryString = ConvertQueryParams(Request.Query);
|
||||
var url = String.Format("/api/profile?{0}", queryString);
|
||||
var url = string.Format("/api/profile?{0}", queryString);
|
||||
|
||||
return Response.AsRedirect(url);
|
||||
};
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace NzbDrone.Api.Profiles
|
||||
{
|
||||
public class ProfileResource : RestResource
|
||||
{
|
||||
public String Name { get; set; }
|
||||
public string Name { get; set; }
|
||||
public Quality Cutoff { get; set; }
|
||||
public List<ProfileQualityItemResource> Items { get; set; }
|
||||
public Language Language { get; set; }
|
||||
|
||||
@@ -11,6 +11,7 @@ using NzbDrone.Common.Reflection;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
using NzbDrone.Core.Validation;
|
||||
using Omu.ValueInjecter;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace NzbDrone.Api
|
||||
{
|
||||
@@ -27,7 +28,8 @@ namespace NzbDrone.Api
|
||||
_providerFactory = providerFactory;
|
||||
|
||||
Get["schema"] = x => GetTemplates();
|
||||
Post["test"] = x => Test(ReadResourceFromRequest());
|
||||
Post["test"] = x => Test(ReadResourceFromRequest(true));
|
||||
Post["connectData/{stage}"] = x => ConnectData(x.stage, ReadResourceFromRequest(true));
|
||||
|
||||
GetResourceAll = GetAll;
|
||||
GetResourceById = GetProviderById;
|
||||
@@ -98,7 +100,7 @@ namespace NzbDrone.Api
|
||||
_providerFactory.Update(providerDefinition);
|
||||
}
|
||||
|
||||
private TProviderDefinition GetDefinition(TProviderResource providerResource, bool includeWarnings = false)
|
||||
private TProviderDefinition GetDefinition(TProviderResource providerResource, bool includeWarnings = false, bool validate = true)
|
||||
{
|
||||
var definition = new TProviderDefinition();
|
||||
|
||||
@@ -111,8 +113,10 @@ namespace NzbDrone.Api
|
||||
|
||||
var configContract = ReflectionExtensions.CoreAssembly.FindTypeByName(definition.ConfigContract);
|
||||
definition.Settings = (IProviderConfig)SchemaBuilder.ReadFormSchema(providerResource.Fields, configContract, preset);
|
||||
|
||||
Validate(definition, includeWarnings);
|
||||
if (validate)
|
||||
{
|
||||
Validate(definition, includeWarnings);
|
||||
}
|
||||
|
||||
return definition;
|
||||
}
|
||||
@@ -133,7 +137,7 @@ namespace NzbDrone.Api
|
||||
var providerResource = new TProviderResource();
|
||||
providerResource.InjectFrom(providerDefinition);
|
||||
providerResource.Fields = SchemaBuilder.ToSchema(providerDefinition.Settings);
|
||||
providerResource.InfoLink = String.Format("https://github.com/NzbDrone/NzbDrone/wiki/Supported-{0}#{1}",
|
||||
providerResource.InfoLink = string.Format("https://github.com/NzbDrone/NzbDrone/wiki/Supported-{0}#{1}",
|
||||
typeof(TProviderResource).Name.Replace("Resource", "s"),
|
||||
providerDefinition.Implementation.ToLower());
|
||||
|
||||
@@ -163,6 +167,19 @@ namespace NzbDrone.Api
|
||||
return "{}";
|
||||
}
|
||||
|
||||
|
||||
private Response ConnectData(string stage, TProviderResource providerResource)
|
||||
{
|
||||
TProviderDefinition providerDefinition = GetDefinition(providerResource, true, false);
|
||||
|
||||
if (!providerDefinition.Enable) return "{}";
|
||||
|
||||
object data = _providerFactory.ConnectData(providerDefinition, stage, (IDictionary<string, object>) Request.Query.ToDictionary());
|
||||
Response resp = JsonConvert.SerializeObject(data);
|
||||
resp.ContentType = "application/json";
|
||||
return resp;
|
||||
}
|
||||
|
||||
protected virtual void Validate(TProviderDefinition definition, bool includeWarnings)
|
||||
{
|
||||
var validationResult = definition.Settings.Validate();
|
||||
|
||||
@@ -14,15 +14,15 @@ namespace NzbDrone.Api.Queue
|
||||
public SeriesResource Series { get; set; }
|
||||
public EpisodeResource Episode { get; set; }
|
||||
public QualityModel Quality { get; set; }
|
||||
public Decimal Size { get; set; }
|
||||
public String Title { get; set; }
|
||||
public Decimal Sizeleft { get; set; }
|
||||
public decimal Size { get; set; }
|
||||
public string Title { get; set; }
|
||||
public decimal Sizeleft { get; set; }
|
||||
public TimeSpan? Timeleft { get; set; }
|
||||
public DateTime? EstimatedCompletionTime { get; set; }
|
||||
public String Status { get; set; }
|
||||
public String TrackedDownloadStatus { get; set; }
|
||||
public string Status { get; set; }
|
||||
public string TrackedDownloadStatus { get; set; }
|
||||
public List<TrackedDownloadStatusMessage> StatusMessages { get; set; }
|
||||
public String DownloadId { get; set; }
|
||||
public string DownloadId { get; set; }
|
||||
public DownloadProtocol Protocol { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,7 +182,7 @@ namespace NzbDrone.Api.REST
|
||||
}
|
||||
}
|
||||
|
||||
protected TResource ReadResourceFromRequest()
|
||||
protected TResource ReadResourceFromRequest(bool skipValidate = false)
|
||||
{
|
||||
//TODO: handle when request is null
|
||||
var resource = Request.Body.FromJson<TResource>();
|
||||
@@ -194,7 +194,7 @@ namespace NzbDrone.Api.REST
|
||||
|
||||
var errors = SharedValidator.Validate(resource).Errors.ToList();
|
||||
|
||||
if (Request.Method.Equals("POST", StringComparison.InvariantCultureIgnoreCase) && !Request.Url.Path.EndsWith("/test", StringComparison.InvariantCultureIgnoreCase))
|
||||
if (Request.Method.Equals("POST", StringComparison.InvariantCultureIgnoreCase) && !skipValidate && !Request.Url.Path.EndsWith("/test", StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
errors.AddRange(PostValidator.Validate(resource).Errors);
|
||||
}
|
||||
@@ -214,11 +214,11 @@ namespace NzbDrone.Api.REST
|
||||
private PagingResource<TResource> ReadPagingResourceFromRequest()
|
||||
{
|
||||
int pageSize;
|
||||
Int32.TryParse(Request.Query.PageSize.ToString(), out pageSize);
|
||||
int.TryParse(Request.Query.PageSize.ToString(), out pageSize);
|
||||
if (pageSize == 0) pageSize = 10;
|
||||
|
||||
int page;
|
||||
Int32.TryParse(Request.Query.Page.ToString(), out page);
|
||||
int.TryParse(Request.Query.Page.ToString(), out page);
|
||||
if (page == 0) page = 1;
|
||||
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ namespace NzbDrone.Api.RemotePathMappings
|
||||
{
|
||||
public class RemotePathMappingResource : RestResource
|
||||
{
|
||||
public String Host { get; set; }
|
||||
public String RemotePath { get; set; }
|
||||
public String LocalPath { get; set; }
|
||||
public string Host { get; set; }
|
||||
public string RemotePath { get; set; }
|
||||
public string LocalPath { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace NzbDrone.Api.Restrictions
|
||||
});
|
||||
}
|
||||
|
||||
private RestrictionResource Get(Int32 id)
|
||||
private RestrictionResource Get(int id)
|
||||
{
|
||||
return _restrictionService.Get(id).InjectTo<RestrictionResource>();
|
||||
}
|
||||
@@ -43,7 +43,7 @@ namespace NzbDrone.Api.Restrictions
|
||||
return ToListResource(_restrictionService.All);
|
||||
}
|
||||
|
||||
private Int32 Create(RestrictionResource resource)
|
||||
private int Create(RestrictionResource resource)
|
||||
{
|
||||
return _restrictionService.Add(resource.InjectTo<Restriction>()).Id;
|
||||
}
|
||||
@@ -53,7 +53,7 @@ namespace NzbDrone.Api.Restrictions
|
||||
_restrictionService.Update(resource.InjectTo<Restriction>());
|
||||
}
|
||||
|
||||
private void Delete(Int32 id)
|
||||
private void Delete(int id)
|
||||
{
|
||||
_restrictionService.Delete(id);
|
||||
}
|
||||
|
||||
@@ -6,14 +6,14 @@ namespace NzbDrone.Api.Restrictions
|
||||
{
|
||||
public class RestrictionResource : RestResource
|
||||
{
|
||||
public String Required { get; set; }
|
||||
public String Preferred { get; set; }
|
||||
public String Ignored { get; set; }
|
||||
public HashSet<Int32> Tags { get; set; }
|
||||
public string Required { get; set; }
|
||||
public string Preferred { get; set; }
|
||||
public string Ignored { get; set; }
|
||||
public HashSet<int> Tags { get; set; }
|
||||
|
||||
public RestrictionResource()
|
||||
{
|
||||
Tags = new HashSet<Int32>();
|
||||
Tags = new HashSet<int>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@ namespace NzbDrone.Api.RootFolders
|
||||
{
|
||||
public class RootFolderResource : RestResource
|
||||
{
|
||||
public String Path { get; set; }
|
||||
public Int64? FreeSpace { get; set; }
|
||||
public string Path { get; set; }
|
||||
public long? FreeSpace { get; set; }
|
||||
|
||||
public List<UnmappedFolder> UnmappedFolders { get; set; }
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ namespace NzbDrone.Api.Series
|
||||
{
|
||||
public class AlternateTitleResource
|
||||
{
|
||||
public String Title { get; set; }
|
||||
public Int32 SeasonNumber { get; set; }
|
||||
public string Title { get; set; }
|
||||
public int SeasonNumber { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user