mirror of
https://github.com/Radarr/Radarr.git
synced 2026-04-18 21:35:51 -04:00
Compare commits
525 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 816cf608fc | |||
| 713e109bc9 | |||
| 4bf3ef45b0 | |||
| 09530b238f | |||
| 5414dadffc | |||
| 5482fa3ae0 | |||
| 6e8480d7cb | |||
| 7c7cfc0b7d | |||
| 4e051bfde2 | |||
| 356e14ac5b | |||
| 97d0ddb6e9 | |||
| 17f6841426 | |||
| a6a7732cd5 | |||
| aa37b65842 | |||
| 6ac9e5ec18 | |||
| 2d54ca5d47 | |||
| 422371d118 | |||
| 77574ec555 | |||
| 3b385e8738 | |||
| 7f6101a6bc | |||
| 28f6777f9a | |||
| e7275af073 | |||
| 5fcd65ef57 | |||
| 222ed1eb4b | |||
| 4486317888 | |||
| 206ff12b71 | |||
| 73fb216e6f | |||
| e9eab0ae48 | |||
| 626d94d435 | |||
| e4adc1d3a1 | |||
| c3f9a0336c | |||
| 04ca1e4569 | |||
| 459715b9b4 | |||
| db4b0de5e2 | |||
| 914f799f9d | |||
| e2272dcca3 | |||
| 2b1c97ffa4 | |||
| b80d6c74ad | |||
| 6f2dd5d2fa | |||
| 1218dd255f | |||
| 5bf9b069fc | |||
| 2ab9bb4fce | |||
| 87d00abdf1 | |||
| 19aded7a15 | |||
| a2536deef0 | |||
| ff6737314f | |||
| 4fc150f77b | |||
| 90b5947a19 | |||
| c7d445d1c1 | |||
| c4a3bc3d2f | |||
| 8966e5a403 | |||
| bc94a7f921 | |||
| f3cbc2bdd2 | |||
| f681d43601 | |||
| b232cc3081 | |||
| 857d661ff1 | |||
| 8255fb0b28 | |||
| ab63c3e83d | |||
| c1f59a55c6 | |||
| c8474701a0 | |||
| c206b83318 | |||
| a8b9a47f5f | |||
| 3e9a159466 | |||
| ba817557ba | |||
| 30ed3a4a80 | |||
| 006dc9202b | |||
| c2a2746ccf | |||
| 2fa0729158 | |||
| b3eee50892 | |||
| f1c007c5fe | |||
| 7c8a8f8e55 | |||
| a3ade09964 | |||
| 8e429239a8 | |||
| 4783803b6b | |||
| b320a23bf8 | |||
| 32a347bdd2 | |||
| a0b0f6162f | |||
| 6c287f118f | |||
| 8213f020ff | |||
| d984dd41d6 | |||
| fea5db3e4b | |||
| c38973cce4 | |||
| 958153be55 | |||
| d4bab775df | |||
| ecf67e609e | |||
| 449b15331a | |||
| f0437d1f22 | |||
| 902d6929c0 | |||
| d81e03fcc0 | |||
| abf8c684e7 | |||
| 7476d692aa | |||
| c25bea6470 | |||
| b9d67ae421 | |||
| ff3fc8de2e | |||
| e4e3770e54 | |||
| 498a86f850 | |||
| f0ae908892 | |||
| 54c17de849 | |||
| 12a1865d4d | |||
| 9ea753011b | |||
| 4c39594a57 | |||
| 67ff871cf6 | |||
| ea0982ecae | |||
| 4f5d79b189 | |||
| aec3ed16d0 | |||
| 2e90ea9c19 | |||
| a6b1a1fc0d | |||
| fd42ddec1b | |||
| 229986033c | |||
| c249ad5dbe | |||
| e2d6d374ab | |||
| d3adb7ac40 | |||
| 0f1afd416b | |||
| 2f3bc61af7 | |||
| 2b11ad4585 | |||
| c82b90aca8 | |||
| 5fae8e7762 | |||
| 319b4f13b7 | |||
| 54fda3d648 | |||
| 2f6fded7c3 | |||
| 7934003b5e | |||
| b479064abd | |||
| 9e7927acec | |||
| f807e44a39 | |||
| d68abc746c | |||
| 8773d38ddd | |||
| 6fdbb2b659 | |||
| bfe134ee54 | |||
| f16f097b3e | |||
| 7284ef50eb | |||
| e9248e284e | |||
| aff6af1806 | |||
| c0c35a0eba | |||
| 072ca459bd | |||
| 0865306064 | |||
| ac14444d34 | |||
| 8a6d1ef373 | |||
| dc694b0f34 | |||
| 76f8cc81da | |||
| 14f737bd60 | |||
| 5942ddf9f1 | |||
| ab7b427241 | |||
| 15120270b4 | |||
| cc0406653a | |||
| 9f34127565 | |||
| 71ecc96c70 | |||
| 2fa3873503 | |||
| 96b7bd3b2b | |||
| e1ea17cabf | |||
| 3a162be265 | |||
| 502298aab9 | |||
| edea488dbe | |||
| 2fabe2d198 | |||
| f2c8156c00 | |||
| 942be364dc | |||
| 44e09e2220 | |||
| 0fcd20ec4a | |||
| 4c5707bba8 | |||
| 947f494e72 | |||
| 3f74a87b45 | |||
| da0bdc5750 | |||
| 3ea59cd91b | |||
| 9b42dc7082 | |||
| 8b1c022244 | |||
| e5cb8bb0bd | |||
| d37343bb7d | |||
| 9c91f11cdc | |||
| 444fcf5ae5 | |||
| 31f8e0a47a | |||
| 1e0fcc877b | |||
| 1293bab868 | |||
| 9de92d18e1 | |||
| 5a877cbd62 | |||
| 99aa25bf83 | |||
| 5f66c15b91 | |||
| af220c7f7b | |||
| 59e71a4cd9 | |||
| 6b1a4c4198 | |||
| 1072c5247c | |||
| 6508e920fe | |||
| 1154e0eeb3 | |||
| 2d96914bfa | |||
| 70494c3674 | |||
| d68ad98176 | |||
| eb70a6419c | |||
| 22aa759abc | |||
| 19b8fb6d8b | |||
| d4bc835b1c | |||
| b99d82cccc | |||
| 25d481d5d9 | |||
| 23871503a2 | |||
| 7c54fa70d7 | |||
| 2ffbbb0e71 | |||
| 7818f0c59b | |||
| 03e2adc332 | |||
| e6ab4196de | |||
| f2784d3ec2 | |||
| ef3d508b31 | |||
| 9ffc0ec521 | |||
| b598add64e | |||
| 47446515d1 | |||
| e5de7fb8cf | |||
| 55e870f295 | |||
| 1485c83ab6 | |||
| e8d1623e96 | |||
| 3bc6bf9e99 | |||
| 949d8bf49b | |||
| c29e49da95 | |||
| 79c565911c | |||
| bb9a0371c5 | |||
| e945231ab3 | |||
| c1298d162e | |||
| f005edfcf0 | |||
| 59c68ec6cc | |||
| a5077b0b1b | |||
| a22c0499d5 | |||
| c38608e3cf | |||
| 3b57194d47 | |||
| 21c901eab4 | |||
| 9ad8311dd6 | |||
| df84028c90 | |||
| 7cb1e91ba1 | |||
| 974a7276c3 | |||
| f0ca2bc11e | |||
| cb43888496 | |||
| 34d5fb1aa0 | |||
| 72f0085ef7 | |||
| f25f5abced | |||
| 94323f79e7 | |||
| bdb1076100 | |||
| 8818e39c63 | |||
| 6a90035a4c | |||
| e01b2ef25c | |||
| 91d91bc673 | |||
| 1c92ea58da | |||
| bd6a38173e | |||
| 5d05a85411 | |||
| 1a5eafd2b1 | |||
| 1603b06431 | |||
| 2396af4589 | |||
| 262b8daec1 | |||
| d33efe59fc | |||
| 5550565d6a | |||
| 68540cb479 | |||
| 4038fa6907 | |||
| f96f997506 | |||
| 4e84d1a17c | |||
| 97cdb6a4a5 | |||
| f5b3d70641 | |||
| db66d3da9e | |||
| c20e0667d4 | |||
| 4771b1c1b2 | |||
| 8e07a39ec0 | |||
| 9895b5bc1d | |||
| e89a1bc0fb | |||
| 9b0654c7f2 | |||
| 56da824e98 | |||
| f84b7904e6 | |||
| 9f523bb167 | |||
| f38d5de946 | |||
| de379b2e47 | |||
| 64e90f35c8 | |||
| bbfe8c27c6 | |||
| 2f50074123 | |||
| 5cfaed7b26 | |||
| 0d19f645e8 | |||
| 45d4371328 | |||
| 889933cb41 | |||
| 958b294152 | |||
| cf25097cd1 | |||
| 902e0dd5d6 | |||
| d943551a7f | |||
| 46304b8a71 | |||
| 6e2fc186ca | |||
| 845689401d | |||
| 4fb9cc5e8d | |||
| 487581a01a | |||
| 2bc771d91e | |||
| 8bd7969328 | |||
| 5876ab487c | |||
| 9c14ca0f39 | |||
| 81ca352b2f | |||
| 0edfed5b95 | |||
| 0ff053415c | |||
| a0ee607ae6 | |||
| 2723e2a7b8 | |||
| 6e105ce2c6 | |||
| 9fc7fceda4 | |||
| 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 |
@@ -0,0 +1,25 @@
|
|||||||
|
# This file is for unifying the coding style for different editors and IDEs
|
||||||
|
# editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*.{cs,html,js,hbs}]
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.less]
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
# They have troubles with TABS. Use 2 spaces
|
||||||
|
[{package.json,.travis.yml}]
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Provide a description of the feature request or bug, the more details the better.
|
||||||
|
Please use https://forums.sonarr.tv/ for support or other questions. (When in doubt, use the forums)
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#### Database Migration
|
||||||
|
YES | NO
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
A few sentences describing the overall goals of the pull request's commits.
|
||||||
|
|
||||||
|
#### Todos
|
||||||
|
- [ ] Tests
|
||||||
|
- [ ] Documentation
|
||||||
|
|
||||||
|
|
||||||
|
#### Issues Fixed or Closed by this PR
|
||||||
|
|
||||||
|
*
|
||||||
+3
-5
@@ -97,7 +97,7 @@ App_Data/*.ldf
|
|||||||
_NCrunch_*
|
_NCrunch_*
|
||||||
_TeamCity*
|
_TeamCity*
|
||||||
|
|
||||||
# NzbDrone
|
# Sonarr
|
||||||
config.xml
|
config.xml
|
||||||
nzbdrone.log*txt
|
nzbdrone.log*txt
|
||||||
UpdateLogs/
|
UpdateLogs/
|
||||||
@@ -105,7 +105,7 @@ UpdateLogs/
|
|||||||
*.test-cache
|
*.test-cache
|
||||||
*.userprefs
|
*.userprefs
|
||||||
*/test-results/*
|
*/test-results/*
|
||||||
.idea/*
|
src/UI/.idea/*
|
||||||
*log.txt
|
*log.txt
|
||||||
node_modules/
|
node_modules/
|
||||||
_output*
|
_output*
|
||||||
@@ -113,9 +113,6 @@ _rawPackage/
|
|||||||
_dotTrace*
|
_dotTrace*
|
||||||
_tests/
|
_tests/
|
||||||
*.Result.xml
|
*.Result.xml
|
||||||
wix/*.msi
|
|
||||||
wix/*.wixobj
|
|
||||||
wix/*.wixpdb
|
|
||||||
setup/Output/
|
setup/Output/
|
||||||
*.~is
|
*.~is
|
||||||
|
|
||||||
@@ -131,3 +128,4 @@ output/*
|
|||||||
._*
|
._*
|
||||||
|
|
||||||
_start
|
_start
|
||||||
|
_temp_*/**/*
|
||||||
|
|||||||
Generated
+1
@@ -0,0 +1 @@
|
|||||||
|
Sonarr
|
||||||
Generated
+25
@@ -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>
|
||||||
Generated
+59
@@ -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>
|
||||||
Generated
+7
@@ -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>
|
||||||
Generated
+14
@@ -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>
|
||||||
Generated
+14
@@ -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>
|
||||||
Generated
+8
@@ -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>
|
||||||
Generated
+6
@@ -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>
|
||||||
@@ -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.
|
This contributor agreement ("Agreement") documents the rights granted by contributors to Us. To make this document effective, please complete the form below. This is a legally binding document, so please read it carefully before agreeing to it. The Agreement may cover more than one software project managed by Us.
|
||||||
|
|
||||||
## 1. Definitions ##
|
## 1. Definitions ##
|
||||||
|
|||||||
+7
-5
@@ -1,6 +1,6 @@
|
|||||||
# How to Contribute #
|
# 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.
|
||||||
|
|
||||||
## Documentation ##
|
## Documentation ##
|
||||||
Setup guides, FAQ, the more information we have on the wiki the better.
|
Setup guides, FAQ, the more information we have on the wiki the better.
|
||||||
@@ -15,15 +15,17 @@ Setup guides, FAQ, the more information we have on the wiki the better.
|
|||||||
|
|
||||||
### Getting started ###
|
### Getting started ###
|
||||||
|
|
||||||
1. Fork NzbDrone
|
1. Fork Sonarr
|
||||||
2. Clone (develop branch)
|
2. Clone (develop branch) *you may need pull in submodules separately if you client doesn't clone them automatically (CurlSharp)*
|
||||||
3. Run `npm install`
|
3. Run `npm install`
|
||||||
4. Run `gulp watch` - Used to compile the UI components and copy them (leave this window open)
|
4. Run `npm start` - Used to compile the UI components and copy them.
|
||||||
|
Leave this window open.
|
||||||
|
If you have gulp globally installed you can use `gulp watch` instead
|
||||||
5. Compile in Visual Studio
|
5. Compile in Visual Studio
|
||||||
|
|
||||||
### Contributing Code ###
|
### Contributing Code ###
|
||||||
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Sonarr/Sonarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first)
|
- If you're adding a new, already requested feature, please comment on [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
|
- Make meaningful commits, or squash them
|
||||||
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
|
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
|
||||||
- Reach out to us on the forums or on IRC if you have any questions
|
- Reach out to us on the forums or on IRC if you have any questions
|
||||||
|
|||||||
@@ -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>
|
|
||||||
@@ -1,260 +1 @@
|
|||||||
$msBuild = 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe'
|
Write-Warning "DEPRECATED -- Please use build.sh instead."
|
||||||
$outputFolder = '.\_output'
|
|
||||||
$outputFolderMono = '.\_output_mono'
|
|
||||||
$outputFolderOsx = '.\_output_osx'
|
|
||||||
$outputFolderOsxApp = '.\_output_osx_app'
|
|
||||||
$testPackageFolder = '.\_tests\'
|
|
||||||
$testSearchPattern = '*.Test\bin\x86\Release'
|
|
||||||
$sourceFolder = '.\src'
|
|
||||||
$updateFolder = $outputFolder + '\NzbDrone.Update'
|
|
||||||
$updateFolderMono = $outputFolderMono + '\NzbDrone.Update'
|
|
||||||
|
|
||||||
Function Build()
|
|
||||||
{
|
|
||||||
Write-Host "##teamcity[progressStart 'Build']"
|
|
||||||
|
|
||||||
$clean = $msbuild + " src\nzbdrone.sln /t:Clean /m"
|
|
||||||
$build = $msbuild + " src\nzbdrone.sln /p:Configuration=Release /p:Platform=x86 /t:Build /m"
|
|
||||||
|
|
||||||
if(Test-Path $outputFolder)
|
|
||||||
{
|
|
||||||
Remove-Item -Recurse -Force $outputFolder -ErrorAction Continue
|
|
||||||
}
|
|
||||||
|
|
||||||
Invoke-Expression $clean
|
|
||||||
CheckExitCode
|
|
||||||
|
|
||||||
Invoke-Expression $build
|
|
||||||
CheckExitCode
|
|
||||||
|
|
||||||
CleanFolder $outputFolder
|
|
||||||
|
|
||||||
AddJsonNet
|
|
||||||
|
|
||||||
Write-Host "Removing Mono.Posix.dll"
|
|
||||||
Remove-Item "$outputFolder\Mono.Posix.dll"
|
|
||||||
|
|
||||||
Write-Host "##teamcity[progressFinish 'Build']"
|
|
||||||
}
|
|
||||||
|
|
||||||
Function CleanFolder($path, $keepConfigFiles)
|
|
||||||
{
|
|
||||||
Write-Host Removing XMLDoc files
|
|
||||||
get-childitem $path -File -Filter *.xml -Recurse | foreach ($_) {
|
|
||||||
|
|
||||||
$filename = $_.FullName
|
|
||||||
$exeFilename = $filename -replace "xml", "exe"
|
|
||||||
$dllFilename = $filename -replace "xml", "dll"
|
|
||||||
|
|
||||||
if (Test-Path $exeFilename) {
|
|
||||||
remove-item $_.fullname
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Test-Path $dllFilename) {
|
|
||||||
remove-item $_.fullname
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get-childitem $path -File -Filter *.transform -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
if($keepConfigFiles -ne $true)
|
|
||||||
{
|
|
||||||
get-childitem $path -File -Filter *.dll.config -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host Removing FluentValidation.Resources files
|
|
||||||
get-childitem $path -File -Filter FluentValidation.resources.dll -recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
get-childitem $path -File -Filter app.config -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
Write-Host Removing .less files
|
|
||||||
get-childitem $path -File -Filter *.less -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
Write-Host Removing vshost files
|
|
||||||
get-childitem $path -File -Filter *.vshost.exe -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
if(Test-Path $$path\NuGet)
|
|
||||||
{
|
|
||||||
Write-Host Removing NuGet
|
|
||||||
Remove-Item -Recurse -Force "$path\NuGet"
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host Removing Empty folders
|
|
||||||
while (Get-ChildItem $path -recurse | where {!@(Get-ChildItem -force $_.fullname)} | Test-Path)
|
|
||||||
{
|
|
||||||
Get-ChildItem $path -Directory -recurse | where {!@(Get-ChildItem -force $_.fullname)} | Remove-Item
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Function PackageMono()
|
|
||||||
{
|
|
||||||
Write-Host "##teamcity[progressStart 'Creating Mono Package']"
|
|
||||||
|
|
||||||
if(Test-Path $outputFolderMono)
|
|
||||||
{
|
|
||||||
Remove-Item -Recurse -Force $outputFolderMono -ErrorAction Continue
|
|
||||||
}
|
|
||||||
|
|
||||||
Copy-Item $outputFolder $outputFolderMono -recurse
|
|
||||||
|
|
||||||
Write-Host Creating MDBs
|
|
||||||
get-childitem $outputFolderMono -File -Include @("*.exe", "*.dll") -Exclude @("MediaInfo.dll", "sqlite3.dll") -Recurse | foreach ($_) {
|
|
||||||
Write-Host "Creating .mdb for $_"
|
|
||||||
& "tools\pdb2mdb\pdb2mdb.exe" $_.fullname
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host Removing PDBs
|
|
||||||
get-childitem $outputFolderMono -File -Filter *.pdb -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
Write-Host Removing Service helpers
|
|
||||||
get-childitem $outputFolderMono -File -Filter ServiceUninstall.* -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
get-childitem $outputFolderMono -File -Filter ServiceInstall.* -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
Write-Host Removing native windows binaries Sqlite, MediaInfo
|
|
||||||
get-childitem $outputFolderMono -File -Filter sqlite3.* -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
get-childitem $outputFolderMono -File -Filter MediaInfo.* -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
Write-Host "Adding NzbDrone.Core.dll.config (for dllmap)"
|
|
||||||
Copy-Item "$sourceFolder\NzbDrone.Core\NzbDrone.Core.dll.config" $outputFolderMono
|
|
||||||
|
|
||||||
Write-Host "Adding CurlSharp.dll.config (for dllmap)"
|
|
||||||
Copy-Item "$sourceFolder\NzbDrone.Common\CurlSharp.dll.config" $outputFolderMono
|
|
||||||
|
|
||||||
Write-Host Renaming NzbDrone.Console.exe to NzbDrone.exe
|
|
||||||
Get-ChildItem $outputFolderMono -File -Filter "NzbDrone.exe*" -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
Write-Host Removing NzbDrone.Windows
|
|
||||||
get-childitem $outputFolderMono -File -Filter NzbDrone.Windows.* -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
Get-ChildItem $outputFolderMono -File -Filter "NzbDrone.Console.exe*" -Recurse | foreach ($_) {
|
|
||||||
$newName = $_.fullname -Replace ".Console",""
|
|
||||||
|
|
||||||
Rename-Item $_.fullname $newName
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host Adding NzbDrone.Mono to UpdatePackage
|
|
||||||
Copy-Item $outputFolderMono\* $updateFolderMono -Filter NzbDrone.Mono.*
|
|
||||||
|
|
||||||
Write-Host "##teamcity[progressFinish 'Creating Mono Package']"
|
|
||||||
}
|
|
||||||
|
|
||||||
Function PackageOsx()
|
|
||||||
{
|
|
||||||
Write-Host "##teamcity[progressStart 'Creating OS X Package']"
|
|
||||||
|
|
||||||
if(Test-Path $outputFolderOsx)
|
|
||||||
{
|
|
||||||
Remove-Item -Recurse -Force $outputFolderOsx -ErrorAction Continue
|
|
||||||
}
|
|
||||||
|
|
||||||
Copy-Item $outputFolderMono $outputFolderOsx -recurse
|
|
||||||
|
|
||||||
Write-Host "Adding sqlite dylibs"
|
|
||||||
Copy-Item "$sourceFolder\Libraries\sqlite\*.dylib" "$outputFolderOsx"
|
|
||||||
|
|
||||||
Write-Host "Adding MediaInfo dylib"
|
|
||||||
Copy-Item "$sourceFolder\Libraries\MediaInfo\*.dylib" "$outputFolderOsx"
|
|
||||||
|
|
||||||
Write-Host "Adding Startup script"
|
|
||||||
Copy-Item .\osx\Sonarr "$outputFolderOsx"
|
|
||||||
|
|
||||||
Write-Host "##teamcity[progressFinish 'Creating OS X Package']"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Function PackageOsxApp()
|
|
||||||
{
|
|
||||||
Write-Host "##teamcity[progressStart 'Creating OS X App Package']"
|
|
||||||
|
|
||||||
if(Test-Path $outputFolderOsxApp)
|
|
||||||
{
|
|
||||||
Remove-Item -Recurse -Force $outputFolderOsxApp -ErrorAction Continue
|
|
||||||
}
|
|
||||||
|
|
||||||
Copy-Item .\osx\Sonarr.app $outputFolderOsxApp\Sonarr.app -recurse
|
|
||||||
Copy-Item $outputFolderOsx $outputFolderOsxApp\Sonarr.app\Contents\MacOS -recurse
|
|
||||||
|
|
||||||
Write-Host "##teamcity[progressFinish 'Creating OS X App Package']"
|
|
||||||
}
|
|
||||||
|
|
||||||
Function AddJsonNet()
|
|
||||||
{
|
|
||||||
get-childitem $outputFolder -File -Filter Newtonsoft.Json.* -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
Copy-Item .\src\packages\Newtonsoft.Json.*.*\lib\net35\*.dll -Destination $outputFolder
|
|
||||||
Copy-Item .\src\packages\Newtonsoft.Json.*.*\lib\net35\*.dll -Destination $outputFolder\NzbDrone.Update
|
|
||||||
}
|
|
||||||
|
|
||||||
Function PackageTests()
|
|
||||||
{
|
|
||||||
|
|
||||||
Write-Host Packaging Tests
|
|
||||||
Write-Host "##teamcity[progressStart 'Creating Test Package']"
|
|
||||||
|
|
||||||
if(Test-Path $testPackageFolder)
|
|
||||||
{
|
|
||||||
Remove-Item -Recurse -Force $testPackageFolder -ErrorAction Continue
|
|
||||||
}
|
|
||||||
|
|
||||||
Get-ChildItem -Recurse -Directory | Where-Object {$_.FullName -like $testSearchPattern} | foreach($_){
|
|
||||||
Copy-Item -Recurse ($_.FullName + "\*") $testPackageFolder -ErrorAction Ignore
|
|
||||||
}
|
|
||||||
|
|
||||||
.\src\.nuget\NuGet.exe install NUnit.Runners -Version 2.6.1 -Output $testPackageFolder
|
|
||||||
|
|
||||||
Copy-Item $outputFolder\*.dll -Destination $testPackageFolder -Force
|
|
||||||
Copy-Item $outputFolder\*.pdb -Destination $testPackageFolder -Force
|
|
||||||
Copy-Item .\*.sh -Destination $testPackageFolder -Force
|
|
||||||
|
|
||||||
Write-Host Creating MDBs for tests
|
|
||||||
get-childitem $testPackageFolder -File -Include @("*.exe", "*.dll") -Exclude @("MediaInfo.dll", "sqlite3.dll") -Recurse | foreach ($_) {
|
|
||||||
Write-Host "Creating .mdb for $_"
|
|
||||||
& "tools\pdb2mdb\pdb2mdb.exe" $_.fullname
|
|
||||||
}
|
|
||||||
|
|
||||||
get-childitem $testPackageFolder -File -Filter *log.config | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
CleanFolder $testPackageFolder $true
|
|
||||||
|
|
||||||
Write-Host "Adding NzbDrone.Core.dll.config (for dllmap)"
|
|
||||||
Copy-Item "$sourceFolder\NzbDrone.Core\NzbDrone.Core.dll.config" -Destination $testPackageFolder -Force
|
|
||||||
|
|
||||||
Write-Host "##teamcity[progressFinish 'Creating Test Package']"
|
|
||||||
}
|
|
||||||
|
|
||||||
Function RunGulp()
|
|
||||||
{
|
|
||||||
Write-Host "##teamcity[progressStart 'Running Gulp']"
|
|
||||||
Invoke-Expression 'npm install'
|
|
||||||
CheckExitCode
|
|
||||||
|
|
||||||
Invoke-Expression 'gulp build' -ErrorAction Continue -Verbose
|
|
||||||
CheckExitCode
|
|
||||||
|
|
||||||
Write-Host "##teamcity[progressFinish 'Running Gulp']"
|
|
||||||
}
|
|
||||||
|
|
||||||
Function CheckExitCode()
|
|
||||||
{
|
|
||||||
if ($lastexitcode -ne 0)
|
|
||||||
{
|
|
||||||
Write-Host $errorMessage
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Function CleanupWindowsPackage()
|
|
||||||
{
|
|
||||||
Write-Host Removing NzbDrone.Mono
|
|
||||||
get-childitem $outputFolder -File -Filter NzbDrone.Mono.* -Recurse | foreach ($_) {remove-item $_.fullname}
|
|
||||||
|
|
||||||
Write-Host Adding NzbDrone.Windows to UpdatePackage
|
|
||||||
Copy-Item $outputFolder\* $updateFolder -Filter NzbDrone.Windows.*
|
|
||||||
}
|
|
||||||
|
|
||||||
Build
|
|
||||||
RunGulp
|
|
||||||
PackageMono
|
|
||||||
PackageOsx
|
|
||||||
PackageOsxApp
|
|
||||||
PackageTests
|
|
||||||
CleanupWindowsPackage
|
|
||||||
@@ -0,0 +1,265 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
msBuild='/c/Program Files (x86)/MSBuild/14.0/Bin'
|
||||||
|
outputFolder='./_output'
|
||||||
|
outputFolderMono='./_output_mono'
|
||||||
|
outputFolderOsx='./_output_osx'
|
||||||
|
outputFolderOsxApp='./_output_osx_app'
|
||||||
|
testPackageFolder='./_tests/'
|
||||||
|
testSearchPattern='*.Test/bin/x86/Release'
|
||||||
|
sourceFolder='./src'
|
||||||
|
slnFile=$sourceFolder/NzbDrone.sln
|
||||||
|
updateFolder=$outputFolder/NzbDrone.Update
|
||||||
|
updateFolderMono=$outputFolderMono/NzbDrone.Update
|
||||||
|
|
||||||
|
nuget='tools/nuget/nuget.exe';
|
||||||
|
CheckExitCode()
|
||||||
|
{
|
||||||
|
"$@"
|
||||||
|
local status=$?
|
||||||
|
if [ $status -ne 0 ]; then
|
||||||
|
echo "error with $1" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
return $status
|
||||||
|
}
|
||||||
|
|
||||||
|
CleanFolder()
|
||||||
|
{
|
||||||
|
local path=$1
|
||||||
|
local keepConfigFiles=$2
|
||||||
|
|
||||||
|
|
||||||
|
find $path -name "*.transform" -exec rm "{}" \;
|
||||||
|
|
||||||
|
if [ $keepConfigFiles != true ] ; then
|
||||||
|
find $path -name "*.dll.config" -exec rm "{}" \;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Removing FluentValidation.Resources files"
|
||||||
|
find $path -name "FluentValidation.resources.dll" -exec rm "{}" \;
|
||||||
|
find $path -name "App.config" -exec rm "{}" \;
|
||||||
|
|
||||||
|
echo "Removing .less files"
|
||||||
|
find $path -name "*.less" -exec rm "{}" \;
|
||||||
|
|
||||||
|
echo "Removing vshost files"
|
||||||
|
find $path -name "*.vshost.exe" -exec rm "{}" \;
|
||||||
|
|
||||||
|
echo "Removing dylib files"
|
||||||
|
find $path -name "*.dylib" -exec rm "{}" \;
|
||||||
|
|
||||||
|
echo "Removing Empty folders"
|
||||||
|
find $path -depth -empty -type d -exec rm -r "{}" \;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AddJsonNet()
|
||||||
|
{
|
||||||
|
rm $outputFolder/Newtonsoft.Json.*
|
||||||
|
cp $sourceFolder/packages/Newtonsoft.Json.*/lib/net35/*.dll $outputFolder
|
||||||
|
cp $sourceFolder/packages/Newtonsoft.Json.*/lib/net35/*.dll $outputFolder/NzbDrone.Update
|
||||||
|
}
|
||||||
|
|
||||||
|
BuildWithMSBuild()
|
||||||
|
{
|
||||||
|
export PATH=$msBuild:$PATH
|
||||||
|
CheckExitCode MSBuild.exe $slnFile //t:Clean //m
|
||||||
|
$nuget restore $slnFile
|
||||||
|
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb
|
||||||
|
}
|
||||||
|
|
||||||
|
BuildWithXbuild()
|
||||||
|
{
|
||||||
|
export MONO_IOMAP=case
|
||||||
|
CheckExitCode xbuild /t:Clean $slnFile
|
||||||
|
mono $nuget restore $slnFile
|
||||||
|
CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile
|
||||||
|
}
|
||||||
|
|
||||||
|
Build()
|
||||||
|
{
|
||||||
|
echo "##teamcity[progressStart 'Build']"
|
||||||
|
|
||||||
|
rm -rf $outputFolder
|
||||||
|
|
||||||
|
if [ $runtime = "dotnet" ] ; then
|
||||||
|
BuildWithMSBuild
|
||||||
|
else
|
||||||
|
BuildWithXbuild
|
||||||
|
fi
|
||||||
|
|
||||||
|
CleanFolder $outputFolder false
|
||||||
|
|
||||||
|
AddJsonNet
|
||||||
|
|
||||||
|
echo "Removing Mono.Posix.dll"
|
||||||
|
rm $outputFolder/Mono.Posix.dll
|
||||||
|
|
||||||
|
echo "##teamcity[progressFinish 'Build']"
|
||||||
|
}
|
||||||
|
|
||||||
|
RunGulp()
|
||||||
|
{
|
||||||
|
echo "##teamcity[progressStart 'npm install']"
|
||||||
|
npm-cache install npm || CheckExitCode npm install
|
||||||
|
echo "##teamcity[progressFinish 'npm install']"
|
||||||
|
|
||||||
|
echo "##teamcity[progressStart 'Running gulp']"
|
||||||
|
CheckExitCode npm run build
|
||||||
|
echo "##teamcity[progressFinish 'Running gulp']"
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateMdbs()
|
||||||
|
{
|
||||||
|
local path=$1
|
||||||
|
if [ $runtime = "dotnet" ] ; then
|
||||||
|
local pdbFiles=( $(find $path -name "*.pdb") )
|
||||||
|
for filename in "${pdbFiles[@]}"
|
||||||
|
do
|
||||||
|
if [ -e ${filename%.pdb}.dll ] ; then
|
||||||
|
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.dll
|
||||||
|
fi
|
||||||
|
if [ -e ${filename%.pdb}.exe ] ; then
|
||||||
|
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.exe
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
PackageMono()
|
||||||
|
{
|
||||||
|
echo "##teamcity[progressStart 'Creating Mono Package']"
|
||||||
|
rm -rf $outputFolderMono
|
||||||
|
cp -r $outputFolder $outputFolderMono
|
||||||
|
|
||||||
|
echo "Creating MDBs"
|
||||||
|
CreateMdbs $outputFolderMono
|
||||||
|
|
||||||
|
echo "Removing PDBs"
|
||||||
|
find $outputFolderMono -name "*.pdb" -exec rm "{}" \;
|
||||||
|
|
||||||
|
echo "Removing Service helpers"
|
||||||
|
rm -f $outputFolderMono/ServiceUninstall.*
|
||||||
|
rm -f $outputFolderMono/ServiceInstall.*
|
||||||
|
|
||||||
|
echo "Removing native windows binaries Sqlite, MediaInfo"
|
||||||
|
rm -f $outputFolderMono/sqlite3.*
|
||||||
|
rm -f $outputFolderMono/MediaInfo.*
|
||||||
|
|
||||||
|
echo "Adding NzbDrone.Core.dll.config (for dllmap)"
|
||||||
|
cp $sourceFolder/NzbDrone.Core/NzbDrone.Core.dll.config $outputFolderMono
|
||||||
|
|
||||||
|
echo "Adding CurlSharp.dll.config (for dllmap)"
|
||||||
|
cp $sourceFolder/NzbDrone.Common/CurlSharp.dll.config $outputFolderMono
|
||||||
|
|
||||||
|
echo "Renaming NzbDrone.Console.exe to NzbDrone.exe"
|
||||||
|
rm $outputFolderMono/NzbDrone.exe*
|
||||||
|
for file in $outputFolderMono/NzbDrone.Console.exe*; do
|
||||||
|
mv "$file" "${file//.Console/}"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Removing NzbDrone.Windows"
|
||||||
|
rm $outputFolderMono/NzbDrone.Windows.*
|
||||||
|
|
||||||
|
echo "Adding NzbDrone.Mono to UpdatePackage"
|
||||||
|
cp $outputFolderMono/NzbDrone.Mono.* $updateFolderMono
|
||||||
|
|
||||||
|
echo "##teamcity[progressFinish 'Creating Mono Package']"
|
||||||
|
}
|
||||||
|
|
||||||
|
PackageOsx()
|
||||||
|
{
|
||||||
|
echo "##teamcity[progressStart 'Creating OS X Package']"
|
||||||
|
rm -rf $outputFolderOsx
|
||||||
|
cp -r $outputFolderMono $outputFolderOsx
|
||||||
|
|
||||||
|
echo "Adding sqlite dylibs"
|
||||||
|
cp $sourceFolder/Libraries/Sqlite/*.dylib $outputFolderOsx
|
||||||
|
|
||||||
|
echo "Adding MediaInfo dylib"
|
||||||
|
cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderOsx
|
||||||
|
|
||||||
|
echo "Adding Startup script"
|
||||||
|
cp ./osx/Sonarr $outputFolderOsx
|
||||||
|
|
||||||
|
echo "##teamcity[progressFinish 'Creating OS X Package']"
|
||||||
|
}
|
||||||
|
|
||||||
|
PackageOsxApp()
|
||||||
|
{
|
||||||
|
echo "##teamcity[progressStart 'Creating OS X App Package']"
|
||||||
|
rm -rf $outputFolderOsxApp
|
||||||
|
mkdir $outputFolderOsxApp
|
||||||
|
|
||||||
|
cp -r ./osx/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 $sourceFolder -path $testSearchPattern -exec cp -r -u -T "{}" $testPackageFolder \;
|
||||||
|
|
||||||
|
if [ $runtime = "dotnet" ] ; then
|
||||||
|
$nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
|
||||||
|
else
|
||||||
|
mono $nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp $outputFolder/*.dll $testPackageFolder
|
||||||
|
cp ./*.sh $testPackageFolder
|
||||||
|
|
||||||
|
echo "Creating MDBs for tests"
|
||||||
|
CreateMdbs $testPackageFolder
|
||||||
|
|
||||||
|
rm -f $testPackageFolder/*.log.config
|
||||||
|
|
||||||
|
CleanFolder $testPackageFolder true
|
||||||
|
|
||||||
|
echo "Adding NzbDrone.Core.dll.config (for dllmap)"
|
||||||
|
cp $sourceFolder/NzbDrone.Core/NzbDrone.Core.dll.config $testPackageFolder
|
||||||
|
|
||||||
|
echo "Adding CurlSharp.dll.config (for dllmap)"
|
||||||
|
cp $sourceFolder/NzbDrone.Common/CurlSharp.dll.config $testPackageFolder
|
||||||
|
|
||||||
|
echo "Copying CurlSharp libraries"
|
||||||
|
cp $sourceFolder/ExternalModules/CurlSharp/libs/i386/* $testPackageFolder
|
||||||
|
|
||||||
|
echo "##teamcity[progressFinish 'Creating Test Package']"
|
||||||
|
}
|
||||||
|
|
||||||
|
CleanupWindowsPackage()
|
||||||
|
{
|
||||||
|
echo "Removing NzbDrone.Mono"
|
||||||
|
rm -f $outputFolder/NzbDrone.Mono.*
|
||||||
|
|
||||||
|
echo "Adding NzbDrone.Windows to UpdatePackage"
|
||||||
|
cp $outputFolder/NzbDrone.Windows.* $updateFolder
|
||||||
|
}
|
||||||
|
|
||||||
|
# Use mono or .net depending on OS
|
||||||
|
case "$(uname -s)" in
|
||||||
|
CYGWIN*|MINGW32*|MINGW64*|MSYS*)
|
||||||
|
# on windows, use dotnet
|
||||||
|
runtime="dotnet"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# otherwise use mono
|
||||||
|
runtime="mono"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
Build
|
||||||
|
RunGulp
|
||||||
|
PackageMono
|
||||||
|
PackageOsx
|
||||||
|
PackageOsxApp
|
||||||
|
PackageTests
|
||||||
|
CleanupWindowsPackage
|
||||||
@@ -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
|
|
||||||
Vendored
+1
-1
@@ -3,7 +3,7 @@ Upstream-Name: nzbdrone
|
|||||||
Source: https://github.com/Sonarr/Sonarr
|
Source: https://github.com/Sonarr/Sonarr
|
||||||
|
|
||||||
Files: *
|
Files: *
|
||||||
Copyright: 2010-2014 Sonarr <hello@sonarr.tv>
|
Copyright: 2010-2016 Sonarr <hello@sonarr.tv>
|
||||||
|
|
||||||
License: GPL-3.0+
|
License: GPL-3.0+
|
||||||
|
|
||||||
|
|||||||
+9
-3
@@ -6,7 +6,13 @@ require('./less');
|
|||||||
require('./handlebars');
|
require('./handlebars');
|
||||||
require('./copy');
|
require('./copy');
|
||||||
|
|
||||||
gulp.task('build', function () {
|
gulp.task('build', function() {
|
||||||
return runSequence('clean',
|
return runSequence('clean', [
|
||||||
['webpack', 'less', 'handlebars', 'copyHtml', 'copyContent', 'copyJs']);
|
'webpack',
|
||||||
|
'less',
|
||||||
|
'handlebars',
|
||||||
|
'copyHtml',
|
||||||
|
'copyContent',
|
||||||
|
'copyJs'
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
|
|||||||
+2
-2
@@ -3,6 +3,6 @@ var del = require('del');
|
|||||||
|
|
||||||
var paths = require('./paths');
|
var paths = require('./paths');
|
||||||
|
|
||||||
gulp.task('clean', function (cb) {
|
gulp.task('clean', function(cb) {
|
||||||
del([paths.dest.root], cb);
|
del([paths.dest.root], cb);
|
||||||
});
|
});
|
||||||
|
|||||||
+17
-13
@@ -1,27 +1,31 @@
|
|||||||
var gulp = require('gulp');
|
var gulp = require('gulp');
|
||||||
var print = require('gulp-print');
|
var print = require('gulp-print');
|
||||||
var cache = require('gulp-cached');
|
var cache = require('gulp-cached');
|
||||||
|
var livereload = require('gulp-livereload');
|
||||||
|
|
||||||
var paths = require('./paths.js');
|
var paths = require('./paths.js');
|
||||||
|
|
||||||
gulp.task('copyJs', function () {
|
gulp.task('copyJs', function () {
|
||||||
return gulp.src(
|
return gulp.src(
|
||||||
[
|
[
|
||||||
paths.src.root + "polyfills.js",
|
paths.src.root + 'polyfills.js',
|
||||||
paths.src.root + "JsLibraries/handlebars.runtime.js",
|
paths.src.root + 'JsLibraries/handlebars.runtime.js'
|
||||||
])
|
])
|
||||||
.pipe(cache('copyJs'))
|
.pipe(cache('copyJs'))
|
||||||
.pipe(print())
|
.pipe(print())
|
||||||
.pipe(gulp.dest(paths.dest.root));
|
.pipe(gulp.dest(paths.dest.root))
|
||||||
|
.pipe(livereload());
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('copyHtml', function () {
|
gulp.task('copyHtml', function () {
|
||||||
return gulp.src(paths.src.html)
|
return gulp.src(paths.src.html)
|
||||||
.pipe(cache('copyHtml'))
|
.pipe(cache('copyHtml'))
|
||||||
.pipe(gulp.dest(paths.dest.root));
|
.pipe(gulp.dest(paths.dest.root))
|
||||||
|
.pipe(livereload());
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('copyContent', function () {
|
gulp.task('copyContent', function () {
|
||||||
return gulp.src([paths.src.content + '**/*.*', '!**/*.less'])
|
return gulp.src([paths.src.content + '**/*.*', '!**/*.less'])
|
||||||
.pipe(gulp.dest(paths.dest.content));
|
.pipe(gulp.dest(paths.dest.content))
|
||||||
|
.pipe(livereload());
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
onError:function (error) {
|
onError : function(error) {
|
||||||
//If you want details of the error in the console
|
//If you want details of the error in the console
|
||||||
console.log(error.toString());
|
console.log(error.toString());
|
||||||
this.emit('end');
|
this.emit('end');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
+16
-13
@@ -3,21 +3,25 @@ var handlebars = require('gulp-handlebars');
|
|||||||
var declare = require('gulp-declare');
|
var declare = require('gulp-declare');
|
||||||
var concat = require('gulp-concat');
|
var concat = require('gulp-concat');
|
||||||
var wrap = require("gulp-wrap");
|
var wrap = require("gulp-wrap");
|
||||||
|
var livereload = require('gulp-livereload');
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var streamqueue = require('streamqueue');
|
var streamqueue = require('streamqueue');
|
||||||
var stripbom = require('gulp-stripbom');
|
var stripbom = require('gulp-stripbom');
|
||||||
|
|
||||||
var paths = require('./paths.js');
|
var paths = require('./paths.js');
|
||||||
|
|
||||||
gulp.task('handlebars', function () {
|
gulp.task('handlebars', function() {
|
||||||
|
|
||||||
var coreStream = gulp.src([paths.src.templates, '!*/**/*Partial.*'])
|
var coreStream = gulp.src([
|
||||||
.pipe(stripbom({ showLog: false }))
|
paths.src.templates,
|
||||||
|
'!*/**/*Partial.*'
|
||||||
|
])
|
||||||
|
.pipe(stripbom({ showLog : false }))
|
||||||
.pipe(handlebars())
|
.pipe(handlebars())
|
||||||
.pipe(declare({
|
.pipe(declare({
|
||||||
namespace: 'T',
|
namespace : 'T',
|
||||||
noRedeclare: true,
|
noRedeclare : true,
|
||||||
processName: function (filePath) {
|
processName : function(filePath) {
|
||||||
|
|
||||||
filePath = path.relative(paths.src.root, filePath);
|
filePath = path.relative(paths.src.root, filePath);
|
||||||
|
|
||||||
@@ -29,12 +33,12 @@ gulp.task('handlebars', function () {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
var partialStream = gulp.src([paths.src.partials])
|
var partialStream = gulp.src([paths.src.partials])
|
||||||
.pipe(stripbom({ showLog: false }))
|
.pipe(stripbom({ showLog : false }))
|
||||||
.pipe(handlebars())
|
.pipe(handlebars())
|
||||||
.pipe(wrap('Handlebars.template(<%= contents %>)'))
|
.pipe(wrap('Handlebars.template(<%= contents %>)'))
|
||||||
.pipe(wrap('Handlebars.registerPartial(<%= processPartialName(file.relative) %>, <%= contents %>)', {}, {
|
.pipe(wrap('Handlebars.registerPartial(<%= processPartialName(file.relative) %>, <%= contents %>)', {}, {
|
||||||
imports: {
|
imports : {
|
||||||
processPartialName: function (fileName) {
|
processPartialName : function(fileName) {
|
||||||
return JSON.stringify(
|
return JSON.stringify(
|
||||||
path.basename(fileName, '.js')
|
path.basename(fileName, '.js')
|
||||||
);
|
);
|
||||||
@@ -42,11 +46,10 @@ gulp.task('handlebars', function () {
|
|||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
return streamqueue({ objectMode : true },
|
||||||
return streamqueue({ objectMode: true },
|
|
||||||
partialStream,
|
partialStream,
|
||||||
coreStream
|
coreStream
|
||||||
).pipe(concat('templates.js'))
|
).pipe(concat('templates.js'))
|
||||||
|
.pipe(gulp.dest(paths.dest.root))
|
||||||
.pipe(gulp.dest(paths.dest.root));
|
.pipe(livereload());
|
||||||
});
|
});
|
||||||
|
|||||||
+4
-5
@@ -2,14 +2,13 @@ var gulp = require('gulp');
|
|||||||
var print = require('gulp-print');
|
var print = require('gulp-print');
|
||||||
var paths = require('./paths.js');
|
var paths = require('./paths.js');
|
||||||
|
|
||||||
|
gulp.task('imageMin', function() {
|
||||||
gulp.task('imageMin', function () {
|
|
||||||
var imagemin = require('gulp-imagemin');
|
var imagemin = require('gulp-imagemin');
|
||||||
return gulp.src(paths.src.images)
|
return gulp.src(paths.src.images)
|
||||||
.pipe(imagemin({
|
.pipe(imagemin({
|
||||||
progressive: false,
|
progressive : false,
|
||||||
optimizationLevel :4,
|
optimizationLevel : 4,
|
||||||
svgoPlugins: [{removeViewBox: false}]
|
svgoPlugins : [{ removeViewBox : false }]
|
||||||
}))
|
}))
|
||||||
.pipe(print())
|
.pipe(print())
|
||||||
.pipe(gulp.dest(paths.src.content + 'Images/'));
|
.pipe(gulp.dest(paths.src.content + 'Images/'));
|
||||||
|
|||||||
+5
-3
@@ -4,9 +4,11 @@ var stylish = require('jshint-stylish');
|
|||||||
var cache = require('gulp-cached');
|
var cache = require('gulp-cached');
|
||||||
var paths = require('./paths.js');
|
var paths = require('./paths.js');
|
||||||
|
|
||||||
|
gulp.task('jshint', function() {
|
||||||
gulp.task('jshint', function () {
|
return gulp.src([
|
||||||
return gulp.src([paths.src.scripts, paths.src.exclude.libs])
|
paths.src.scripts,
|
||||||
|
paths.src.exclude.libs
|
||||||
|
])
|
||||||
.pipe(cache('jshint'))
|
.pipe(cache('jshint'))
|
||||||
.pipe(jshint())
|
.pipe(jshint())
|
||||||
.pipe(jshint.reporter(stylish));
|
.pipe(jshint.reporter(stylish));
|
||||||
|
|||||||
+36
-24
@@ -1,34 +1,46 @@
|
|||||||
var gulp = require('gulp');
|
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 paths = require('./paths');
|
var paths = require('./paths');
|
||||||
var errorHandler = require('./errorHandler');
|
var errorHandler = require('./errorHandler');
|
||||||
|
|
||||||
gulp.task('less', function () {
|
gulp.task('less', function() {
|
||||||
return gulp.src([
|
|
||||||
paths.src.content + 'bootstrap.less',
|
var src = [
|
||||||
paths.src.content + 'theme.less',
|
paths.src.content + 'bootstrap.less',
|
||||||
paths.src.content + 'overrides.less',
|
paths.src.content + 'theme.less',
|
||||||
paths.src.root + 'Series/series.less',
|
paths.src.content + 'overrides.less',
|
||||||
paths.src.root + 'Activity/activity.less',
|
paths.src.root + 'Series/series.less',
|
||||||
paths.src.root + 'AddSeries/addSeries.less',
|
paths.src.root + 'Activity/activity.less',
|
||||||
paths.src.root + 'Calendar/calendar.less',
|
paths.src.root + 'AddSeries/addSeries.less',
|
||||||
paths.src.root + 'Cells/cells.less',
|
paths.src.root + 'Calendar/calendar.less',
|
||||||
paths.src.root + 'ManualImport/manualimport.less',
|
paths.src.root + 'Cells/cells.less',
|
||||||
paths.src.root + 'Settings/settings.less',
|
paths.src.root + 'ManualImport/manualimport.less',
|
||||||
paths.src.root + 'System/Logs/logs.less',
|
paths.src.root + 'Settings/settings.less',
|
||||||
paths.src.root + 'System/Update/update.less',
|
paths.src.root + 'System/Logs/logs.less',
|
||||||
paths.src.root + 'System/Info/info.less',
|
paths.src.root + 'System/Update/update.less',
|
||||||
])
|
paths.src.root + 'System/Info/info.less'
|
||||||
|
];
|
||||||
|
|
||||||
|
return gulp.src(src)
|
||||||
.pipe(print())
|
.pipe(print())
|
||||||
|
.pipe(sourcemaps.init())
|
||||||
.pipe(less({
|
.pipe(less({
|
||||||
dumpLineNumbers: 'false',
|
dumpLineNumbers : 'false',
|
||||||
compress: true,
|
compress : true,
|
||||||
yuicompress: true,
|
yuicompress : true,
|
||||||
ieCompat: true,
|
ieCompat : true,
|
||||||
strictImports: true
|
strictImports : true
|
||||||
}))
|
}))
|
||||||
|
.pipe(postcss([ autoprefixer({ browsers: ['last 2 versions'] }) ]))
|
||||||
.on('error', errorHandler.onError)
|
.on('error', errorHandler.onError)
|
||||||
.pipe(gulp.dest(paths.dest.content));
|
.pipe(sourcemaps.write(paths.dest.content))
|
||||||
|
.pipe(gulp.dest(paths.dest.content))
|
||||||
|
.pipe(livereload());
|
||||||
});
|
});
|
||||||
|
|||||||
+16
-40
@@ -1,45 +1,21 @@
|
|||||||
var phantom = require('./phantom');
|
|
||||||
|
|
||||||
var paths = {
|
var paths = {
|
||||||
src: {
|
src : {
|
||||||
root: './src/UI/',
|
root : './src/UI/',
|
||||||
templates: './src/UI/**/*.hbs',
|
templates : './src/UI/**/*.hbs',
|
||||||
html: './src/UI/*.html',
|
html : './src/UI/*.html',
|
||||||
partials: './src/UI/**/*Partial.hbs',
|
partials : './src/UI/**/*Partial.hbs',
|
||||||
scripts: './src/UI/**/*.js',
|
scripts : './src/UI/**/*.js',
|
||||||
less: ['./src/UI/**/*.less'],
|
less : ['./src/UI/**/*.less'],
|
||||||
content: './src/UI/Content/',
|
content : './src/UI/Content/',
|
||||||
images: './src/UI/Content/Images/**/*',
|
images : './src/UI/Content/Images/**/*',
|
||||||
exclude: {
|
exclude : {
|
||||||
libs: '!./src/UI/JsLibraries/**'
|
libs : '!./src/UI/JsLibraries/**'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dest : {
|
||||||
|
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/'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = paths;
|
module.exports = paths;
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
// Switch to phantom.
|
|
||||||
// Example:
|
|
||||||
// gulp --phantom
|
|
||||||
|
|
||||||
var phantom = false;
|
|
||||||
process.argv.forEach(function (val, index, array) {
|
|
||||||
if(val=== '--phantom'){
|
|
||||||
phantom = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = phantom;
|
|
||||||
+1
-1
@@ -84,7 +84,7 @@ gulp.task('getSonarr', function () {
|
|||||||
download(package.url, packagePath, function () {
|
download(package.url, packagePath, function () {
|
||||||
extract(packagePath, dirName, function () {
|
extract(packagePath, dirName, function () {
|
||||||
// clean old binaries
|
// clean old binaries
|
||||||
console.log('Cleaning old binaries')
|
console.log('Cleaning old binaries');
|
||||||
del.sync(['./_output/*', '!./_output/UI/']);
|
del.sync(['./_output/*', '!./_output/UI/']);
|
||||||
console.log('copying binaries to target');
|
console.log('copying binaries to target');
|
||||||
gulp.src(dirName + '/NzbDrone/*.*')
|
gulp.src(dirName + '/NzbDrone/*.*')
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ var stripBom = function (dest) {
|
|||||||
.pipe(stripbom({ showLog: false }))
|
.pipe(stripbom({ showLog: false }))
|
||||||
.pipe(gulp.dest(dest));
|
.pipe(gulp.dest(dest));
|
||||||
|
|
||||||
|
gulp.src(paths.src.less)
|
||||||
|
.pipe(stripbom({ showLog: false }))
|
||||||
|
.pipe(gulp.dest(dest));
|
||||||
|
|
||||||
gulp.src(paths.src.templates)
|
gulp.src(paths.src.templates)
|
||||||
.pipe(stripbom({ showLog: false }))
|
.pipe(stripbom({ showLog: false }))
|
||||||
.pipe(gulp.dest(dest));
|
.pipe(gulp.dest(dest));
|
||||||
|
|||||||
+10
-23
@@ -1,6 +1,5 @@
|
|||||||
var gulp = require('gulp');
|
var gulp = require('gulp');
|
||||||
//var livereload = require('gulp-livereload');
|
var livereload = require('gulp-livereload');
|
||||||
|
|
||||||
|
|
||||||
var paths = require('./paths.js');
|
var paths = require('./paths.js');
|
||||||
|
|
||||||
@@ -10,24 +9,12 @@ require('./less.js');
|
|||||||
require('./copy.js');
|
require('./copy.js');
|
||||||
require('./webpack.js');
|
require('./webpack.js');
|
||||||
|
|
||||||
|
gulp.task('watch', ['jshint', 'handlebars', 'less', 'copyHtml', 'copyContent', 'copyJs'], function () {
|
||||||
gulp.task('watch', ['jshint', 'handlebars', 'less','copyHtml', 'copyContent','copyJs'], function () {
|
livereload.listen();
|
||||||
gulp.start('webpackWatch');
|
gulp.start('webpackWatch');
|
||||||
gulp.watch([paths.src.scripts, paths.src.exclude.libs], ['jshint','copyJs']);
|
gulp.watch([paths.src.scripts, paths.src.exclude.libs], ['jshint', 'copyJs']);
|
||||||
gulp.watch(paths.src.templates, ['handlebars']);
|
gulp.watch(paths.src.templates, ['handlebars']);
|
||||||
gulp.watch([paths.src.less, paths.src.exclude.libs], ['less']);
|
gulp.watch([paths.src.less, paths.src.exclude.libs], ['less']);
|
||||||
gulp.watch([paths.src.html], ['copyHtml']);
|
gulp.watch([paths.src.html], ['copyHtml']);
|
||||||
gulp.watch([paths.src.content + '**/*.*', '!**/*.less'], ['copyContent']);
|
gulp.watch([paths.src.content + '**/*.*', '!**/*.less'], ['copyContent']);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('liveReload', ['jshint', 'handlebars', 'less', 'webPack'], function () {
|
|
||||||
var server = livereload();
|
|
||||||
gulp.watch([
|
|
||||||
'app/**/*.js',
|
|
||||||
'app/**/*.css',
|
|
||||||
'app/index.html',
|
|
||||||
'app/login.html'
|
|
||||||
]).on('change', function (file) {
|
|
||||||
server.changed(file.path);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
+5
-12
@@ -1,20 +1,13 @@
|
|||||||
var gulp = require('gulp');
|
var gulp = require('gulp');
|
||||||
|
var webpackStream = require('webpack-stream');
|
||||||
var gulpWebpack = require('gulp-webpack');
|
var livereload = require('gulp-livereload');
|
||||||
var webpack = require('webpack');
|
|
||||||
var webpackConfig = require('../webpack.config');
|
var webpackConfig = require('../webpack.config');
|
||||||
|
|
||||||
webpackConfig.devtool = "#source-map";
|
|
||||||
|
|
||||||
gulp.task('webpack', function() {
|
gulp.task('webpack', function() {
|
||||||
return gulp.src('main.js')
|
return gulp.src('main.js').pipe(webpackStream(webpackConfig)).pipe(gulp.dest(''));
|
||||||
.pipe(gulpWebpack(webpackConfig, webpack))
|
|
||||||
.pipe(gulp.dest(''));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('webpackWatch', function() {
|
gulp.task('webpackWatch', function() {
|
||||||
webpackConfig.watch = true;
|
webpackConfig.watch = true;
|
||||||
return gulp.src('main.js')
|
return gulp.src('main.js').pipe(webpackStream(webpackConfig)).pipe(gulp.dest('')).pipe(livereload());
|
||||||
.pipe(gulpWebpack(webpackConfig, webpack))
|
|
||||||
.pipe(gulp.dest(''));
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
EXCLUDE="-exclude:Windows -include:IntegrationTest"
|
|
||||||
TESTDIR="."
|
|
||||||
NUNIT="$TESTDIR/NUnit.Runners.2.6.1/tools/nunit-console-x86.exe"
|
|
||||||
|
|
||||||
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Api.Result.xml $TESTDIR/NzbDrone.Api.Test.dll
|
|
||||||
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Core.Result.xml $TESTDIR/NzbDrone.Core.Test.dll
|
|
||||||
mono --debug --runtime=v4.0 $NUNIT $EXCLUDE -xml:NzbDrone.Integration.Result.xml $TESTDIR/NzbDrone.Integration.Test.dll
|
|
||||||
+23
-6
@@ -1,17 +1,31 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
#get the bundle's MacOS directory full path
|
#get the bundle's MacOS directory full path
|
||||||
DIR=$(cd "$(dirname "$0")"; pwd)
|
DIR=$(cd "$(dirname "$0")"; pwd)
|
||||||
|
|
||||||
#change these values to match your app
|
#change these values to match your app
|
||||||
EXE_PATH="$DIR/NzbDrone.exe"
|
EXE_PATH="$DIR/NzbDrone.exe"
|
||||||
APPNAME="Sonarr"
|
APPNAME="Sonarr"
|
||||||
|
|
||||||
#set up environment
|
#set up environment
|
||||||
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
|
if [[ -x '/opt/local/bin/mono' ]]; then
|
||||||
export DYLD_FALLBACK_LIBRARY_PATH="$DIR:$MONO_FRAMEWORK_PATH/lib:/lib:/usr/lib"
|
export PATH="/opt/local/bin:$PATH"
|
||||||
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
|
fi
|
||||||
|
|
||||||
|
export DYLD_FALLBACK_LIBRARY_PATH="$DIR"
|
||||||
|
|
||||||
|
if [ -e /Library/Frameworks/Mono.framework ]; then
|
||||||
|
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
|
||||||
|
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
|
||||||
|
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$MONO_FRAMEWORK_PATH/lib"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -f '/opt/local/lib/libsqlite3.0.dylib' ]]; then
|
||||||
|
export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$HOME/lib:/usr/local/lib:/lib:/usr/lib"
|
||||||
|
|
||||||
#mono version check
|
#mono version check
|
||||||
REQUIRED_MAJOR=3
|
REQUIRED_MAJOR=3
|
||||||
REQUIRED_MINOR=10
|
REQUIRED_MINOR=10
|
||||||
@@ -21,6 +35,9 @@ VERSION_MSG="$APPNAME requires Mono Runtime Environment(MRE) $REQUIRED_MAJOR.$RE
|
|||||||
DOWNLOAD_URL="http://www.mono-project.com/download/#download-mac"
|
DOWNLOAD_URL="http://www.mono-project.com/download/#download-mac"
|
||||||
|
|
||||||
MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )"
|
MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )"
|
||||||
|
# if [[ -o DEBUG ]]; then osascript -e "display dialog \"MONO_VERSION: $MONO_VERSION\""; fi
|
||||||
|
|
||||||
|
|
||||||
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
|
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
|
||||||
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
|
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
|
||||||
if [ -z "$MONO_VERSION" ] \
|
if [ -z "$MONO_VERSION" ] \
|
||||||
|
|||||||
+10
-4
@@ -4,17 +4,19 @@
|
|||||||
"description": "Sonarr",
|
"description": "Sonarr",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"preinstall": ""
|
"build": "gulp build",
|
||||||
|
"start": "gulp watch"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git://github.com/Sonarr/Sonarr.git"
|
"url": "git://github.com/Sonarr/Sonarr.git"
|
||||||
},
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "BSD",
|
"license": "GPL-3.0",
|
||||||
"gitHead": "9ff7aa1bf7fe38c4c5bdb92f56c8ad556916ed67",
|
"gitHead": "9ff7aa1bf7fe38c4c5bdb92f56c8ad556916ed67",
|
||||||
"readmeFilename": "readme.md",
|
"readmeFilename": "readme.md",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"autoprefixer-core": "5.2.1",
|
||||||
"del": "1.2.0",
|
"del": "1.2.0",
|
||||||
"gulp": "3.9.0",
|
"gulp": "3.9.0",
|
||||||
"gulp-cached": "1.1.0",
|
"gulp-cached": "1.1.0",
|
||||||
@@ -23,9 +25,12 @@
|
|||||||
"gulp-handlebars": "3.0.1",
|
"gulp-handlebars": "3.0.1",
|
||||||
"gulp-jshint": "1.11.2",
|
"gulp-jshint": "1.11.2",
|
||||||
"gulp-less": "3.0.3",
|
"gulp-less": "3.0.3",
|
||||||
|
"gulp-livereload": "3.8.0",
|
||||||
|
"gulp-postcss": "6.0.0",
|
||||||
"gulp-print": "1.1.0",
|
"gulp-print": "1.1.0",
|
||||||
"gulp-replace": "0.5.3",
|
"gulp-replace": "0.5.3",
|
||||||
"gulp-run": "1.6.8",
|
"gulp-run": "1.6.8",
|
||||||
|
"gulp-sourcemaps": "1.5.2",
|
||||||
"gulp-stripbom": "1.0.4",
|
"gulp-stripbom": "1.0.4",
|
||||||
"gulp-webpack": "1.5.0",
|
"gulp-webpack": "1.5.0",
|
||||||
"gulp-wrap": "0.11.0",
|
"gulp-wrap": "0.11.0",
|
||||||
@@ -34,7 +39,8 @@
|
|||||||
"jshint-stylish": "2.0.1",
|
"jshint-stylish": "2.0.1",
|
||||||
"run-sequence": "1.1.1",
|
"run-sequence": "1.1.1",
|
||||||
"streamqueue": "1.1.0",
|
"streamqueue": "1.1.0",
|
||||||
"tar.gz": "^0.1.1",
|
"tar.gz": "0.1.1",
|
||||||
"webpack": "1.10.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: ##
|
## Major Features Include: ##
|
||||||
|
|
||||||
* Support for major platforms: Windows, Linux, OSX, Raspberry Pi, etc.
|
* Support for major platforms: Windows, Linux, OSX, Raspberry Pi, etc.
|
||||||
* Automatically detects new episodes
|
* Automatically detects new episodes
|
||||||
* Can scan your existing library and download any missing episodes
|
* Can scan your existing library and download any missing episodes
|
||||||
* Can watch for better quality of the episodes you already have and do an automatic upgrade. *eg. from DVD to Blu-Ray*
|
* Can watch for better quality of the episodes you already have and do an automatic upgrade. *eg. from DVD to Blu-Ray*
|
||||||
@@ -21,10 +21,9 @@ Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS fee
|
|||||||
## Configuring Development Environment: ##
|
## Configuring Development Environment: ##
|
||||||
|
|
||||||
### Requirements ###
|
### 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)
|
- [Git](http://git-scm.com/downloads)
|
||||||
- [NodeJS](http://nodejs.org/download/)
|
- [NodeJS](http://nodejs.org/download/)
|
||||||
- [Gulp](http://gulpjs.com)
|
|
||||||
|
|
||||||
### Setup ###
|
### Setup ###
|
||||||
|
|
||||||
@@ -32,10 +31,9 @@ Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS fee
|
|||||||
- Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories)
|
- Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories)
|
||||||
- Grab the submodules `git submodule init && git submodule update`
|
- Grab the submodules `git submodule init && git submodule update`
|
||||||
- install the required Node Packages `npm install`
|
- install the required Node Packages `npm install`
|
||||||
- install gulp `npm install gulp -g`
|
- start gulp to monitor your dev environment for any changes that need post processing using `npm start` command.
|
||||||
- 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 ###
|
### Development ###
|
||||||
@@ -45,7 +43,7 @@ Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS fee
|
|||||||
|
|
||||||
### License ###
|
### License ###
|
||||||
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
||||||
Copyright 2010-2015
|
Copyright 2010-2016
|
||||||
|
|
||||||
|
|
||||||
### Sponsors ###
|
### Sponsors ###
|
||||||
|
|||||||
-17
@@ -1,17 +0,0 @@
|
|||||||
Param(
|
|
||||||
[Parameter(Mandatory=$true, Position=0, HelpMessage="A branch name is #requires required")]
|
|
||||||
[string]$branch,
|
|
||||||
[Parameter(Mandatory=$true, Position=1, HelpMessage="A version is required")]
|
|
||||||
[string]$version
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($branch -eq "<default>")
|
|
||||||
{
|
|
||||||
$branch = "teamcity";
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host $branch;
|
|
||||||
Write-Host $version;
|
|
||||||
Write-Host "NzbDrone.$branch.$version.zip";
|
|
||||||
|
|
||||||
Rename-Item "nzbdrone.zip" "NzbDrone.$branch.$version.zip"
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<configuration>
|
|
||||||
<solution>
|
|
||||||
<add key="disableSourceControlIntegration" value="true" />
|
|
||||||
</solution>
|
|
||||||
</configuration>
|
|
||||||
Binary file not shown.
@@ -1,136 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>
|
|
||||||
|
|
||||||
<!-- Enable the restore command to run before builds -->
|
|
||||||
<RestorePackages Condition=" '$(RestorePackages)' == '' ">false</RestorePackages>
|
|
||||||
|
|
||||||
<!-- Property that enables building a package from a project -->
|
|
||||||
<BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>
|
|
||||||
|
|
||||||
<!-- Determines if package restore consent is required to restore packages -->
|
|
||||||
<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>
|
|
||||||
|
|
||||||
<!-- Download NuGet.exe if it does not already exist -->
|
|
||||||
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(PackageSources)' == '' ">
|
|
||||||
<!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
|
|
||||||
<!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
|
|
||||||
<!--
|
|
||||||
<PackageSource Include="https://www.nuget.org/api/v2/" />
|
|
||||||
<PackageSource Include="https://my-nuget-source/nuget/" />
|
|
||||||
-->
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
|
|
||||||
<!-- Windows specific commands -->
|
|
||||||
<NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
|
|
||||||
<PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
|
|
||||||
<!-- We need to launch nuget.exe with the mono command if we're not on windows -->
|
|
||||||
<NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
|
|
||||||
<PackagesConfig>packages.config</PackagesConfig>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<!-- NuGet command -->
|
|
||||||
<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\NuGet.exe</NuGetExePath>
|
|
||||||
<PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>
|
|
||||||
|
|
||||||
<NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
|
|
||||||
<NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>
|
|
||||||
|
|
||||||
<PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>
|
|
||||||
|
|
||||||
<RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
|
|
||||||
<NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch>
|
|
||||||
|
|
||||||
<PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir>
|
|
||||||
<PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir>
|
|
||||||
|
|
||||||
<!-- Commands -->
|
|
||||||
<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>
|
|
||||||
<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>
|
|
||||||
|
|
||||||
<!-- We need to ensure packages are restored prior to assembly resolve -->
|
|
||||||
<BuildDependsOn Condition="$(RestorePackages) == 'true'">
|
|
||||||
RestorePackages;
|
|
||||||
$(BuildDependsOn);
|
|
||||||
</BuildDependsOn>
|
|
||||||
|
|
||||||
<!-- Make the build depend on restore packages -->
|
|
||||||
<BuildDependsOn Condition="$(BuildPackage) == 'true'">
|
|
||||||
$(BuildDependsOn);
|
|
||||||
BuildPackage;
|
|
||||||
</BuildDependsOn>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<Target Name="CheckPrerequisites">
|
|
||||||
<!-- Raise an error if we're unable to locate nuget.exe -->
|
|
||||||
<Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
|
|
||||||
<!--
|
|
||||||
Take advantage of MsBuild's build dependency tracking to make sure that we only ever download nuget.exe once.
|
|
||||||
This effectively acts as a lock that makes sure that the download operation will only happen once and all
|
|
||||||
parallel builds will have to wait for it to complete.
|
|
||||||
-->
|
|
||||||
<MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
<Target Name="_DownloadNuGet">
|
|
||||||
<DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
|
|
||||||
<Exec Command="$(RestoreCommand)"
|
|
||||||
Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />
|
|
||||||
|
|
||||||
<Exec Command="$(RestoreCommand)"
|
|
||||||
LogStandardErrorAsError="true"
|
|
||||||
Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
|
|
||||||
<Exec Command="$(BuildCommand)"
|
|
||||||
Condition=" '$(OS)' != 'Windows_NT' " />
|
|
||||||
|
|
||||||
<Exec Command="$(BuildCommand)"
|
|
||||||
LogStandardErrorAsError="true"
|
|
||||||
Condition=" '$(OS)' == 'Windows_NT' " />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
|
|
||||||
<ParameterGroup>
|
|
||||||
<OutputFilename ParameterType="System.String" Required="true" />
|
|
||||||
</ParameterGroup>
|
|
||||||
<Task>
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Using Namespace="System" />
|
|
||||||
<Using Namespace="System.IO" />
|
|
||||||
<Using Namespace="System.Net" />
|
|
||||||
<Using Namespace="Microsoft.Build.Framework" />
|
|
||||||
<Using Namespace="Microsoft.Build.Utilities" />
|
|
||||||
<Code Type="Fragment" Language="cs">
|
|
||||||
<![CDATA[
|
|
||||||
try {
|
|
||||||
OutputFilename = Path.GetFullPath(OutputFilename);
|
|
||||||
|
|
||||||
Log.LogMessage("Downloading latest version of NuGet.exe...");
|
|
||||||
WebClient webClient = new WebClient();
|
|
||||||
webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex) {
|
|
||||||
Log.LogErrorFromException(ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
]]>
|
|
||||||
</Code>
|
|
||||||
</Task>
|
|
||||||
</UsingTask>
|
|
||||||
</Project>
|
|
||||||
Binary file not shown.
@@ -1,9 +0,0 @@
|
|||||||
<?xml version ="1.0"?>
|
|
||||||
<!-- This allows mt.exe to run on machines with the CLR v4 installed but not 1.1 or 2.0 -->
|
|
||||||
<configuration>
|
|
||||||
<startup useLegacyV2RuntimeActivationPolicy="true">
|
|
||||||
<supportedRuntime version="v4.0"/>
|
|
||||||
<supportedRuntime version="v2.0.50727"/>
|
|
||||||
<supportedRuntime version="v1.1.4322"/>
|
|
||||||
</startup>
|
|
||||||
</configuration>
|
|
||||||
@@ -296,7 +296,7 @@ namespace LogentriesCore
|
|||||||
WriteDebugMessages("HostName parameter is not defined - trying to get it from System.Environment.MachineName");
|
WriteDebugMessages("HostName parameter is not defined - trying to get it from System.Environment.MachineName");
|
||||||
m_HostName = "HostName=" + System.Environment.MachineName + " ";
|
m_HostName = "HostName=" + System.Environment.MachineName + " ";
|
||||||
}
|
}
|
||||||
catch (InvalidOperationException ex)
|
catch (InvalidOperationException)
|
||||||
{
|
{
|
||||||
// Cannot get host name automatically, so assume that HostName is not used
|
// Cannot get host name automatically, so assume that HostName is not used
|
||||||
// and log message is sent without it.
|
// and log message is sent without it.
|
||||||
|
|||||||
@@ -73,13 +73,6 @@
|
|||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
</PostBuildEvent>
|
</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
|
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
|
||||||
<PropertyGroup>
|
|
||||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
|
|
||||||
</Target>
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
|
|||||||
@@ -51,8 +51,9 @@
|
|||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="NLog">
|
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.2.1.0\lib\net40\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.4.3.4\lib\net40\NLog.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
@@ -79,19 +80,13 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="fastJSON\license.txt" />
|
<None Include="fastJSON\license.txt" />
|
||||||
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
</PostBuildEvent>
|
</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
|
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
|
||||||
<PropertyGroup>
|
|
||||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
|
|
||||||
</Target>
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ namespace LogentriesNLog.fastJSON
|
|||||||
SerializeNullValues = false;
|
SerializeNullValues = false;
|
||||||
UseOptimizedDatasetSchema = false;
|
UseOptimizedDatasetSchema = false;
|
||||||
UsingGlobalTypes = false;
|
UsingGlobalTypes = false;
|
||||||
|
UseUTCDateTime = true;
|
||||||
}
|
}
|
||||||
public bool UseOptimizedDatasetSchema = true;
|
public bool UseOptimizedDatasetSchema = true;
|
||||||
public bool UseFastGuid = true;
|
public bool UseFastGuid = true;
|
||||||
@@ -39,7 +40,7 @@ namespace LogentriesNLog.fastJSON
|
|||||||
return ToJSON(obj, UseSerializerExtension, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues);
|
return ToJSON(obj, UseSerializerExtension, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public string ToJSON(object obj,
|
public string ToJSON(object obj,
|
||||||
bool enableSerializerExtensions,
|
bool enableSerializerExtensions,
|
||||||
bool enableFastGuid,
|
bool enableFastGuid,
|
||||||
@@ -49,13 +50,13 @@ namespace LogentriesNLog.fastJSON
|
|||||||
return new JSONSerializer(enableOptimizedDatasetSchema, enableFastGuid, enableSerializerExtensions, serializeNullValues, IndentOutput).ConvertToJSON(obj);
|
return new JSONSerializer(enableOptimizedDatasetSchema, enableFastGuid, enableSerializerExtensions, serializeNullValues, IndentOutput).ConvertToJSON(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public T ToObject<T>(string json)
|
public T ToObject<T>(string json)
|
||||||
{
|
{
|
||||||
return (T)ToObject(json, typeof(T));
|
return (T)ToObject(json, typeof(T));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public object ToObject(string json, Type type)
|
public object ToObject(string json, Type type)
|
||||||
{
|
{
|
||||||
var ht = new JsonParser(json).Decode() as Dictionary<string, object>;
|
var ht = new JsonParser(json).Decode() as Dictionary<string, object>;
|
||||||
@@ -320,7 +321,7 @@ namespace LogentriesNLog.fastJSON
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
_getterscache.Add(type, getters);
|
_getterscache.Add(type, getters);
|
||||||
return getters;
|
return getters;
|
||||||
}
|
}
|
||||||
@@ -448,7 +449,7 @@ namespace LogentriesNLog.fastJSON
|
|||||||
#if !SILVERLIGHT
|
#if !SILVERLIGHT
|
||||||
else if (pi.isDictionary || pi.isHashtable)
|
else if (pi.isDictionary || pi.isHashtable)
|
||||||
oset = CreateDictionary((ArrayList)v, pi.pt, pi.GenericTypes, globaltypes);
|
oset = CreateDictionary((ArrayList)v, pi.pt, pi.GenericTypes, globaltypes);
|
||||||
#else
|
#else
|
||||||
else if (pi.isDictionary)
|
else if (pi.isDictionary)
|
||||||
oset = CreateDictionary((List<object>)v, pi.pt, pi.GenericTypes, globaltypes);
|
oset = CreateDictionary((List<object>)v, pi.pt, pi.GenericTypes, globaltypes);
|
||||||
#endif
|
#endif
|
||||||
@@ -817,4 +818,4 @@ namespace LogentriesNLog.fastJSON
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -170,6 +170,8 @@ namespace LogentriesNLog.fastJSON
|
|||||||
_output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo));
|
_output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo));
|
||||||
_output.Append(":");
|
_output.Append(":");
|
||||||
_output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo));
|
_output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo));
|
||||||
|
_output.Append(".");
|
||||||
|
_output.Append(dt.Millisecond.ToString("000", NumberFormatInfo.InvariantInfo));
|
||||||
|
|
||||||
if (JSON.Instance.UseUTCDateTime)
|
if (JSON.Instance.UseUTCDateTime)
|
||||||
_output.Append("Z");
|
_output.Append("Z");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="NLog" version="2.1.0" targetFramework="net40" />
|
<package id="NLog" version="4.3.4" targetFramework="net40" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -144,7 +144,6 @@
|
|||||||
<PreBuildEvent>
|
<PreBuildEvent>
|
||||||
</PreBuildEvent>
|
</PreBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
|
|||||||
@@ -276,10 +276,9 @@
|
|||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Target Name="AfterBuild">
|
<Target Name="AfterBuild">
|
||||||
</Target>
|
</Target>
|
||||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
</Target>
|
</Target>
|
||||||
-->
|
-->
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -102,7 +102,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="..\Common\Microsoft.AspNet.SignalR.targets" />
|
<Import Project="..\Common\Microsoft.AspNet.SignalR.targets" />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
@@ -110,4 +109,4 @@
|
|||||||
<Target Name="AfterBuild">
|
<Target Name="AfterBuild">
|
||||||
</Target>
|
</Target>
|
||||||
-->
|
-->
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -774,7 +774,8 @@ namespace MonoTorrent
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ("nodes"):
|
case ("nodes"):
|
||||||
this.nodes = (BEncodedList)keypair.Value;
|
if (keypair.Value.ToString().Length != 0)
|
||||||
|
this.nodes = (BEncodedList)keypair.Value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ("comment.utf-8"):
|
case ("comment.utf-8"):
|
||||||
|
|||||||
@@ -1,168 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using FizzWare.NBuilder;
|
|
||||||
using FluentAssertions;
|
|
||||||
using Marr.Data;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using NzbDrone.Api.Commands;
|
|
||||||
using NzbDrone.Api.Config;
|
|
||||||
using NzbDrone.Api.Episodes;
|
|
||||||
using NzbDrone.Api.History;
|
|
||||||
using NzbDrone.Api.Indexers;
|
|
||||||
using NzbDrone.Api.Logs;
|
|
||||||
using NzbDrone.Api.Mapping;
|
|
||||||
using NzbDrone.Api.Profiles;
|
|
||||||
using NzbDrone.Api.RootFolders;
|
|
||||||
using NzbDrone.Api.Series;
|
|
||||||
using NzbDrone.Core.DecisionEngine;
|
|
||||||
using NzbDrone.Core.Instrumentation;
|
|
||||||
using NzbDrone.Core.Messaging.Commands;
|
|
||||||
using NzbDrone.Core.Organizer;
|
|
||||||
using NzbDrone.Core.Parser.Model;
|
|
||||||
using NzbDrone.Core.Profiles;
|
|
||||||
using NzbDrone.Core.Qualities;
|
|
||||||
using NzbDrone.Core.RootFolders;
|
|
||||||
using NzbDrone.Core.Tv;
|
|
||||||
using NzbDrone.Core.Update.Commands;
|
|
||||||
using NzbDrone.Test.Common;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Test.MappingTests
|
|
||||||
{
|
|
||||||
[TestFixture]
|
|
||||||
public class ResourceMappingFixture : TestBase
|
|
||||||
{
|
|
||||||
[TestCase(typeof(Core.Tv.Series), typeof(SeriesResource))]
|
|
||||||
[TestCase(typeof(Episode), typeof(EpisodeResource))]
|
|
||||||
[TestCase(typeof(RootFolder), typeof(RootFolderResource))]
|
|
||||||
[TestCase(typeof(NamingConfig), typeof(NamingConfigResource))]
|
|
||||||
// [TestCase(typeof(IndexerDefinition), typeof(IndexerResource))] //TODO: Ignoring because we don't have a good way to ignore properties with value injector
|
|
||||||
[TestCase(typeof(ReleaseInfo), typeof(ReleaseResource))]
|
|
||||||
[TestCase(typeof(ParsedEpisodeInfo), typeof(ReleaseResource))]
|
|
||||||
[TestCase(typeof(DownloadDecision), typeof(ReleaseResource))]
|
|
||||||
[TestCase(typeof(Core.History.History), typeof(HistoryResource))]
|
|
||||||
[TestCase(typeof(Profile), typeof(ProfileResource))]
|
|
||||||
[TestCase(typeof(ProfileQualityItem), typeof(ProfileQualityItemResource))]
|
|
||||||
[TestCase(typeof(Log), typeof(LogResource))]
|
|
||||||
[TestCase(typeof(Command), typeof(CommandResource))]
|
|
||||||
public void matching_fields(Type modelType, Type resourceType)
|
|
||||||
{
|
|
||||||
MappingValidation.ValidateMapping(modelType, resourceType);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_map_lazy_loaded_values_should_not_be_inject_if_not_loaded()
|
|
||||||
{
|
|
||||||
var modelWithLazy = new ModelWithLazy()
|
|
||||||
{
|
|
||||||
Guid = new TestLazyLoaded<Guid>()
|
|
||||||
};
|
|
||||||
|
|
||||||
modelWithLazy.InjectTo<ModelWithNoLazy>().Guid.Should().BeEmpty();
|
|
||||||
|
|
||||||
modelWithLazy.Guid.IsLoaded.Should().BeFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_map_lay_loaded_values_should_be_inject_if_loaded()
|
|
||||||
{
|
|
||||||
|
|
||||||
var guid = Guid.NewGuid();
|
|
||||||
|
|
||||||
var modelWithLazy = new ModelWithLazy()
|
|
||||||
{
|
|
||||||
Guid = new LazyLoaded<Guid>(guid)
|
|
||||||
};
|
|
||||||
|
|
||||||
modelWithLazy.InjectTo<ModelWithNoLazy>().Guid.Should().Be(guid);
|
|
||||||
|
|
||||||
modelWithLazy.Guid.IsLoaded.Should().BeTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_be_able_to_map_lists()
|
|
||||||
{
|
|
||||||
var modelList = Builder<TestModel>.CreateListOfSize(10).Build();
|
|
||||||
|
|
||||||
var resourceList = modelList.InjectTo<List<TestResource>>();
|
|
||||||
|
|
||||||
resourceList.Should().HaveSameCount(modelList);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_map_wrapped_models()
|
|
||||||
{
|
|
||||||
var modelList = Builder<TestModel>.CreateListOfSize(10).Build().ToList();
|
|
||||||
|
|
||||||
var wrapper = new TestModelWrapper
|
|
||||||
{
|
|
||||||
TestlList = modelList
|
|
||||||
};
|
|
||||||
|
|
||||||
wrapper.InjectTo<TestResourceWrapper>();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_map_profile()
|
|
||||||
{
|
|
||||||
var profileResource = new ProfileResource
|
|
||||||
{
|
|
||||||
Cutoff = Quality.WEBDL1080p,
|
|
||||||
Items = new List<ProfileQualityItemResource> { new ProfileQualityItemResource { Quality = Quality.WEBDL1080p, Allowed = true } }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
profileResource.InjectTo<Profile>();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void should_map_tracked_command()
|
|
||||||
{
|
|
||||||
var commandResource = new CommandModel { Body = new ApplicationUpdateCommand() };
|
|
||||||
commandResource.InjectTo<CommandResource>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ModelWithLazy
|
|
||||||
{
|
|
||||||
public LazyLoaded<Guid> Guid { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ModelWithNoLazy
|
|
||||||
{
|
|
||||||
public Guid Guid { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TestLazyLoaded<T> : LazyLoaded<T>
|
|
||||||
{
|
|
||||||
public override void Prepare(Func<IDataMapper> dataMapperFactory, object parent)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public class TestModelWrapper
|
|
||||||
{
|
|
||||||
public List<TestModel> TestlList { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TestResourceWrapper
|
|
||||||
{
|
|
||||||
public List<TestResource> TestList { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TestModel
|
|
||||||
{
|
|
||||||
public string Field1 { get; set; }
|
|
||||||
public string Field2 { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TestResource
|
|
||||||
{
|
|
||||||
public string Field1 { get; set; }
|
|
||||||
public string Field2 { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -38,17 +38,17 @@
|
|||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="FluentAssertions, Version=3.4.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
|
<Reference Include="FluentAssertions, Version=4.2.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\FluentAssertions.3.4.0\lib\net40\FluentAssertions.dll</HintPath>
|
<HintPath>..\packages\FluentAssertions.4.2.1\lib\net40\FluentAssertions.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="FluentAssertions.Core, Version=3.4.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
|
<Reference Include="FluentAssertions.Core, Version=4.2.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\FluentAssertions.3.4.0\lib\net40\FluentAssertions.Core.dll</HintPath>
|
<HintPath>..\packages\FluentAssertions.4.2.1\lib\net40\FluentAssertions.Core.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="nunit.framework, Version=2.6.3.13283, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
|
<Reference Include="nunit.framework, Version=3.2.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<HintPath>..\packages\NUnit.3.2.0\lib\net40\nunit.framework.dll</HintPath>
|
||||||
<HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
@@ -63,13 +63,9 @@
|
|||||||
<Reference Include="Moq">
|
<Reference Include="Moq">
|
||||||
<HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath>
|
<HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Omu.ValueInjecter">
|
|
||||||
<HintPath>..\packages\ValueInjecter.2.3.3\lib\net35\Omu.ValueInjecter.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="ClientSchemaTests\SchemaBuilderFixture.cs" />
|
<Compile Include="ClientSchemaTests\SchemaBuilderFixture.cs" />
|
||||||
<Compile Include="MappingTests\ResourceMappingFixture.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -104,7 +100,6 @@
|
|||||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="FluentAssertions" version="3.4.0" targetFramework="net40" />
|
<package id="FluentAssertions" version="4.2.1" targetFramework="net40" />
|
||||||
<package id="Moq" version="4.0.10827" />
|
<package id="Moq" version="4.0.10827" />
|
||||||
<package id="NBuilder" version="3.0.1.1" targetFramework="net40" />
|
<package id="NBuilder" version="3.0.1.1" targetFramework="net40" />
|
||||||
<package id="NUnit" version="2.6.3" targetFramework="net40" />
|
<package id="NUnit" version="3.2.0" targetFramework="net40" />
|
||||||
<package id="ValueInjecter" version="2.3.3" targetFramework="net40" />
|
</packages>
|
||||||
</packages>
|
|
||||||
@@ -3,6 +3,7 @@ using Nancy;
|
|||||||
using Nancy.Authentication.Forms;
|
using Nancy.Authentication.Forms;
|
||||||
using Nancy.Extensions;
|
using Nancy.Extensions;
|
||||||
using Nancy.ModelBinding;
|
using Nancy.ModelBinding;
|
||||||
|
using NzbDrone.Common.EnsureThat;
|
||||||
using NzbDrone.Core.Authentication;
|
using NzbDrone.Core.Authentication;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
|
|
||||||
@@ -23,6 +24,11 @@ namespace NzbDrone.Api.Authentication
|
|||||||
|
|
||||||
private Response Login(LoginResource resource)
|
private Response Login(LoginResource resource)
|
||||||
{
|
{
|
||||||
|
Ensure.That(resource.Username, () => resource.Username).IsNotNullOrWhiteSpace();
|
||||||
|
|
||||||
|
// TODO: A null or empty password should not be allowed, uncomment in v3
|
||||||
|
//Ensure.That(resource.Password, () => resource.Password).IsNotNullOrWhiteSpace();
|
||||||
|
|
||||||
var user = _userService.FindUser(resource.Username, resource.Password);
|
var user = _userService.FindUser(resource.Username, resource.Password);
|
||||||
|
|
||||||
if (user == null)
|
if (user == null)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace NzbDrone.Api.Authentication
|
|||||||
private readonly IUserService _userService;
|
private readonly IUserService _userService;
|
||||||
private static readonly NzbDroneUser AnonymousUser = new NzbDroneUser { UserName = "Anonymous" };
|
private static readonly NzbDroneUser AnonymousUser = new NzbDroneUser { UserName = "Anonymous" };
|
||||||
|
|
||||||
private static String API_KEY;
|
private static string API_KEY;
|
||||||
private static AuthenticationType AUTH_METHOD;
|
private static AuthenticationType AUTH_METHOD;
|
||||||
|
|
||||||
public AuthenticationService(IConfigFileProvider configFileProvider, IUserService userService)
|
public AuthenticationService(IConfigFileProvider configFileProvider, IUserService userService)
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ namespace NzbDrone.Api.Authentication
|
|||||||
_configFileProvider = configFileProvider;
|
_configFileProvider = configFileProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int Order { get { return 10; } }
|
||||||
|
|
||||||
public void Register(IPipelines pipelines)
|
public void Register(IPipelines pipelines)
|
||||||
{
|
{
|
||||||
if (_configFileProvider.AuthenticationMethod == AuthenticationType.Forms)
|
if (_configFileProvider.AuthenticationMethod == AuthenticationType.Forms)
|
||||||
@@ -39,8 +41,8 @@ namespace NzbDrone.Api.Authentication
|
|||||||
pipelines.EnableBasicAuthentication(new BasicAuthenticationConfiguration(_authenticationService, "Sonarr"));
|
pipelines.EnableBasicAuthentication(new BasicAuthenticationConfiguration(_authenticationService, "Sonarr"));
|
||||||
}
|
}
|
||||||
|
|
||||||
pipelines.BeforeRequest.AddItemToEndOfPipeline(RequiresAuthentication);
|
pipelines.BeforeRequest.AddItemToEndOfPipeline((Func<NancyContext, Response>) RequiresAuthentication);
|
||||||
pipelines.AfterRequest.AddItemToEndOfPipeline(RemoveLoginHooksForApiCalls);
|
pipelines.AfterRequest.AddItemToEndOfPipeline((Action<NancyContext>) RemoveLoginHooksForApiCalls);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Response RequiresAuthentication(NancyContext context)
|
private Response RequiresAuthentication(NancyContext context)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using NzbDrone.Core.Blacklisting;
|
using System;
|
||||||
|
using NzbDrone.Core.Blacklisting;
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Blacklist
|
namespace NzbDrone.Api.Blacklist
|
||||||
@@ -16,15 +17,9 @@ namespace NzbDrone.Api.Blacklist
|
|||||||
|
|
||||||
private PagingResource<BlacklistResource> GetBlacklist(PagingResource<BlacklistResource> pagingResource)
|
private PagingResource<BlacklistResource> GetBlacklist(PagingResource<BlacklistResource> pagingResource)
|
||||||
{
|
{
|
||||||
var pagingSpec = new PagingSpec<Core.Blacklisting.Blacklist>
|
var pagingSpec = pagingResource.MapToPagingSpec<BlacklistResource, Core.Blacklisting.Blacklist>("id", SortDirection.Ascending);
|
||||||
{
|
|
||||||
Page = pagingResource.Page,
|
|
||||||
PageSize = pagingResource.PageSize,
|
|
||||||
SortKey = pagingResource.SortKey,
|
|
||||||
SortDirection = pagingResource.SortDirection
|
|
||||||
};
|
|
||||||
|
|
||||||
return ApplyToPage(_blacklistService.Paged, pagingSpec);
|
return ApplyToPage(_blacklistService.Paged, pagingSpec, BlacklistResourceMapper.MapToResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeleteBlacklist(int id)
|
private void DeleteBlacklist(int id)
|
||||||
@@ -32,4 +27,4 @@ namespace NzbDrone.Api.Blacklist
|
|||||||
_blacklistService.Delete(id);
|
_blacklistService.Delete(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,4 +20,28 @@ namespace NzbDrone.Api.Blacklist
|
|||||||
|
|
||||||
public SeriesResource Series { get; set; }
|
public SeriesResource Series { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class BlacklistResourceMapper
|
||||||
|
{
|
||||||
|
public static BlacklistResource MapToResource(this Core.Blacklisting.Blacklist model)
|
||||||
|
{
|
||||||
|
if (model == null) return null;
|
||||||
|
|
||||||
|
return new BlacklistResource
|
||||||
|
{
|
||||||
|
Id = model.Id,
|
||||||
|
|
||||||
|
SeriesId = model.SeriesId,
|
||||||
|
EpisodeIds = model.EpisodeIds,
|
||||||
|
SourceTitle = model.SourceTitle,
|
||||||
|
Quality = model.Quality,
|
||||||
|
Date = model.Date,
|
||||||
|
Protocol = model.Protocol,
|
||||||
|
Indexer = model.Indexer,
|
||||||
|
Message = model.Message,
|
||||||
|
|
||||||
|
Series = model.Series.ToResource()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,16 +22,40 @@ namespace NzbDrone.Api.Calendar
|
|||||||
|
|
||||||
private Response GetCalendarFeed()
|
private Response GetCalendarFeed()
|
||||||
{
|
{
|
||||||
var start = DateTime.Today.AddDays(-7);
|
var pastDays = 7;
|
||||||
var end = DateTime.Today.AddDays(28);
|
var futureDays = 28;
|
||||||
|
var start = DateTime.Today.AddDays(-pastDays);
|
||||||
|
var end = DateTime.Today.AddDays(futureDays);
|
||||||
|
var unmonitored = false;
|
||||||
|
|
||||||
|
// TODO: Remove start/end parameters in v3, they don't work well for iCal
|
||||||
var queryStart = Request.Query.Start;
|
var queryStart = Request.Query.Start;
|
||||||
var queryEnd = Request.Query.End;
|
var queryEnd = Request.Query.End;
|
||||||
|
var queryPastDays = Request.Query.PastDays;
|
||||||
|
var queryFutureDays = Request.Query.FutureDays;
|
||||||
|
var queryUnmonitored = Request.Query.Unmonitored;
|
||||||
|
|
||||||
if (queryStart.HasValue) start = DateTime.Parse(queryStart.Value);
|
if (queryStart.HasValue) start = DateTime.Parse(queryStart.Value);
|
||||||
if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value);
|
if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value);
|
||||||
|
|
||||||
var episodes = _episodeService.EpisodesBetweenDates(start, end, false);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queryUnmonitored.HasValue)
|
||||||
|
{
|
||||||
|
unmonitored = bool.Parse(queryUnmonitored.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
var episodes = _episodeService.EpisodesBetweenDates(start, end, unmonitored);
|
||||||
var icalCalendar = new iCalendar();
|
var icalCalendar = new iCalendar();
|
||||||
|
|
||||||
foreach (var episode in episodes.OrderBy(v => v.AirDateUtc.Value))
|
foreach (var episode in episodes.OrderBy(v => v.AirDateUtc.Value))
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace NzbDrone.Api.Calendar
|
|||||||
if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value);
|
if (queryEnd.HasValue) end = DateTime.Parse(queryEnd.Value);
|
||||||
if (queryIncludeUnmonitored.HasValue) includeUnmonitored = Convert.ToBoolean(queryIncludeUnmonitored.Value);
|
if (queryIncludeUnmonitored.HasValue) includeUnmonitored = Convert.ToBoolean(queryIncludeUnmonitored.Value);
|
||||||
|
|
||||||
var resources = ToListResource(() => _episodeService.EpisodesBetweenDates(start, end, includeUnmonitored));
|
var resources = MapToResource(_episodeService.EpisodesBetweenDates(start, end, includeUnmonitored), true, true);
|
||||||
|
|
||||||
return resources.OrderBy(e => e.AirDateUtc).ToList();
|
return resources.OrderBy(e => e.AirDateUtc).ToList();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ namespace NzbDrone.Api.ClientSchema
|
|||||||
{
|
{
|
||||||
public class Field
|
public class Field
|
||||||
{
|
{
|
||||||
public Int32 Order { get; set; }
|
public int Order { get; set; }
|
||||||
public String Name { get; set; }
|
public string Name { get; set; }
|
||||||
public String Label { get; set; }
|
public string Label { get; set; }
|
||||||
public String HelpText { get; set; }
|
public string HelpText { get; set; }
|
||||||
public String HelpLink { get; set; }
|
public string HelpLink { get; set; }
|
||||||
public Object Value { get; set; }
|
public object Value { get; set; }
|
||||||
public String Type { get; set; }
|
public string Type { get; set; }
|
||||||
public Boolean Advanced { get; set; }
|
public bool Advanced { get; set; }
|
||||||
public List<SelectOption> SelectOptions { get; set; }
|
public List<SelectOption> SelectOptions { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,6 @@ using NzbDrone.Common.EnsureThat;
|
|||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Reflection;
|
using NzbDrone.Common.Reflection;
|
||||||
using NzbDrone.Core.Annotations;
|
using NzbDrone.Core.Annotations;
|
||||||
using Omu.ValueInjecter;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.ClientSchema
|
namespace NzbDrone.Api.ClientSchema
|
||||||
{
|
{
|
||||||
@@ -56,7 +55,7 @@ namespace NzbDrone.Api.ClientSchema
|
|||||||
return result.OrderBy(r => r.Order).ToList();
|
return result.OrderBy(r => r.Order).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static object ReadFormSchema(List<Field> fields, Type targetType, object defaults = null)
|
public static object ReadFromSchema(List<Field> fields, Type targetType)
|
||||||
{
|
{
|
||||||
Ensure.That(targetType, () => targetType).IsNotNull();
|
Ensure.That(targetType, () => targetType).IsNotNull();
|
||||||
|
|
||||||
@@ -64,11 +63,6 @@ namespace NzbDrone.Api.ClientSchema
|
|||||||
|
|
||||||
var target = Activator.CreateInstance(targetType);
|
var target = Activator.CreateInstance(targetType);
|
||||||
|
|
||||||
if (defaults != null)
|
|
||||||
{
|
|
||||||
target.InjectFrom(defaults);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var propertyInfo in properties)
|
foreach (var propertyInfo in properties)
|
||||||
{
|
{
|
||||||
var fieldAttribute = propertyInfo.GetAttribute<FieldDefinitionAttribute>(false);
|
var fieldAttribute = propertyInfo.GetAttribute<FieldDefinitionAttribute>(false);
|
||||||
@@ -77,19 +71,19 @@ namespace NzbDrone.Api.ClientSchema
|
|||||||
{
|
{
|
||||||
var field = fields.Find(f => f.Name == propertyInfo.Name);
|
var field = fields.Find(f => f.Name == propertyInfo.Name);
|
||||||
|
|
||||||
if (propertyInfo.PropertyType == typeof(Int32))
|
if (propertyInfo.PropertyType == typeof(int))
|
||||||
{
|
{
|
||||||
var value = Convert.ToInt32(field.Value);
|
var value = Convert.ToInt32(field.Value);
|
||||||
propertyInfo.SetValue(target, value, null);
|
propertyInfo.SetValue(target, value, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (propertyInfo.PropertyType == typeof(Int64))
|
else if (propertyInfo.PropertyType == typeof(long))
|
||||||
{
|
{
|
||||||
var value = Convert.ToInt64(field.Value);
|
var value = Convert.ToInt64(field.Value);
|
||||||
propertyInfo.SetValue(target, value, null);
|
propertyInfo.SetValue(target, value, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (propertyInfo.PropertyType == typeof(Nullable<Int32>))
|
else if (propertyInfo.PropertyType == typeof(int?))
|
||||||
{
|
{
|
||||||
var value = field.Value.ToString().ParseInt32();
|
var value = field.Value.ToString().ParseInt32();
|
||||||
propertyInfo.SetValue(target, value, null);
|
propertyInfo.SetValue(target, value, null);
|
||||||
@@ -101,13 +95,13 @@ namespace NzbDrone.Api.ClientSchema
|
|||||||
propertyInfo.SetValue(target, value, null);
|
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))
|
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
|
else
|
||||||
@@ -146,9 +140,9 @@ namespace NzbDrone.Api.ClientSchema
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static T ReadFormSchema<T>(List<Field> fields)
|
public static T ReadFromSchema<T>(List<Field> fields)
|
||||||
{
|
{
|
||||||
return (T)ReadFormSchema(fields, typeof(T));
|
return (T)ReadFromSchema(fields, typeof(T));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<SelectOption> GetSelectOptions(Type selectOptions)
|
private static List<SelectOption> GetSelectOptions(Type selectOptions)
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NzbDrone.Api.Extensions;
|
using NzbDrone.Api.Extensions;
|
||||||
using NzbDrone.Api.Mapping;
|
|
||||||
using NzbDrone.Api.Validation;
|
using NzbDrone.Api.Validation;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Core.Datastore.Events;
|
using NzbDrone.Core.Datastore.Events;
|
||||||
@@ -36,15 +35,13 @@ namespace NzbDrone.Api.Commands
|
|||||||
|
|
||||||
private CommandResource GetCommand(int id)
|
private CommandResource GetCommand(int id)
|
||||||
{
|
{
|
||||||
return _commandQueueManager.Get(id).InjectTo<CommandResource>();
|
return _commandQueueManager.Get(id).ToResource();
|
||||||
}
|
}
|
||||||
|
|
||||||
private int StartCommand(CommandResource commandResource)
|
private int StartCommand(CommandResource commandResource)
|
||||||
{
|
{
|
||||||
var commandType =
|
var commandType = _serviceFactory.GetImplementations(typeof(Command))
|
||||||
_serviceFactory.GetImplementations(typeof (Command))
|
.Single(c => c.Name.Replace("Command", "").Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
|
||||||
.Single(c => c.Name.Replace("Command", "")
|
|
||||||
.Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
|
|
||||||
dynamic command = Request.Body.FromJson(commandType);
|
dynamic command = Request.Body.FromJson(commandType);
|
||||||
command.Trigger = CommandTrigger.Manual;
|
command.Trigger = CommandTrigger.Manual;
|
||||||
@@ -55,14 +52,14 @@ namespace NzbDrone.Api.Commands
|
|||||||
|
|
||||||
private List<CommandResource> GetStartedCommands()
|
private List<CommandResource> GetStartedCommands()
|
||||||
{
|
{
|
||||||
return ToListResource(_commandQueueManager.GetStarted());
|
return _commandQueueManager.GetStarted().ToResource();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Handle(CommandUpdatedEvent message)
|
public void Handle(CommandUpdatedEvent message)
|
||||||
{
|
{
|
||||||
if (message.Command.Body.SendUpdatesToClient)
|
if (message.Command.Body.SendUpdatesToClient)
|
||||||
{
|
{
|
||||||
BroadcastResourceChange(ModelAction.Updated, message.Command.InjectTo<CommandResource>());
|
BroadcastResourceChange(ModelAction.Updated, message.Command.ToResource());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
using NzbDrone.Core.Messaging.Commands;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
@@ -7,9 +9,9 @@ namespace NzbDrone.Api.Commands
|
|||||||
{
|
{
|
||||||
public class CommandResource : RestResource
|
public class CommandResource : RestResource
|
||||||
{
|
{
|
||||||
public String Name { get; set; }
|
public string Name { get; set; }
|
||||||
public String Message { get; set; }
|
public string Message { get; set; }
|
||||||
public Command Body { get; set; }
|
public object Body { get; set; }
|
||||||
public CommandPriority Priority { get; set; }
|
public CommandPriority Priority { get; set; }
|
||||||
public CommandStatus Status { get; set; }
|
public CommandStatus Status { get; set; }
|
||||||
public DateTime Queued { get; set; }
|
public DateTime Queued { get; set; }
|
||||||
@@ -33,7 +35,7 @@ namespace NzbDrone.Api.Commands
|
|||||||
set { }
|
set { }
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean Manual
|
public bool Manual
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@@ -66,11 +68,23 @@ namespace NzbDrone.Api.Commands
|
|||||||
set { }
|
set { }
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean SendUpdatesToClient
|
public bool SendUpdatesToClient
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (Body != null) return Body.SendUpdatesToClient;
|
if (Body != null) return (Body as Command).SendUpdatesToClient;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
set { }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool UpdateScheduledTask
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (Body != null) return (Body as Command).UpdateScheduledTask;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -80,4 +94,37 @@ namespace NzbDrone.Api.Commands
|
|||||||
|
|
||||||
public DateTime? LastExecutionTime { get; set; }
|
public DateTime? LastExecutionTime { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class CommandResourceMapper
|
||||||
|
{
|
||||||
|
public static CommandResource ToResource(this CommandModel model)
|
||||||
|
{
|
||||||
|
if (model == null) return null;
|
||||||
|
|
||||||
|
return new CommandResource
|
||||||
|
{
|
||||||
|
Id = model.Id,
|
||||||
|
|
||||||
|
Name = model.Name,
|
||||||
|
Message = model.Message,
|
||||||
|
Body = model.Body,
|
||||||
|
Priority = model.Priority,
|
||||||
|
Status = model.Status,
|
||||||
|
Queued = model.QueuedAt,
|
||||||
|
Started = model.StartedAt,
|
||||||
|
Ended = model.EndedAt,
|
||||||
|
Duration = model.Duration,
|
||||||
|
Exception = model.Exception,
|
||||||
|
Trigger = model.Trigger,
|
||||||
|
|
||||||
|
CompletionMessage = model.Body.CompletionMessage,
|
||||||
|
LastExecutionTime = model.Body.LastExecutionTime
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<CommandResource> ToResource(this IEnumerable<CommandModel> models)
|
||||||
|
{
|
||||||
|
return models.Select(ToResource).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,12 @@ namespace NzbDrone.Api.Config
|
|||||||
.SetValidator(rootFolderValidator)
|
.SetValidator(rootFolderValidator)
|
||||||
.SetValidator(mappedNetworkDriveValidator)
|
.SetValidator(mappedNetworkDriveValidator)
|
||||||
.SetValidator(pathExistsValidator)
|
.SetValidator(pathExistsValidator)
|
||||||
.When(c => !String.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder));
|
.When(c => !string.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override DownloadClientConfigResource ToResource(IConfigService model)
|
||||||
|
{
|
||||||
|
return DownloadClientConfigResourceMapper.ToResource(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,18 +1,38 @@
|
|||||||
using System;
|
using System;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
|
using NzbDrone.Core.Configuration;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
public class DownloadClientConfigResource : RestResource
|
public class DownloadClientConfigResource : RestResource
|
||||||
{
|
{
|
||||||
public String DownloadedEpisodesFolder { get; set; }
|
public string DownloadedEpisodesFolder { get; set; }
|
||||||
public String DownloadClientWorkingFolders { get; set; }
|
public string DownloadClientWorkingFolders { get; set; }
|
||||||
public Int32 DownloadedEpisodesScanInterval { get; set; }
|
public int DownloadedEpisodesScanInterval { get; set; }
|
||||||
|
|
||||||
public Boolean EnableCompletedDownloadHandling { get; set; }
|
public bool EnableCompletedDownloadHandling { get; set; }
|
||||||
public Boolean RemoveCompletedDownloads { get; set; }
|
public bool RemoveCompletedDownloads { get; set; }
|
||||||
|
|
||||||
public Boolean AutoRedownloadFailed { get; set; }
|
public bool AutoRedownloadFailed { get; set; }
|
||||||
public Boolean RemoveFailedDownloads { get; set; }
|
public bool RemoveFailedDownloads { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DownloadClientConfigResourceMapper
|
||||||
|
{
|
||||||
|
public static DownloadClientConfigResource ToResource(IConfigService model)
|
||||||
|
{
|
||||||
|
return new DownloadClientConfigResource
|
||||||
|
{
|
||||||
|
DownloadedEpisodesFolder = model.DownloadedEpisodesFolder,
|
||||||
|
DownloadClientWorkingFolders = model.DownloadClientWorkingFolders,
|
||||||
|
DownloadedEpisodesScanInterval = model.DownloadedEpisodesScanInterval,
|
||||||
|
|
||||||
|
EnableCompletedDownloadHandling = model.EnableCompletedDownloadHandling,
|
||||||
|
RemoveCompletedDownloads = model.RemoveCompletedDownloads,
|
||||||
|
|
||||||
|
AutoRedownloadFailed = model.AutoRedownloadFailed,
|
||||||
|
RemoveFailedDownloads = model.RemoveFailedDownloads
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,19 +8,20 @@ using NzbDrone.Core.Configuration;
|
|||||||
using NzbDrone.Core.Update;
|
using NzbDrone.Core.Update;
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
using NzbDrone.Core.Validation.Paths;
|
using NzbDrone.Core.Validation.Paths;
|
||||||
using Omu.ValueInjecter;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
public class HostConfigModule : NzbDroneRestModule<HostConfigResource>
|
public class HostConfigModule : NzbDroneRestModule<HostConfigResource>
|
||||||
{
|
{
|
||||||
private readonly IConfigFileProvider _configFileProvider;
|
private readonly IConfigFileProvider _configFileProvider;
|
||||||
|
private readonly IConfigService _configService;
|
||||||
private readonly IUserService _userService;
|
private readonly IUserService _userService;
|
||||||
|
|
||||||
public HostConfigModule(IConfigFileProvider configFileProvider, IUserService userService)
|
public HostConfigModule(IConfigFileProvider configFileProvider, IConfigService configService, IUserService userService)
|
||||||
: base("/config/host")
|
: base("/config/host")
|
||||||
{
|
{
|
||||||
_configFileProvider = configFileProvider;
|
_configFileProvider = configFileProvider;
|
||||||
|
_configService = configService;
|
||||||
_userService = userService;
|
_userService = userService;
|
||||||
|
|
||||||
GetResourceSingle = GetHostConfig;
|
GetResourceSingle = GetHostConfig;
|
||||||
@@ -48,12 +49,10 @@ namespace NzbDrone.Api.Config
|
|||||||
|
|
||||||
private HostConfigResource GetHostConfig()
|
private HostConfigResource GetHostConfig()
|
||||||
{
|
{
|
||||||
var resource = new HostConfigResource();
|
var resource = _configFileProvider.ToResource(_configService);
|
||||||
resource.InjectFrom(_configFileProvider);
|
|
||||||
resource.Id = 1;
|
resource.Id = 1;
|
||||||
|
|
||||||
var user = _userService.FindUser();
|
var user = _userService.FindUser();
|
||||||
|
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
resource.Username = user.Username;
|
resource.Username = user.Username;
|
||||||
@@ -75,6 +74,7 @@ namespace NzbDrone.Api.Config
|
|||||||
.ToDictionary(prop => prop.Name, prop => prop.GetValue(resource, null));
|
.ToDictionary(prop => prop.Name, prop => prop.GetValue(resource, null));
|
||||||
|
|
||||||
_configFileProvider.SaveConfigDictionary(dictionary);
|
_configFileProvider.SaveConfigDictionary(dictionary);
|
||||||
|
_configService.SaveConfigDictionary(dictionary);
|
||||||
|
|
||||||
if (resource.Username.IsNotNullOrWhiteSpace() && resource.Password.IsNotNullOrWhiteSpace())
|
if (resource.Username.IsNotNullOrWhiteSpace() && resource.Password.IsNotNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,29 +1,74 @@
|
|||||||
using System;
|
using System;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
using NzbDrone.Core.Authentication;
|
using NzbDrone.Core.Authentication;
|
||||||
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Update;
|
using NzbDrone.Core.Update;
|
||||||
|
using NzbDrone.Common.Http.Proxy;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
public class HostConfigResource : RestResource
|
public class HostConfigResource : RestResource
|
||||||
{
|
{
|
||||||
public String BindAddress { get; set; }
|
public string BindAddress { get; set; }
|
||||||
public Int32 Port { get; set; }
|
public int Port { get; set; }
|
||||||
public Int32 SslPort { get; set; }
|
public int SslPort { get; set; }
|
||||||
public Boolean EnableSsl { get; set; }
|
public bool EnableSsl { get; set; }
|
||||||
public Boolean LaunchBrowser { get; set; }
|
public bool LaunchBrowser { get; set; }
|
||||||
public AuthenticationType AuthenticationMethod { get; set; }
|
public AuthenticationType AuthenticationMethod { get; set; }
|
||||||
public Boolean AnalyticsEnabled { get; set; }
|
public bool AnalyticsEnabled { get; set; }
|
||||||
public String Username { get; set; }
|
public string Username { get; set; }
|
||||||
public String Password { get; set; }
|
public string Password { get; set; }
|
||||||
public String LogLevel { get; set; }
|
public string LogLevel { get; set; }
|
||||||
public String Branch { get; set; }
|
public string Branch { get; set; }
|
||||||
public String ApiKey { get; set; }
|
public string ApiKey { get; set; }
|
||||||
public Boolean Torrent { get; set; }
|
public string SslCertHash { get; set; }
|
||||||
public String SslCertHash { get; set; }
|
public string UrlBase { get; set; }
|
||||||
public String UrlBase { get; set; }
|
public bool UpdateAutomatically { get; set; }
|
||||||
public Boolean UpdateAutomatically { get; set; }
|
|
||||||
public UpdateMechanism UpdateMechanism { get; set; }
|
public UpdateMechanism UpdateMechanism { get; set; }
|
||||||
public String UpdateScriptPath { get; set; }
|
public string UpdateScriptPath { get; set; }
|
||||||
|
public bool ProxyEnabled { get; set; }
|
||||||
|
public ProxyType ProxyType { get; set; }
|
||||||
|
public string ProxyHostname { get; set; }
|
||||||
|
public int ProxyPort { get; set; }
|
||||||
|
public string ProxyUsername { get; set; }
|
||||||
|
public string ProxyPassword { get; set; }
|
||||||
|
public string ProxyBypassFilter { get; set; }
|
||||||
|
public bool ProxyBypassLocalAddresses { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class HostConfigResourceMapper
|
||||||
|
{
|
||||||
|
public static HostConfigResource ToResource(this IConfigFileProvider model, IConfigService configService)
|
||||||
|
{
|
||||||
|
// TODO: Clean this mess up. don't mix data from multiple classes, use sub-resources instead?
|
||||||
|
return new HostConfigResource
|
||||||
|
{
|
||||||
|
BindAddress = model.BindAddress,
|
||||||
|
Port = model.Port,
|
||||||
|
SslPort = model.SslPort,
|
||||||
|
EnableSsl = model.EnableSsl,
|
||||||
|
LaunchBrowser = model.LaunchBrowser,
|
||||||
|
AuthenticationMethod = model.AuthenticationMethod,
|
||||||
|
AnalyticsEnabled = model.AnalyticsEnabled,
|
||||||
|
//Username
|
||||||
|
//Password
|
||||||
|
LogLevel = model.LogLevel,
|
||||||
|
Branch = model.Branch,
|
||||||
|
ApiKey = model.ApiKey,
|
||||||
|
SslCertHash = model.SslCertHash,
|
||||||
|
UrlBase = model.UrlBase,
|
||||||
|
UpdateAutomatically = model.UpdateAutomatically,
|
||||||
|
UpdateMechanism = model.UpdateMechanism,
|
||||||
|
UpdateScriptPath = model.UpdateScriptPath,
|
||||||
|
ProxyEnabled = configService.ProxyEnabled,
|
||||||
|
ProxyType = configService.ProxyType,
|
||||||
|
ProxyHostname = configService.ProxyHostname,
|
||||||
|
ProxyPort = configService.ProxyPort,
|
||||||
|
ProxyUsername = configService.ProxyUsername,
|
||||||
|
ProxyPassword = configService.ProxyPassword,
|
||||||
|
ProxyBypassFilter = configService.ProxyBypassFilter,
|
||||||
|
ProxyBypassLocalAddresses = configService.ProxyBypassLocalAddresses
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using FluentValidation;
|
using System;
|
||||||
|
using FluentValidation;
|
||||||
|
using NzbDrone.Api.Validation;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
@@ -16,8 +18,12 @@ namespace NzbDrone.Api.Config
|
|||||||
.GreaterThanOrEqualTo(0);
|
.GreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
SharedValidator.RuleFor(c => c.RssSyncInterval)
|
SharedValidator.RuleFor(c => c.RssSyncInterval)
|
||||||
.InclusiveBetween(10, 120)
|
.IsValidRssSyncInterval();
|
||||||
.When(c => c.RssSyncInterval > 0);
|
}
|
||||||
|
|
||||||
|
protected override IndexerConfigResource ToResource(IConfigService model)
|
||||||
|
{
|
||||||
|
return IndexerConfigResourceMapper.ToResource(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,26 @@
|
|||||||
using System;
|
using System;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
|
using NzbDrone.Core.Configuration;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
public class IndexerConfigResource : RestResource
|
public class IndexerConfigResource : RestResource
|
||||||
{
|
{
|
||||||
public Int32 MinimumAge { get; set; }
|
public int MinimumAge { get; set; }
|
||||||
public Int32 Retention { get; set; }
|
public int Retention { get; set; }
|
||||||
public Int32 RssSyncInterval { get; set; }
|
public int RssSyncInterval { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class IndexerConfigResourceMapper
|
||||||
|
{
|
||||||
|
public static IndexerConfigResource ToResource(IConfigService model)
|
||||||
|
{
|
||||||
|
return new IndexerConfigResource
|
||||||
|
{
|
||||||
|
MinimumAge = model.MinimumAge,
|
||||||
|
Retention = model.Retention,
|
||||||
|
RssSyncInterval = model.RssSyncInterval,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,12 @@ namespace NzbDrone.Api.Config
|
|||||||
{
|
{
|
||||||
SharedValidator.RuleFor(c => c.FileChmod).NotEmpty();
|
SharedValidator.RuleFor(c => c.FileChmod).NotEmpty();
|
||||||
SharedValidator.RuleFor(c => c.FolderChmod).NotEmpty();
|
SharedValidator.RuleFor(c => c.FolderChmod).NotEmpty();
|
||||||
SharedValidator.RuleFor(c => c.RecycleBin).IsValidPath().SetValidator(pathExistsValidator).When(c => !String.IsNullOrWhiteSpace(c.RecycleBin));
|
SharedValidator.RuleFor(c => c.RecycleBin).IsValidPath().SetValidator(pathExistsValidator).When(c => !string.IsNullOrWhiteSpace(c.RecycleBin));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override MediaManagementConfigResource ToResource(IConfigService model)
|
||||||
|
{
|
||||||
|
return MediaManagementConfigResourceMapper.ToResource(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,25 +1,51 @@
|
|||||||
using System;
|
using System;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.MediaFiles;
|
using NzbDrone.Core.MediaFiles;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
public class MediaManagementConfigResource : RestResource
|
public class MediaManagementConfigResource : RestResource
|
||||||
{
|
{
|
||||||
public Boolean AutoUnmonitorPreviouslyDownloadedEpisodes { get; set; }
|
public bool AutoUnmonitorPreviouslyDownloadedEpisodes { get; set; }
|
||||||
public String RecycleBin { get; set; }
|
public string RecycleBin { get; set; }
|
||||||
public Boolean AutoDownloadPropers { get; set; }
|
public bool AutoDownloadPropers { get; set; }
|
||||||
public Boolean CreateEmptySeriesFolders { get; set; }
|
public bool CreateEmptySeriesFolders { get; set; }
|
||||||
public FileDateType FileDate { get; set; }
|
public FileDateType FileDate { get; set; }
|
||||||
|
|
||||||
public Boolean SetPermissionsLinux { get; set; }
|
public bool SetPermissionsLinux { get; set; }
|
||||||
public String FileChmod { get; set; }
|
public string FileChmod { get; set; }
|
||||||
public String FolderChmod { get; set; }
|
public string FolderChmod { get; set; }
|
||||||
public String ChownUser { get; set; }
|
public string ChownUser { get; set; }
|
||||||
public String ChownGroup { get; set; }
|
public string ChownGroup { get; set; }
|
||||||
|
|
||||||
public Boolean SkipFreeSpaceCheckWhenImporting { get; set; }
|
public bool SkipFreeSpaceCheckWhenImporting { get; set; }
|
||||||
public Boolean CopyUsingHardlinks { get; set; }
|
public bool CopyUsingHardlinks { get; set; }
|
||||||
public Boolean EnableMediaInfo { get; set; }
|
public bool EnableMediaInfo { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class MediaManagementConfigResourceMapper
|
||||||
|
{
|
||||||
|
public static MediaManagementConfigResource ToResource(IConfigService model)
|
||||||
|
{
|
||||||
|
return new MediaManagementConfigResource
|
||||||
|
{
|
||||||
|
AutoUnmonitorPreviouslyDownloadedEpisodes = model.AutoUnmonitorPreviouslyDownloadedEpisodes,
|
||||||
|
RecycleBin = model.RecycleBin,
|
||||||
|
AutoDownloadPropers = model.AutoDownloadPropers,
|
||||||
|
CreateEmptySeriesFolders = model.CreateEmptySeriesFolders,
|
||||||
|
FileDate = model.FileDate,
|
||||||
|
|
||||||
|
SetPermissionsLinux = model.SetPermissionsLinux,
|
||||||
|
FileChmod = model.FileChmod,
|
||||||
|
FolderChmod = model.FolderChmod,
|
||||||
|
ChownUser = model.ChownUser,
|
||||||
|
ChownGroup = model.ChownGroup,
|
||||||
|
|
||||||
|
SkipFreeSpaceCheckWhenImporting = model.SkipFreeSpaceCheckWhenImporting,
|
||||||
|
CopyUsingHardlinks = model.CopyUsingHardlinks,
|
||||||
|
EnableMediaInfo = model.EnableMediaInfo,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,7 @@ using Nancy.Responses;
|
|||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Core.Organizer;
|
using NzbDrone.Core.Organizer;
|
||||||
using Nancy.ModelBinding;
|
using Nancy.ModelBinding;
|
||||||
using NzbDrone.Api.Mapping;
|
|
||||||
using NzbDrone.Api.Extensions;
|
using NzbDrone.Api.Extensions;
|
||||||
using Omu.ValueInjecter;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
@@ -46,7 +44,7 @@ namespace NzbDrone.Api.Config
|
|||||||
|
|
||||||
private void UpdateNamingConfig(NamingConfigResource resource)
|
private void UpdateNamingConfig(NamingConfigResource resource)
|
||||||
{
|
{
|
||||||
var nameSpec = resource.InjectTo<NamingConfig>();
|
var nameSpec = resource.ToModel();
|
||||||
ValidateFormatResult(nameSpec);
|
ValidateFormatResult(nameSpec);
|
||||||
|
|
||||||
_namingConfigService.Save(nameSpec);
|
_namingConfigService.Save(nameSpec);
|
||||||
@@ -55,16 +53,14 @@ namespace NzbDrone.Api.Config
|
|||||||
private NamingConfigResource GetNamingConfig()
|
private NamingConfigResource GetNamingConfig()
|
||||||
{
|
{
|
||||||
var nameSpec = _namingConfigService.GetConfig();
|
var nameSpec = _namingConfigService.GetConfig();
|
||||||
var resource = nameSpec.InjectTo<NamingConfigResource>();
|
var resource = nameSpec.ToResource();
|
||||||
|
|
||||||
if (String.IsNullOrWhiteSpace(resource.StandardEpisodeFormat))
|
if (resource.StandardEpisodeFormat.IsNotNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
return resource;
|
var basicConfig = _filenameBuilder.GetBasicNamingConfig(nameSpec);
|
||||||
|
basicConfig.AddToResource(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
var basicConfig = _filenameBuilder.GetBasicNamingConfig(nameSpec);
|
|
||||||
resource.InjectFrom(basicConfig);
|
|
||||||
|
|
||||||
return resource;
|
return resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,7 +71,7 @@ namespace NzbDrone.Api.Config
|
|||||||
|
|
||||||
private JsonResponse<NamingSampleResource> GetExamples(NamingConfigResource config)
|
private JsonResponse<NamingSampleResource> GetExamples(NamingConfigResource config)
|
||||||
{
|
{
|
||||||
var nameSpec = config.InjectTo<NamingConfig>();
|
var nameSpec = config.ToModel();
|
||||||
var sampleResource = new NamingSampleResource();
|
var sampleResource = new NamingSampleResource();
|
||||||
|
|
||||||
var singleEpisodeSampleResult = _filenameSampleService.GetStandardSample(nameSpec);
|
var singleEpisodeSampleResult = _filenameSampleService.GetStandardSample(nameSpec);
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
|
using NzbDrone.Core.Organizer;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
public class NamingConfigResource : RestResource
|
public class NamingConfigResource : RestResource
|
||||||
{
|
{
|
||||||
public Boolean RenameEpisodes { get; set; }
|
public bool RenameEpisodes { get; set; }
|
||||||
public Int32 MultiEpisodeStyle { get; set; }
|
public bool ReplaceIllegalCharacters { get; set; }
|
||||||
|
public int MultiEpisodeStyle { get; set; }
|
||||||
public string StandardEpisodeFormat { get; set; }
|
public string StandardEpisodeFormat { get; set; }
|
||||||
public string DailyEpisodeFormat { get; set; }
|
public string DailyEpisodeFormat { get; set; }
|
||||||
public string AnimeEpisodeFormat { get; set; }
|
public string AnimeEpisodeFormat { get; set; }
|
||||||
@@ -19,4 +21,57 @@ namespace NzbDrone.Api.Config
|
|||||||
public string Separator { get; set; }
|
public string Separator { get; set; }
|
||||||
public string NumberStyle { get; set; }
|
public string NumberStyle { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class NamingConfigResourceMapper
|
||||||
|
{
|
||||||
|
public static NamingConfigResource ToResource(this NamingConfig model)
|
||||||
|
{
|
||||||
|
return new NamingConfigResource
|
||||||
|
{
|
||||||
|
Id = model.Id,
|
||||||
|
|
||||||
|
RenameEpisodes = model.RenameEpisodes,
|
||||||
|
ReplaceIllegalCharacters = model.ReplaceIllegalCharacters,
|
||||||
|
MultiEpisodeStyle = model.MultiEpisodeStyle,
|
||||||
|
StandardEpisodeFormat = model.StandardEpisodeFormat,
|
||||||
|
DailyEpisodeFormat = model.DailyEpisodeFormat,
|
||||||
|
AnimeEpisodeFormat = model.AnimeEpisodeFormat,
|
||||||
|
SeriesFolderFormat = model.SeriesFolderFormat,
|
||||||
|
SeasonFolderFormat = model.SeasonFolderFormat
|
||||||
|
//IncludeSeriesTitle
|
||||||
|
//IncludeEpisodeTitle
|
||||||
|
//IncludeQuality
|
||||||
|
//ReplaceSpaces
|
||||||
|
//Separator
|
||||||
|
//NumberStyle
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddToResource(this BasicNamingConfig basicNamingConfig, NamingConfigResource resource)
|
||||||
|
{
|
||||||
|
resource.IncludeSeriesTitle = basicNamingConfig.IncludeSeriesTitle;
|
||||||
|
resource.IncludeEpisodeTitle = basicNamingConfig.IncludeEpisodeTitle;
|
||||||
|
resource.IncludeQuality = basicNamingConfig.IncludeQuality;
|
||||||
|
resource.ReplaceSpaces = basicNamingConfig.ReplaceSpaces;
|
||||||
|
resource.Separator = basicNamingConfig.Separator;
|
||||||
|
resource.NumberStyle = basicNamingConfig.NumberStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NamingConfig ToModel(this NamingConfigResource resource)
|
||||||
|
{
|
||||||
|
return new NamingConfig
|
||||||
|
{
|
||||||
|
Id = resource.Id,
|
||||||
|
|
||||||
|
RenameEpisodes = resource.RenameEpisodes,
|
||||||
|
ReplaceIllegalCharacters = resource.ReplaceIllegalCharacters,
|
||||||
|
MultiEpisodeStyle = resource.MultiEpisodeStyle,
|
||||||
|
StandardEpisodeFormat = resource.StandardEpisodeFormat,
|
||||||
|
DailyEpisodeFormat = resource.DailyEpisodeFormat,
|
||||||
|
AnimeEpisodeFormat = resource.AnimeEpisodeFormat,
|
||||||
|
SeriesFolderFormat = resource.SeriesFolderFormat,
|
||||||
|
SeasonFolderFormat = resource.SeasonFolderFormat
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using Omu.ValueInjecter;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
@@ -27,13 +26,14 @@ namespace NzbDrone.Api.Config
|
|||||||
|
|
||||||
private TResource GetConfig()
|
private TResource GetConfig()
|
||||||
{
|
{
|
||||||
var resource = new TResource();
|
var resource = ToResource(_configService);
|
||||||
resource.InjectFrom(_configService);
|
|
||||||
resource.Id = 1;
|
resource.Id = 1;
|
||||||
|
|
||||||
return resource;
|
return resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected abstract TResource ToResource(IConfigService model);
|
||||||
|
|
||||||
private TResource GetConfig(int id)
|
private TResource GetConfig(int id)
|
||||||
{
|
{
|
||||||
return GetConfig();
|
return GetConfig();
|
||||||
|
|||||||
@@ -1,45 +1,21 @@
|
|||||||
using System.Linq;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using Omu.ValueInjecter;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
public class UiConfigModule : NzbDroneRestModule<UiConfigResource>
|
public class UiConfigModule : NzbDroneConfigModule<UiConfigResource>
|
||||||
{
|
{
|
||||||
private readonly IConfigService _configService;
|
|
||||||
|
|
||||||
public UiConfigModule(IConfigService configService)
|
public UiConfigModule(IConfigService configService)
|
||||||
: base("/config/ui")
|
: base(configService)
|
||||||
{
|
{
|
||||||
_configService = configService;
|
|
||||||
|
|
||||||
GetResourceSingle = GetUiConfig;
|
|
||||||
GetResourceById = GetUiConfig;
|
|
||||||
UpdateResource = SaveUiConfig;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private UiConfigResource GetUiConfig()
|
protected override UiConfigResource ToResource(IConfigService model)
|
||||||
{
|
{
|
||||||
var resource = new UiConfigResource();
|
return UiConfigResourceMapper.ToResource(model);
|
||||||
resource.InjectFrom(_configService);
|
|
||||||
resource.Id = 1;
|
|
||||||
|
|
||||||
return resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
private UiConfigResource GetUiConfig(int id)
|
|
||||||
{
|
|
||||||
return GetUiConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SaveUiConfig(UiConfigResource resource)
|
|
||||||
{
|
|
||||||
var dictionary = resource.GetType()
|
|
||||||
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
|
|
||||||
.ToDictionary(prop => prop.Name, prop => prop.GetValue(resource, null));
|
|
||||||
|
|
||||||
_configService.SaveConfigDictionary(dictionary);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,20 +1,40 @@
|
|||||||
using System;
|
using System;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
|
using NzbDrone.Core.Configuration;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Config
|
namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
public class UiConfigResource : RestResource
|
public class UiConfigResource : RestResource
|
||||||
{
|
{
|
||||||
//Calendar
|
//Calendar
|
||||||
public Int32 FirstDayOfWeek { get; set; }
|
public int FirstDayOfWeek { get; set; }
|
||||||
public String CalendarWeekColumnHeader { get; set; }
|
public string CalendarWeekColumnHeader { get; set; }
|
||||||
|
|
||||||
//Dates
|
//Dates
|
||||||
public String ShortDateFormat { get; set; }
|
public string ShortDateFormat { get; set; }
|
||||||
public String LongDateFormat { get; set; }
|
public string LongDateFormat { get; set; }
|
||||||
public String TimeFormat { get; set; }
|
public string TimeFormat { get; set; }
|
||||||
public Boolean ShowRelativeDates { get; set; }
|
public bool ShowRelativeDates { get; set; }
|
||||||
|
|
||||||
public Boolean EnableColorImpairedMode { get; set; }
|
public bool EnableColorImpairedMode { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class UiConfigResourceMapper
|
||||||
|
{
|
||||||
|
public static UiConfigResource ToResource(IConfigService model)
|
||||||
|
{
|
||||||
|
return new UiConfigResource
|
||||||
|
{
|
||||||
|
FirstDayOfWeek = model.FirstDayOfWeek,
|
||||||
|
CalendarWeekColumnHeader = model.CalendarWeekColumnHeader,
|
||||||
|
|
||||||
|
ShortDateFormat = model.ShortDateFormat,
|
||||||
|
LongDateFormat = model.LongDateFormat,
|
||||||
|
TimeFormat = model.TimeFormat,
|
||||||
|
ShowRelativeDates = model.ShowRelativeDates,
|
||||||
|
|
||||||
|
EnableColorImpairedMode = model.EnableColorImpairedMode,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using NzbDrone.Core.DiskSpace;
|
using NzbDrone.Core.DiskSpace;
|
||||||
|
|
||||||
namespace NzbDrone.Api.DiskSpace
|
namespace NzbDrone.Api.DiskSpace
|
||||||
@@ -8,15 +9,16 @@ namespace NzbDrone.Api.DiskSpace
|
|||||||
private readonly IDiskSpaceService _diskSpaceService;
|
private readonly IDiskSpaceService _diskSpaceService;
|
||||||
|
|
||||||
public DiskSpaceModule(IDiskSpaceService diskSpaceService)
|
public DiskSpaceModule(IDiskSpaceService diskSpaceService)
|
||||||
:base("diskspace")
|
: base("diskspace")
|
||||||
{
|
{
|
||||||
_diskSpaceService = diskSpaceService;
|
_diskSpaceService = diskSpaceService;
|
||||||
GetResourceAll = GetFreeSpace;
|
GetResourceAll = GetFreeSpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<DiskSpaceResource> GetFreeSpace()
|
public List<DiskSpaceResource> GetFreeSpace()
|
||||||
{
|
{
|
||||||
return ToListResource(_diskSpaceService.GetFreeSpace);
|
return _diskSpaceService.GetFreeSpace().ConvertAll(DiskSpaceResourceMapper.MapToResource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,23 @@ namespace NzbDrone.Api.DiskSpace
|
|||||||
{
|
{
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
public string Label { get; set; }
|
public string Label { get; set; }
|
||||||
public Int64 FreeSpace { get; set; }
|
public long FreeSpace { get; set; }
|
||||||
public Int64 TotalSpace { get; set; }
|
public long TotalSpace { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DiskSpaceResourceMapper
|
||||||
|
{
|
||||||
|
public static DiskSpaceResource MapToResource(this Core.DiskSpace.DiskSpace model)
|
||||||
|
{
|
||||||
|
if (model == null) return null;
|
||||||
|
|
||||||
|
return new DiskSpaceResource
|
||||||
|
{
|
||||||
|
Path = model.Path,
|
||||||
|
Label = model.Label,
|
||||||
|
FreeSpace = model.FreeSpace,
|
||||||
|
TotalSpace = model.TotalSpace
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using NzbDrone.Core.Download;
|
using System;
|
||||||
|
using NzbDrone.Core.Download;
|
||||||
|
|
||||||
namespace NzbDrone.Api.DownloadClient
|
namespace NzbDrone.Api.DownloadClient
|
||||||
{
|
{
|
||||||
@@ -9,6 +10,22 @@ namespace NzbDrone.Api.DownloadClient
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void MapToResource(DownloadClientResource resource, DownloadClientDefinition definition)
|
||||||
|
{
|
||||||
|
base.MapToResource(resource, definition);
|
||||||
|
|
||||||
|
resource.Enable = definition.Enable;
|
||||||
|
resource.Protocol = definition.Protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void MapToModel(DownloadClientDefinition definition, DownloadClientResource resource)
|
||||||
|
{
|
||||||
|
base.MapToModel(definition, resource);
|
||||||
|
|
||||||
|
definition.Enable = resource.Enable;
|
||||||
|
definition.Protocol = resource.Protocol;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Validate(DownloadClientDefinition definition, bool includeWarnings)
|
protected override void Validate(DownloadClientDefinition definition, bool includeWarnings)
|
||||||
{
|
{
|
||||||
if (!definition.Enable) return;
|
if (!definition.Enable) return;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace NzbDrone.Api.DownloadClient
|
|||||||
{
|
{
|
||||||
public class DownloadClientResource : ProviderResource
|
public class DownloadClientResource : ProviderResource
|
||||||
{
|
{
|
||||||
public Boolean Enable { get; set; }
|
public bool Enable { get; set; }
|
||||||
public DownloadProtocol Protocol { get; set; }
|
public DownloadProtocol Protocol { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,6 @@ using NLog;
|
|||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
using NzbDrone.Core.Datastore.Events;
|
using NzbDrone.Core.Datastore.Events;
|
||||||
using NzbDrone.Core.MediaFiles;
|
using NzbDrone.Core.MediaFiles;
|
||||||
using NzbDrone.Api.Mapping;
|
|
||||||
using NzbDrone.Core.MediaFiles.Events;
|
using NzbDrone.Core.MediaFiles.Events;
|
||||||
using NzbDrone.Core.Messaging.Events;
|
using NzbDrone.Core.Messaging.Events;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
@@ -14,7 +13,7 @@ using NzbDrone.SignalR;
|
|||||||
|
|
||||||
namespace NzbDrone.Api.EpisodeFiles
|
namespace NzbDrone.Api.EpisodeFiles
|
||||||
{
|
{
|
||||||
public class EpisodeModule : NzbDroneRestModuleWithSignalR<EpisodeFileResource, EpisodeFile>,
|
public class EpisodeFileModule : NzbDroneRestModuleWithSignalR<EpisodeFileResource, EpisodeFile>,
|
||||||
IHandle<EpisodeFileAddedEvent>
|
IHandle<EpisodeFileAddedEvent>
|
||||||
{
|
{
|
||||||
private readonly IMediaFileService _mediaFileService;
|
private readonly IMediaFileService _mediaFileService;
|
||||||
@@ -23,7 +22,7 @@ namespace NzbDrone.Api.EpisodeFiles
|
|||||||
private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification;
|
private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification;
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public EpisodeModule(IBroadcastSignalRMessage signalRBroadcaster,
|
public EpisodeFileModule(IBroadcastSignalRMessage signalRBroadcaster,
|
||||||
IMediaFileService mediaFileService,
|
IMediaFileService mediaFileService,
|
||||||
IRecycleBinProvider recycleBinProvider,
|
IRecycleBinProvider recycleBinProvider,
|
||||||
ISeriesService seriesService,
|
ISeriesService seriesService,
|
||||||
@@ -47,22 +46,21 @@ namespace NzbDrone.Api.EpisodeFiles
|
|||||||
var episodeFile = _mediaFileService.Get(id);
|
var episodeFile = _mediaFileService.Get(id);
|
||||||
var series = _seriesService.GetSeries(episodeFile.SeriesId);
|
var series = _seriesService.GetSeries(episodeFile.SeriesId);
|
||||||
|
|
||||||
return MapToResource(series, episodeFile);
|
return episodeFile.ToResource(series, _qualityUpgradableSpecification);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<EpisodeFileResource> GetEpisodeFiles()
|
private List<EpisodeFileResource> GetEpisodeFiles()
|
||||||
{
|
{
|
||||||
var seriesId = (int?)Request.Query.SeriesId;
|
if (!Request.Query.SeriesId.HasValue)
|
||||||
|
|
||||||
if (seriesId == null)
|
|
||||||
{
|
{
|
||||||
throw new BadRequestException("seriesId is missing");
|
throw new BadRequestException("seriesId is missing");
|
||||||
}
|
}
|
||||||
|
|
||||||
var series = _seriesService.GetSeries(seriesId.Value);
|
var seriesId = (int)Request.Query.SeriesId;
|
||||||
|
|
||||||
return _mediaFileService.GetFilesBySeries(seriesId.Value)
|
var series = _seriesService.GetSeries(seriesId);
|
||||||
.Select(f => MapToResource(series, f)).ToList();
|
|
||||||
|
return _mediaFileService.GetFilesBySeries(seriesId).ConvertAll(f => f.ToResource(series, _qualityUpgradableSpecification));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetQuality(EpisodeFileResource episodeFileResource)
|
private void SetQuality(EpisodeFileResource episodeFileResource)
|
||||||
@@ -83,16 +81,6 @@ namespace NzbDrone.Api.EpisodeFiles
|
|||||||
_mediaFileService.Delete(episodeFile, DeleteMediaFileReason.Manual);
|
_mediaFileService.Delete(episodeFile, DeleteMediaFileReason.Manual);
|
||||||
}
|
}
|
||||||
|
|
||||||
private EpisodeFileResource MapToResource(Core.Tv.Series series, EpisodeFile episodeFile)
|
|
||||||
{
|
|
||||||
var resource = episodeFile.InjectTo<EpisodeFileResource>();
|
|
||||||
resource.Path = Path.Combine(series.Path, episodeFile.RelativePath);
|
|
||||||
|
|
||||||
resource.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(series.Profile.Value, episodeFile.Quality);
|
|
||||||
|
|
||||||
return resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Handle(EpisodeFileAddedEvent message)
|
public void Handle(EpisodeFileAddedEvent message)
|
||||||
{
|
{
|
||||||
BroadcastResourceChange(ModelAction.Updated, message.EpisodeFile.Id);
|
BroadcastResourceChange(ModelAction.Updated, message.EpisodeFile.Id);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
using NzbDrone.Core.Qualities;
|
using NzbDrone.Core.Qualities;
|
||||||
|
|
||||||
@@ -6,15 +7,58 @@ namespace NzbDrone.Api.EpisodeFiles
|
|||||||
{
|
{
|
||||||
public class EpisodeFileResource : RestResource
|
public class EpisodeFileResource : RestResource
|
||||||
{
|
{
|
||||||
public Int32 SeriesId { get; set; }
|
public int SeriesId { get; set; }
|
||||||
public Int32 SeasonNumber { get; set; }
|
public int SeasonNumber { get; set; }
|
||||||
public String RelativePath { get; set; }
|
public string RelativePath { get; set; }
|
||||||
public String Path { get; set; }
|
public string Path { get; set; }
|
||||||
public Int64 Size { get; set; }
|
public long Size { get; set; }
|
||||||
public DateTime DateAdded { get; set; }
|
public DateTime DateAdded { get; set; }
|
||||||
public String SceneName { get; set; }
|
public string SceneName { get; set; }
|
||||||
public QualityModel Quality { get; set; }
|
public QualityModel Quality { get; set; }
|
||||||
|
|
||||||
public Boolean QualityCutoffNotMet { get; set; }
|
public bool QualityCutoffNotMet { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class EpisodeFileResourceMapper
|
||||||
|
{
|
||||||
|
private static EpisodeFileResource ToResource(this Core.MediaFiles.EpisodeFile model)
|
||||||
|
{
|
||||||
|
if (model == null) return null;
|
||||||
|
|
||||||
|
return new EpisodeFileResource
|
||||||
|
{
|
||||||
|
Id = model.Id,
|
||||||
|
|
||||||
|
SeriesId = model.SeriesId,
|
||||||
|
SeasonNumber = model.SeasonNumber,
|
||||||
|
RelativePath = model.RelativePath,
|
||||||
|
//Path
|
||||||
|
Size = model.Size,
|
||||||
|
DateAdded = model.DateAdded,
|
||||||
|
SceneName = model.SceneName,
|
||||||
|
Quality = model.Quality,
|
||||||
|
//QualityCutoffNotMet
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EpisodeFileResource ToResource(this Core.MediaFiles.EpisodeFile model, Core.Tv.Series series, Core.DecisionEngine.IQualityUpgradableSpecification qualityUpgradableSpecification)
|
||||||
|
{
|
||||||
|
if (model == null) return null;
|
||||||
|
|
||||||
|
return new EpisodeFileResource
|
||||||
|
{
|
||||||
|
Id = model.Id,
|
||||||
|
|
||||||
|
SeriesId = model.SeriesId,
|
||||||
|
SeasonNumber = model.SeasonNumber,
|
||||||
|
RelativePath = model.RelativePath,
|
||||||
|
Path = Path.Combine(series.Path, model.RelativePath),
|
||||||
|
Size = model.Size,
|
||||||
|
DateAdded = model.DateAdded,
|
||||||
|
SceneName = model.SceneName,
|
||||||
|
Quality = model.Quality,
|
||||||
|
QualityCutoffNotMet = qualityUpgradableSpecification.CutoffNotMet(series.Profile.Value, model.Quality)
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ namespace NzbDrone.Api.Episodes
|
|||||||
|
|
||||||
private List<EpisodeResource> GetEpisodes()
|
private List<EpisodeResource> GetEpisodes()
|
||||||
{
|
{
|
||||||
var seriesId = (int?)Request.Query.SeriesId;
|
if (!Request.Query.SeriesId.HasValue)
|
||||||
|
|
||||||
if (seriesId == null)
|
|
||||||
{
|
{
|
||||||
throw new BadRequestException("seriesId is missing");
|
throw new BadRequestException("seriesId is missing");
|
||||||
}
|
}
|
||||||
|
|
||||||
var resources = ToListResource(_episodeService.GetEpisodeBySeries(seriesId.Value));
|
var seriesId = (int)Request.Query.SeriesId;
|
||||||
|
|
||||||
|
var resources = MapToResource(_episodeService.GetEpisodeBySeries(seriesId), false, true);
|
||||||
|
|
||||||
return resources;
|
return resources;
|
||||||
}
|
}
|
||||||
@@ -37,4 +37,4 @@ namespace NzbDrone.Api.Episodes
|
|||||||
_episodeService.SetEpisodeMonitored(episodeResource.Id, episodeResource.Monitored);
|
_episodeService.SetEpisodeMonitored(episodeResource.Id, episodeResource.Monitored);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
using NzbDrone.Api.EpisodeFiles;
|
||||||
using NzbDrone.Api.Extensions;
|
using NzbDrone.Api.Extensions;
|
||||||
using NzbDrone.Api.Mapping;
|
|
||||||
using NzbDrone.Api.Series;
|
using NzbDrone.Api.Series;
|
||||||
using NzbDrone.Core.Datastore.Events;
|
using NzbDrone.Core.Datastore.Events;
|
||||||
using NzbDrone.Core.DecisionEngine;
|
using NzbDrone.Core.DecisionEngine;
|
||||||
@@ -40,7 +41,7 @@ namespace NzbDrone.Api.Episodes
|
|||||||
ISeriesService seriesService,
|
ISeriesService seriesService,
|
||||||
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
IQualityUpgradableSpecification qualityUpgradableSpecification,
|
||||||
IBroadcastSignalRMessage signalRBroadcaster,
|
IBroadcastSignalRMessage signalRBroadcaster,
|
||||||
String resource)
|
string resource)
|
||||||
: base(signalRBroadcaster, resource)
|
: base(signalRBroadcaster, resource)
|
||||||
{
|
{
|
||||||
_episodeService = episodeService;
|
_episodeService = episodeService;
|
||||||
@@ -53,40 +54,65 @@ namespace NzbDrone.Api.Episodes
|
|||||||
protected EpisodeResource GetEpisode(int id)
|
protected EpisodeResource GetEpisode(int id)
|
||||||
{
|
{
|
||||||
var episode = _episodeService.GetEpisode(id);
|
var episode = _episodeService.GetEpisode(id);
|
||||||
episode.EpisodeFile.LazyLoad();
|
var resource = MapToResource(episode, true, true);
|
||||||
episode.Series = _seriesService.GetSeries(episode.SeriesId);
|
return resource;
|
||||||
return ToResource(episode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override EpisodeResource ToResource<TModel>(TModel model)
|
protected EpisodeResource MapToResource(Episode episode, bool includeSeries, bool includeEpisodeFile)
|
||||||
{
|
{
|
||||||
var resource = base.ToResource(model);
|
var resource = episode.ToResource();
|
||||||
|
|
||||||
var episode = model as Episode;
|
if (includeSeries || includeEpisodeFile)
|
||||||
if (episode != null)
|
|
||||||
{
|
{
|
||||||
if (episode.EpisodeFile.IsLoaded && episode.EpisodeFile.Value != null)
|
var series = episode.Series ?? _seriesService.GetSeries(episode.SeriesId);
|
||||||
|
|
||||||
|
if (includeSeries)
|
||||||
{
|
{
|
||||||
resource.EpisodeFile.Path = Path.Combine(episode.Series.Path, episode.EpisodeFile.Value.RelativePath);
|
resource.Series = series.ToResource();
|
||||||
resource.EpisodeFile.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(episode.Series.Profile.Value, episode.EpisodeFile.Value.Quality);
|
}
|
||||||
|
if (includeEpisodeFile && episode.EpisodeFileId != 0)
|
||||||
|
{
|
||||||
|
resource.EpisodeFile = episode.EpisodeFile.Value.ToResource(series, _qualityUpgradableSpecification);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return resource;
|
return resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override List<EpisodeResource> ToListResource<TModel>(IEnumerable<TModel> modelList)
|
protected List<EpisodeResource> MapToResource(List<Episode> episodes, bool includeSeries, bool includeEpisodeFile)
|
||||||
{
|
{
|
||||||
var resources = base.ToListResource(modelList);
|
var result = episodes.ToResource();
|
||||||
|
|
||||||
return resources.LoadSubtype<EpisodeResource, SeriesResource, Core.Tv.Series>(e => e.SeriesId, _seriesService.GetSeries).ToList();
|
if (includeSeries || includeEpisodeFile)
|
||||||
|
{
|
||||||
|
var seriesDict = new Dictionary<int, Core.Tv.Series>();
|
||||||
|
for (var i = 0; i < episodes.Count; i++)
|
||||||
|
{
|
||||||
|
var episode = episodes[i];
|
||||||
|
var resource = result[i];
|
||||||
|
|
||||||
|
var series = episode.Series ?? seriesDict.GetValueOrDefault(episodes[i].SeriesId) ?? _seriesService.GetSeries(episodes[i].SeriesId);
|
||||||
|
seriesDict[series.Id] = series;
|
||||||
|
|
||||||
|
if (includeSeries)
|
||||||
|
{
|
||||||
|
resource.Series = series.ToResource();
|
||||||
|
}
|
||||||
|
if (includeEpisodeFile && episodes[i].EpisodeFileId != 0)
|
||||||
|
{
|
||||||
|
resource.EpisodeFile = episodes[i].EpisodeFile.Value.ToResource(series, _qualityUpgradableSpecification);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Handle(EpisodeGrabbedEvent message)
|
public void Handle(EpisodeGrabbedEvent message)
|
||||||
{
|
{
|
||||||
foreach (var episode in message.Episode.Episodes)
|
foreach (var episode in message.Episode.Episodes)
|
||||||
{
|
{
|
||||||
var resource = episode.InjectTo<EpisodeResource>();
|
var resource = episode.ToResource();
|
||||||
resource.Grabbed = true;
|
resource.Grabbed = true;
|
||||||
|
|
||||||
BroadcastResourceChange(ModelAction.Updated, resource);
|
BroadcastResourceChange(ModelAction.Updated, resource);
|
||||||
@@ -101,4 +127,4 @@ namespace NzbDrone.Api.Episodes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,36 +1,78 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NzbDrone.Api.EpisodeFiles;
|
using NzbDrone.Api.EpisodeFiles;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
using NzbDrone.Api.Series;
|
using NzbDrone.Api.Series;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Episodes
|
namespace NzbDrone.Api.Episodes
|
||||||
{
|
{
|
||||||
public class EpisodeResource : RestResource
|
public class EpisodeResource : RestResource
|
||||||
{
|
{
|
||||||
public Int32 SeriesId { get; set; }
|
public int SeriesId { get; set; }
|
||||||
public Int32 EpisodeFileId { get; set; }
|
public int EpisodeFileId { get; set; }
|
||||||
public Int32 SeasonNumber { get; set; }
|
public int SeasonNumber { get; set; }
|
||||||
public Int32 EpisodeNumber { get; set; }
|
public int EpisodeNumber { get; set; }
|
||||||
public String Title { get; set; }
|
public string Title { get; set; }
|
||||||
public String AirDate { get; set; }
|
public string AirDate { get; set; }
|
||||||
public DateTime? AirDateUtc { get; set; }
|
public DateTime? AirDateUtc { get; set; }
|
||||||
public String Overview { get; set; }
|
public string Overview { get; set; }
|
||||||
public EpisodeFileResource EpisodeFile { get; set; }
|
public EpisodeFileResource EpisodeFile { get; set; }
|
||||||
|
|
||||||
public Boolean HasFile { get; set; }
|
public bool HasFile { get; set; }
|
||||||
public Boolean Monitored { get; set; }
|
public bool Monitored { get; set; }
|
||||||
public Nullable<Int32> AbsoluteEpisodeNumber { get; set; }
|
public int? AbsoluteEpisodeNumber { get; set; }
|
||||||
public Nullable<Int32> SceneAbsoluteEpisodeNumber { get; set; }
|
public int? SceneAbsoluteEpisodeNumber { get; set; }
|
||||||
public Nullable<Int32> SceneEpisodeNumber { get; set; }
|
public int? SceneEpisodeNumber { get; set; }
|
||||||
public Nullable<Int32> SceneSeasonNumber { get; set; }
|
public int? SceneSeasonNumber { get; set; }
|
||||||
public DateTime? EndTime { get; set; }
|
public bool UnverifiedSceneNumbering { get; set; }
|
||||||
public DateTime? GrabDate { get; set; }
|
public string SeriesTitle { get; set; }
|
||||||
public String SeriesTitle { get; set; }
|
|
||||||
public SeriesResource Series { get; set; }
|
public SeriesResource Series { get; set; }
|
||||||
|
|
||||||
//Hiding this so people don't think its usable (only used to set the initial state)
|
//Hiding this so people don't think its usable (only used to set the initial state)
|
||||||
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
|
||||||
public Boolean Grabbed { get; set; }
|
public bool Grabbed { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class EpisodeResourceMapper
|
||||||
|
{
|
||||||
|
public static EpisodeResource ToResource(this Episode model)
|
||||||
|
{
|
||||||
|
if (model == null) return null;
|
||||||
|
|
||||||
|
return new EpisodeResource
|
||||||
|
{
|
||||||
|
Id = model.Id,
|
||||||
|
|
||||||
|
SeriesId = model.SeriesId,
|
||||||
|
EpisodeFileId = model.EpisodeFileId,
|
||||||
|
SeasonNumber = model.SeasonNumber,
|
||||||
|
EpisodeNumber = model.EpisodeNumber,
|
||||||
|
Title = model.Title,
|
||||||
|
AirDate = model.AirDate,
|
||||||
|
AirDateUtc = model.AirDateUtc,
|
||||||
|
Overview = model.Overview,
|
||||||
|
//EpisodeFile
|
||||||
|
|
||||||
|
HasFile = model.HasFile,
|
||||||
|
Monitored = model.Monitored,
|
||||||
|
AbsoluteEpisodeNumber = model.AbsoluteEpisodeNumber,
|
||||||
|
SceneAbsoluteEpisodeNumber = model.SceneAbsoluteEpisodeNumber,
|
||||||
|
SceneEpisodeNumber = model.SceneEpisodeNumber,
|
||||||
|
SceneSeasonNumber = model.SceneSeasonNumber,
|
||||||
|
UnverifiedSceneNumbering = model.UnverifiedSceneNumbering,
|
||||||
|
SeriesTitle = model.SeriesTitle,
|
||||||
|
//Series = model.Series.MapToResource(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<EpisodeResource> ToResource(this IEnumerable<Episode> models)
|
||||||
|
{
|
||||||
|
if (models == null) return null;
|
||||||
|
|
||||||
|
return models.Select(ToResource).ToList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,25 +18,20 @@ namespace NzbDrone.Api.Episodes
|
|||||||
|
|
||||||
private List<RenameEpisodeResource> GetEpisodes()
|
private List<RenameEpisodeResource> GetEpisodes()
|
||||||
{
|
{
|
||||||
int seriesId;
|
if (!Request.Query.SeriesId.HasValue)
|
||||||
|
|
||||||
if (Request.Query.SeriesId.HasValue)
|
|
||||||
{
|
|
||||||
seriesId = (int)Request.Query.SeriesId;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
throw new BadRequestException("seriesId is missing");
|
throw new BadRequestException("seriesId is missing");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var seriesId = (int)Request.Query.SeriesId;
|
||||||
|
|
||||||
if (Request.Query.SeasonNumber.HasValue)
|
if (Request.Query.SeasonNumber.HasValue)
|
||||||
{
|
{
|
||||||
var seasonNumber = (int)Request.Query.SeasonNumber;
|
var seasonNumber = (int)Request.Query.SeasonNumber;
|
||||||
return ToListResource(() => _renameEpisodeFileService.GetRenamePreviews(seriesId, seasonNumber));
|
return _renameEpisodeFileService.GetRenamePreviews(seriesId, seasonNumber).ToResource();
|
||||||
}
|
}
|
||||||
|
|
||||||
return ToListResource(() => _renameEpisodeFileService.GetRenamePreviews(seriesId));
|
return _renameEpisodeFileService.GetRenamePreviews(seriesId).ToResource();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,40 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using NzbDrone.Api.REST;
|
using NzbDrone.Api.REST;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Episodes
|
namespace NzbDrone.Api.Episodes
|
||||||
{
|
{
|
||||||
public class RenameEpisodeResource : RestResource
|
public class RenameEpisodeResource : RestResource
|
||||||
{
|
{
|
||||||
public Int32 SeriesId { get; set; }
|
public int SeriesId { get; set; }
|
||||||
public Int32 SeasonNumber { get; set; }
|
public int SeasonNumber { get; set; }
|
||||||
public List<Int32> EpisodeNumbers { get; set; }
|
public List<int> EpisodeNumbers { get; set; }
|
||||||
public Int32 EpisodeFileId { get; set; }
|
public int EpisodeFileId { get; set; }
|
||||||
public String ExistingPath { get; set; }
|
public string ExistingPath { get; set; }
|
||||||
public String NewPath { get; set; }
|
public string NewPath { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class RenameEpisodeResourceMapper
|
||||||
|
{
|
||||||
|
public static RenameEpisodeResource ToResource(this Core.MediaFiles.RenameEpisodeFilePreview model)
|
||||||
|
{
|
||||||
|
if (model == null) return null;
|
||||||
|
|
||||||
|
return new RenameEpisodeResource
|
||||||
|
{
|
||||||
|
SeriesId = model.SeriesId,
|
||||||
|
SeasonNumber = model.SeasonNumber,
|
||||||
|
EpisodeNumbers = model.EpisodeNumbers.ToList(),
|
||||||
|
EpisodeFileId = model.EpisodeFileId,
|
||||||
|
ExistingPath = model.ExistingPath,
|
||||||
|
NewPath = model.NewPath
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<RenameEpisodeResource> ToResource(this IEnumerable<Core.MediaFiles.RenameEpisodeFilePreview> models)
|
||||||
|
{
|
||||||
|
return models.Select(ToResource).ToList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace NzbDrone.Api.ErrorManagement
|
|||||||
|
|
||||||
if (apiException != null)
|
if (apiException != null)
|
||||||
{
|
{
|
||||||
_logger.WarnException("API Error", apiException);
|
_logger.Warn(apiException, "API Error");
|
||||||
return apiException.ToErrorResponse();
|
return apiException.ToErrorResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,12 +63,12 @@ namespace NzbDrone.Api.ErrorManagement
|
|||||||
}.AsResponse(HttpStatusCode.Conflict);
|
}.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);
|
_logger.Error(sqLiteException, sqlErrorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.FatalException("Request Failed", exception);
|
_logger.Fatal(exception, "Request Failed");
|
||||||
|
|
||||||
return new ErrorModel
|
return new ErrorModel
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using NzbDrone.Api.Mapping;
|
|
||||||
using NzbDrone.Api.REST;
|
|
||||||
using NzbDrone.Common.Cache;
|
|
||||||
using NzbDrone.Core.Datastore;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Extensions
|
|
||||||
{
|
|
||||||
public static class LazyExtensions
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
where TSourceChild : ModelBase, new()
|
|
||||||
where TChild : RestResource, new()
|
|
||||||
where TParent : RestResource
|
|
||||||
{
|
|
||||||
var parentList = parents.Where(p => foreignKeySelector(p) != 0).ToList();
|
|
||||||
|
|
||||||
if (!parentList.Any())
|
|
||||||
{
|
|
||||||
return parents;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ids = parentList.Select(foreignKeySelector).Distinct();
|
|
||||||
var childDictionary = sourceChildSelector(ids).ToDictionary(child => child.Id, child => child);
|
|
||||||
|
|
||||||
var childSetter = GetChildSetter<TParent, TChild>();
|
|
||||||
|
|
||||||
foreach (var episode in parentList)
|
|
||||||
{
|
|
||||||
childSetter.Invoke(episode, new object[] { childDictionary[foreignKeySelector(episode)].InjectTo<TChild>() });
|
|
||||||
}
|
|
||||||
|
|
||||||
return parents;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static MethodInfo GetChildSetter<TParent, TChild>()
|
|
||||||
where TChild : RestResource
|
|
||||||
where TParent : RestResource
|
|
||||||
{
|
|
||||||
var key = typeof(TChild).FullName + typeof(TParent).FullName;
|
|
||||||
|
|
||||||
return SetterCache.Get(key, () =>
|
|
||||||
{
|
|
||||||
var property = typeof(TParent).GetProperties().Single(c => c.PropertyType == typeof(TChild));
|
|
||||||
return property.GetSetMethod();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Nancy;
|
using System;
|
||||||
|
using Nancy;
|
||||||
using Nancy.Bootstrapper;
|
using Nancy.Bootstrapper;
|
||||||
using NzbDrone.Api.Frontend;
|
using NzbDrone.Api.Frontend;
|
||||||
|
|
||||||
@@ -13,9 +14,11 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
_cacheableSpecification = cacheableSpecification;
|
_cacheableSpecification = cacheableSpecification;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int Order { get { return 0; } }
|
||||||
|
|
||||||
public void Register(IPipelines pipelines)
|
public void Register(IPipelines pipelines)
|
||||||
{
|
{
|
||||||
pipelines.AfterRequest.AddItemToStartOfPipeline(Handle);
|
pipelines.AfterRequest.AddItemToStartOfPipeline((Action<NancyContext>) Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Handle(NancyContext context)
|
private void Handle(NancyContext context)
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
{
|
{
|
||||||
public class CorsPipeline : IRegisterNancyPipeline
|
public class CorsPipeline : IRegisterNancyPipeline
|
||||||
{
|
{
|
||||||
|
public int Order { get { return 0; } }
|
||||||
|
|
||||||
public void Register(IPipelines pipelines)
|
public void Register(IPipelines pipelines)
|
||||||
{
|
{
|
||||||
pipelines.AfterRequest.AddItemToEndOfPipeline(Handle);
|
pipelines.AfterRequest.AddItemToEndOfPipeline((Action<NancyContext>) Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Handle(NancyContext context)
|
private void Handle(NancyContext context)
|
||||||
@@ -31,7 +33,7 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
allowedMethods = response.Headers["Allow"];
|
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.AllowOrigin, "*");
|
||||||
response.Headers.Add(AccessControlHeaders.AllowMethods, allowedMethods);
|
response.Headers.Add(AccessControlHeaders.AllowMethods, allowedMethods);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using System.Linq;
|
|||||||
using Nancy;
|
using Nancy;
|
||||||
using Nancy.Bootstrapper;
|
using Nancy.Bootstrapper;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Extensions.Pipelines
|
namespace NzbDrone.Api.Extensions.Pipelines
|
||||||
{
|
{
|
||||||
@@ -12,6 +13,8 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
{
|
{
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
|
public int Order { get { return 0; } }
|
||||||
|
|
||||||
public GzipCompressionPipeline(Logger logger)
|
public GzipCompressionPipeline(Logger logger)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
@@ -19,50 +22,62 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
|
|
||||||
public void Register(IPipelines pipelines)
|
public void Register(IPipelines pipelines)
|
||||||
{
|
{
|
||||||
pipelines.AfterRequest.AddItemToEndOfPipeline(c => CompressResponse(c.Request, c.Response));
|
pipelines.AfterRequest.AddItemToEndOfPipeline(CompressResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Response CompressResponse(Request request, Response response)
|
private void CompressResponse(NancyContext context)
|
||||||
{
|
{
|
||||||
|
var request = context.Request;
|
||||||
|
var response = context.Response;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
!response.ContentType.Contains("image")
|
!response.ContentType.Contains("image")
|
||||||
&& !response.ContentType.Contains("font")
|
&& !response.ContentType.Contains("font")
|
||||||
&& request.Headers.AcceptEncoding.Any(x => x.Contains("gzip"))
|
&& request.Headers.AcceptEncoding.Any(x => x.Contains("gzip"))
|
||||||
&& (!response.Headers.ContainsKey("Content-Encoding") || response.Headers["Content-Encoding"] != "gzip"))
|
&& !AlreadyGzipEncoded(response)
|
||||||
|
&& !ContentLengthIsTooSmall(response))
|
||||||
{
|
{
|
||||||
var data = new MemoryStream();
|
var contents = response.Contents;
|
||||||
response.Contents.Invoke(data);
|
|
||||||
data.Position = 0;
|
|
||||||
if (data.Length < 1024)
|
|
||||||
{
|
|
||||||
response.Contents = stream =>
|
|
||||||
{
|
|
||||||
data.CopyTo(stream);
|
|
||||||
stream.Flush();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
response.Headers["Content-Encoding"] = "gzip";
|
|
||||||
response.Contents = s =>
|
|
||||||
{
|
|
||||||
var gzip = new GZipStream(s, CompressionMode.Compress, true);
|
|
||||||
data.CopyTo(gzip);
|
|
||||||
gzip.Close();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return response;
|
response.Headers["Content-Encoding"] = "gzip";
|
||||||
|
response.Contents = responseStream =>
|
||||||
|
{
|
||||||
|
using (var gzip = new GZipStream(responseStream, CompressionMode.Compress, true))
|
||||||
|
using (var buffered = new BufferedStream(gzip, 8192))
|
||||||
|
{
|
||||||
|
contents.Invoke(buffered);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.ErrorException("Unable to gzip response", ex);
|
_logger.Error(ex, "Unable to gzip response");
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool ContentLengthIsTooSmall(Response response)
|
||||||
|
{
|
||||||
|
var contentLength = response.Headers.GetValueOrDefault("Content-Length");
|
||||||
|
if (contentLength != null && long.Parse(contentLength) < 1024)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool AlreadyGzipEncoded(Response response)
|
||||||
|
{
|
||||||
|
var contentEncoding = response.Headers.GetValueOrDefault("Content-Encoding");
|
||||||
|
if (contentEncoding == "gzip")
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,8 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
{
|
{
|
||||||
public interface IRegisterNancyPipeline
|
public interface IRegisterNancyPipeline
|
||||||
{
|
{
|
||||||
|
int Order { get; }
|
||||||
|
|
||||||
void Register(IPipelines pipelines);
|
void Register(IPipelines pipelines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using Nancy;
|
using Nancy;
|
||||||
using Nancy.Bootstrapper;
|
using Nancy.Bootstrapper;
|
||||||
using NzbDrone.Api.Frontend;
|
using NzbDrone.Api.Frontend;
|
||||||
@@ -13,9 +14,11 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
_cacheableSpecification = cacheableSpecification;
|
_cacheableSpecification = cacheableSpecification;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int Order { get { return 0; } }
|
||||||
|
|
||||||
public void Register(IPipelines pipelines)
|
public void Register(IPipelines pipelines)
|
||||||
{
|
{
|
||||||
pipelines.BeforeRequest.AddItemToStartOfPipeline(Handle);
|
pipelines.BeforeRequest.AddItemToStartOfPipeline((Func<NancyContext, Response>) Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Response Handle(NancyContext context)
|
private Response Handle(NancyContext context)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Nancy;
|
using System;
|
||||||
|
using Nancy;
|
||||||
using Nancy.Bootstrapper;
|
using Nancy.Bootstrapper;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
|
|
||||||
@@ -6,9 +7,11 @@ namespace NzbDrone.Api.Extensions.Pipelines
|
|||||||
{
|
{
|
||||||
public class NzbDroneVersionPipeline : IRegisterNancyPipeline
|
public class NzbDroneVersionPipeline : IRegisterNancyPipeline
|
||||||
{
|
{
|
||||||
|
public int Order { get { return 0; } }
|
||||||
|
|
||||||
public void Register(IPipelines pipelines)
|
public void Register(IPipelines pipelines)
|
||||||
{
|
{
|
||||||
pipelines.AfterRequest.AddItemToStartOfPipeline(Handle);
|
pipelines.AfterRequest.AddItemToStartOfPipeline((Action<NancyContext>) Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Handle(NancyContext context)
|
private void Handle(NancyContext context)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user