Browse Source

Merge branch '2.3.x'

tags/2.3.8
Safihre 6 years ago
parent
commit
6b11013c1a
  1. 10
      .lgtm.yml
  2. 12
      .travis.yml
  3. 2
      ABOUT.txt
  4. 2
      INSTALL.txt
  5. 4
      PKG-INFO
  6. 24
      README.mkd
  7. 6
      appveyor.yml
  8. 8
      interfaces/Config/templates/config_notify.tmpl
  9. 12
      interfaces/Glitter/templates/include_overlays.tmpl
  10. BIN
      osx/unrar/unrar
  11. 12
      po/email/he.po
  12. 42
      po/main/da.po
  13. 14
      po/main/he.po
  14. 3
      sabnzbd/downloader.py
  15. 2
      sabnzbd/interface.py
  16. 29
      sabnzbd/misc.py
  17. 1
      sabnzbd/skintext.py
  18. 21
      sabnzbd/sorting.py
  19. 17
      sabnzbd/utils/servertests.py
  20. 4
      sabnzbd/version.py
  21. 2
      snap/snapcraft.yaml
  22. 6
      tests/test_functional.py
  23. BIN
      win/7zip/7za.exe
  24. 2
      win/7zip/license.txt
  25. 9
      win/par2/multipar/README_MultiPar.txt
  26. BIN
      win/par2/multipar/par2j.exe
  27. BIN
      win/par2/multipar/par2j64.exe
  28. BIN
      win/unrar/UnRAR.exe
  29. BIN
      win/unrar/x64/UnRAR.exe

10
.lgtm.yml

@ -0,0 +1,10 @@
path_classifiers:
oldinterfaces:
- interfaces/smpl
- interfaces/Plush
library:
- cherrypy
- gntp
- six
- "*knockout*"
- "**/*min*"

12
.travis.yml

@ -4,15 +4,15 @@ matrix:
- os: linux - os: linux
language: python language: python
env: env:
- secure: X5MY2HAtCxBI84IySY/XroFsFy2RIVhfsX+P1y3WXfvwBHYKCgrPV6BgwCg93ttkPmMS/IslP5Vp4F1OGqC9AZdxtxfHKpIPlIVxIHj6Lf6xwynmbGDQXjy73K13gjznK2mkGA0jcsp4Q5POS4ZKVkd6aOXnc8l8xS08+ztAvfxCC3tsMj2oMLEPP92j6zqb/1x2aX5+gVyVzrKgQQVKIk6R6jTxhIiOMPzj4+VMLXK8NEZqjV6RPwUjSoKHqJiV5URyf6/+2Ojmem3ilnpktn7xIJ/ZO1UNnZCrElOGZtmbryZFMctJvEAIQCOSdzsq/MACk0gocnOL3JQfDF5sYPOjJmc6sZI9PL78oFhwKaLkWEx565u8kdkLTMvv4A02HAmPzV1rKE1CTlEhsy0djU8mueCr9Ep1WyLJdY/igbyhR+dOd8fVo9Y1tY2o+ZisCsO5+PRfzhypK9xukqmWDJSXIWSuExUU/becXJ4IaTmlYJ+ArhKvkL90GmckH/zt9ZPIgr9Lq0OFva9uVHX+sbbsQZZ48lAmgiiiX335dONj8MxO8cDKsUT9FWQ8PzeJ8g8PErv5pmVVVODoOdKZg2Oo4jUsZG2yV8uUt9j87I2DPou4WiJ7wcTzQCPdzlaA5hdixPMyVUF/yCL+eKdJQFaKy3eaKwCxnAVp3WA2WdA= - secure: iMXx74c2eUhDPJrukvAFxCFNWYDk8JB2alQ89Hc3T1ckXfDS37vgUplTze1aGo+AefUkDSFmTreFk9hVJvd4SQTHz4wS+qp7HQJFWECjR16jZwobIbukNPNU1JamozZoOa2igoVIJ8/tVIdIpfcsGfzj9WogwUlpChWHIiI8SM/Fc0WK+M9rDPKBpgjEN2yom73jbC2ETxuQ/HMdMNnNS9S1vS7MY+2W69+xi5Kl9hP0HUBIG/JtVXu1a4SO5NgqL5aW4cgKtgg0IjpedBRMcC0rpyEz+lDtl2jXYR+mXQEO8uNZOwzV7SLrq/ROGwW+DMtfiiySKxmuYoL/JOm4kcLyEup51dgnTQc1RdEcaYfk0twDry67prnQ/sXAQphzjl0StrTpLfzWUsCvgXRp7+XWhX9ElHN4KelOcAc7YeTSXoPY6bENk8LSy1woJ2HbH5TkSvtVJ6xrmssV3bEMp7aGx7qv1D/uvyAEMulB79WwdLyoDxmG9eIgXfp3nICko4p9kisrzK0hVCGDRCHSYgTnDBGTMJU/SlRRNUepmXHXQUrqWyTWvy2HTMUTjuYBaaNcUqZvyHyyaDq0MNBotwDCmes5o8fZu456lB/B26LwUu7cOSbCw19ePlGBNnbjA9NmNoQGOo66era3NEVJLYv+H91PAPQyWpzOt0X53Gk=
- secure: gzvbgg+rdM/TfPOlXGE/JOW8VEfIJxwUnzt2bH07nj/PbREXQXrImC1SreMtwQX+gvd7bjIBZU/sgNSgRYcWKaSim4uNtAbinkcKQeP+V844ZY2Fabq/xpLluSP61vJLQ+hOLbnvilxmuI0E1Divahxo5qZJlwzCdk5u2txJRT/2LKGDT1lpGgIyDj9u0/ViAcpaAyfFR2Zd6ydHKbx+eFBE21LkyH/+GJmRiO0+qLIuCa2knmOJYjwBxRcPiAEDpbrRUbYDiNyzPqEVxJfCbsGYlo/QN/SnV6kTqM1WoFzvi4d1pDxDGRFLQj+KigihF6uY4eLC1e6yVQrDy0tyWKt6E+1tc8fH5dRS7AYtWMzURn/7Ebd72AiNIYaeAL8ZPqI7vw3ovFTqBS0h8Mg2uUZ503ytUvfwKyU9MgIkzXwmGuE37MCd0bRJ/blPS2DT+IMbrbEP90K5VrDrN/AGiYHR1TZ9GKUZd6xHibulEh2nNFMMQEga8nE2CWaJ3uJrCN7ud+4OJ0zCZFF7JiJTbOGApHg/aGWD/bYfg9sIh7up4PcxVs6RFxbf+M1aB8GO2A9aEZFow+djYVxiqf6esmzrnlsTfz16f8Txmez3BRftjVULre03a3Rt7WRxwYLveNlJos1nMw3G0CnruCe+wJbHEK4tEiqIXqB8UemT4zw= - secure: Cryq31K8wxt+q212/q7IHlLf4flH4riaiHssxR0/VfGACtMp3jOAVZ5RAOvX03LPYp+BuX2KAHFXDHeGHGzYmESkpzPCToZ3GpaOwP3ymc3RNeU6bd98yEQyQtM/wtY4uxPUWdwz5Uw5kkeynxw3y/QFsYceipB3u3oCvfB9n8SqWShjWpBFyFhSKS/SJjUqgNcAaA0pTP8l/crquZNhkug/J8Nlc/nC0H6ZSJKGu8UhkhZ0VSEY8dofZZkGG6YCIIEAqGasQqkra6x/D0uECfQnnDrTqekvklUG31/zy+awQXl+0NjLTIKyl2rHp5AUpSTlbPO2mDYdbWEWcRYmNsEEiGfvy3R9kGGbNijB5b57jvgsJapH8DkGRWseISdCBWqLH7C/OafNuMGzQ4s3UCN1aazqqN/IAJplVjSWiKA76Nbh385x88E8RaH7Gnvx1ZK88Lgf7Bz8Ar/O1dMviyP8WbM/vQQkVMdOk89y5O6G8ZwHFoj/v8w383irWMN2iU0Mf7GKW91ughpKrrKbXCmkT1bR9+tNYpKWU1O+1jgnGk65149GNC0K+9exWt0TK3pNSUa7b2nVzxeAqdCJjCoKBi2pLiRxYVI50V80M2p5Xw+5iiSiOhTLzFLT3YRi2VBjjBFa8BHJHBS9Pua4DaFc1w06XNej6K8rRV5We0s=
- secure: f5QGjZESH4khjLOO1Ntgtiol4ZvwcqHLIV1sdK162dVkNT6UKOTRQflj2UmRXzwiRzWtVX/Ri0zT0j+SUJy2+aqJY/gxvisdTIWzRQ3w/CJPGgCizSkTQEWJ2V/n7DUAJ4xerme36zYi21S3d8VEWVDzU/duLu3yhlN5x0wMCY+dDPSDTFubmptGeCmyxqBqGVd7gD3PaiK7fDBB/eAXbW3QxLLQfxLHmPsx8vzPhDTQiLFtY43jfnVGEBdUbxSMXbq2NRB5eXH3bBkW8u/5y9uoyuF45CQn8f3UB6F84L+/n9M2ryCGeSJOFuZqSUHXvRF2acON40jx3t4PVocEzYguPwewoiFxfFHjRWmiI4WljiN30taK0pgstmzLTedozK+NdZ0M8vD7MCyK0yegPQolzFRngWW5Y8NY1XwlBT9W2lqGmrFge+dB86wOArMcRlY62PTOJ9Zqspbe/6mBT4Tq4O2OsXxGX/x60W/NJynva9WAz2SLEi5Pjs6r1a3tyXssw4/8KVhWl92WfpOnWrZrnZlsxOTmcS2OhLB0FQikTv9T/i3CZNcCI4PELkExeIwh4JW1MY0iGeLDHcAUKryJGrRZj1x32Nt1uUPTPBi8l8EzNyNOUvbHYTdpBr5r2JW1orvT55OhvKauc3wB7ogj673iYsqx5jeazHhgJMs= - secure: O/8jVULQmqOLHkvIW21IsVuL7/B+3MhgRFaT4wltxk/x7TarEsQyahXdStsQ+I53mMRbSfsArdCHXwgIm13wROXfcEdt7iM0f2tGWUsm32q73RrjBsKzb8SRTKZNkL1dOjpgkdEHejZdVckKlg0GlpJTTowOdfi+SYinj4Hj52vrV9waHk296njKw98W5Y35lEtSH3DcAU2NHrDi7YqQvjiBzj9MviG1qpJZJ1RMxKrTXXCqjlYcxr8FwO2kGpMnkTFIDywi4OspLQ1InEGhM9MdrY9tqGVzW631nX1uRV8aNhl+bLhtRs0i3QtOisWMWO5z5SQN6pOqUWx3nnwLPJzuoL+wGMDC2tdVRmH1+cuYCwq97curNq4hv9FBs7P/RS4e22WAoW0jtLWnx/5voVes1EsQE5iW/iG0z4ih3MIk3dHN6h8HcNr83DRxOW8JKmA79IbtcVFReZJ2AXQhx6VmvdUaIi3IKpW79K89ZzEuoEEO5Eyti2LLz9rti0iVknHejGYKWDCABflGaKjnj62tpUsAB9EsPPuwBegoKRd2bVy3kJ+RWGcMc4QfzsEq39z2ftQ8XJ800ZuuQvl7nsk86Dso+Hgr/T+5xU2wU6vFbwoDCWsxdnK2LXNpf3ci5PBZFhG9zLMRk+yFyAfh8OdQr19lxclay0X6na1K8i0=
- os: osx - os: osx
env: env:
- HOMEBREW_NO_AUTO_UPDATE=1 - HOMEBREW_NO_AUTO_UPDATE=1
- secure: RI/WxBI5kTP5v0qZ6im5BwqPurzzwKIl8GSbM2dFSEiWYEbKwHTDJ3KDDsXqS8YMNaropNVgzsdpCGXYUWRNTraKVa9GZEGNJ+fQuBWK9wkJ0MDTYfL/QFSN1CDXXlg7k26VXu6PgvEFA5kyDfSpxrxXJC6yXOUeJqmebkU2fiQo7/5Vpb1WAwpYlBP6zL5lYt2lpJ85fhYEjuAeuP/9zdVIlgCB7rDCgUX7tCKKXgwbKXfcff7lOCneB00/RCmRuNp3/tohGlgrSXh4ivHx4XEQgRoiVdeR3RCKZa5tBIXANefuJ2VopBrAbSRmVBexQP1818IU/XLlwtEEpC1vulpkx+5JolWksCrx4uJkKdlH0KA4k1m88L0Q1Rmmnp9LgRgeEl5xqt5s6RR6lS63ChQYkVFgWandwlrWu7Uenne4401KbG58PzDXEGlsKhUXnYBX+SU6gwejImCMb3vszKRAge5QAQlkiruCu31W9tWpY9ezHYrbv9ckOqdFXf9qsPEnU352v/8qHFe7jT/+7RSYdUzuo/d2aQqPKfkb7sy1VLEznmbGmv1BH4rGNpxd5inlcFKsR099Hx7PWgY8MHZcnEP3PJ2kBseFzVP3WKXHDTcv8yR0w6EgQyMzSHl9Ah3WJJ7TXZQ82gcqF8LcmuKcqXcwTkffG3ww7Vzuq4M= - secure: iMXx74c2eUhDPJrukvAFxCFNWYDk8JB2alQ89Hc3T1ckXfDS37vgUplTze1aGo+AefUkDSFmTreFk9hVJvd4SQTHz4wS+qp7HQJFWECjR16jZwobIbukNPNU1JamozZoOa2igoVIJ8/tVIdIpfcsGfzj9WogwUlpChWHIiI8SM/Fc0WK+M9rDPKBpgjEN2yom73jbC2ETxuQ/HMdMNnNS9S1vS7MY+2W69+xi5Kl9hP0HUBIG/JtVXu1a4SO5NgqL5aW4cgKtgg0IjpedBRMcC0rpyEz+lDtl2jXYR+mXQEO8uNZOwzV7SLrq/ROGwW+DMtfiiySKxmuYoL/JOm4kcLyEup51dgnTQc1RdEcaYfk0twDry67prnQ/sXAQphzjl0StrTpLfzWUsCvgXRp7+XWhX9ElHN4KelOcAc7YeTSXoPY6bENk8LSy1woJ2HbH5TkSvtVJ6xrmssV3bEMp7aGx7qv1D/uvyAEMulB79WwdLyoDxmG9eIgXfp3nICko4p9kisrzK0hVCGDRCHSYgTnDBGTMJU/SlRRNUepmXHXQUrqWyTWvy2HTMUTjuYBaaNcUqZvyHyyaDq0MNBotwDCmes5o8fZu456lB/B26LwUu7cOSbCw19ePlGBNnbjA9NmNoQGOo66era3NEVJLYv+H91PAPQyWpzOt0X53Gk=
- secure: uXHKYgQAwnfhWKi7RKAEumMMZZTJBb878KpodRfs1fz0NffdPo5+Ak1ricNzOJ8wti8/lXycDS+YmnFs64lGUxL+zvbQlFv7QuKfN0uHfPlo6zux9Ha9pg1rSUI4zqZ9kmbtwc0I2mdy1VeWwHvnbQDXUIt6a+tTwYZL3MGdP6kNvtSXaYhbEoHExjqeHUtVhUTafvWGtwE7uN+sdvhwXQ0dWlz6HGub8qYjkKCmF9VG+OyLKjFHjLVDMQ7Jnng2l1ZOgHSh5g5m6r++NEwSzZ8wFVULdzv5eEcR9U+mHmonFKOA/ICcZGd8MhEuvz9BupfgDWFqSTb5JGxzlZ28YdtjcAudzrWQMSpP2R0ks2Ttxz9Kpgw1L75HMvj0smazHs7IEEiXf2Yr03bzeHg7CGXNqOYyEOxxrPaJekCjMlX/YGqT/iv/8pZPfew7k/iVJlvCam76WNXABjJncHJeMsCgkItYZAoRZJDc+7z8J4g4ys1Rk0V/difjjwc/pSeKbt6wDA/9cmZ7r4Cs1Yh9Pl/mw6kzWGGpejO7lmsayQN3Pw99QMcZByUHx5BR+ZtIfF7Sl+F0uDQJ0MntJcteF7z1Dam2jHlkLckb85j6YWup5ItLAj5Hz7V2YUwqFmQhfOWEAjxagNSNnB8we4YBWS4KDTBEVDm6ITTfddlYvCw= - secure: Yc9lY76AEXwG1uf+pg1xyTDo3gg8zsIqJ6K/WwJr7zStLGU6J5Qf/iW7jFzGxTbq0Kc6/dgb4VInYwlcyhjsRE3DI5LDqKiP2dZATP07crwZnzwrhxDPdYA+s1sI9YDJN90aZZm48DbUPFR7DPZjkDqyRJMRCFstZ/fJ//kSDVJvMjEOPEixzT6k5sRW2j9sctzEzqCHhroKaz5/m1sSBWa+pJx7C4A76NQFrMZEmlnWf0qKoUERaGn4hv5I3/38KQa0wy1q43obMoltmaFrbyIV4tx9M60kSGfaQdVVgwYgxPsINZeESJk+N4JCQSUKr0biAcKamPfgIbfEN4FbCGiFzHf5w/eIyUG0yUg42NtzzMVVS4I0s/aaPGKrjDrJNZ9bj8/oQjWDHtlRx7nrREdPI2Ch/MF8e8t03tDm5unhLIa6Fk1Ic9UbgwjtUqDvAne5+kwhsh8WpyU+VnttP/LyKTi2eqtADF6kPuxKM9DbTFE/IvCE2DXDFc6OOzAWoqhnbBgPrX0L5OlQLWoL13oi+yJMnBsF4Rd3rhqpNJ2sJTukeHT9z5yhkBEXHe9PatT0hiXZ7AxHsgX292k9Ti4se3pPxETkbR3r8iOklItMu1PViQsvfRyOFu+XloqMaPO31z48LmcPOps+/DYkbRyaTqBMdmPPRJghZ9lzvno=
- secure: HKaT52NUQh18kllFQTjpKC64KlDkWEz0XnIEKJffumctrJjCvoFZFNC7ip3j7Bi3yp2IeD2SMsdxrrT6YFKxx5FfSdPqpQnsY34bzdEFZQomNJg4n/tmBc350PoVQ0PvLQiVoCCfVbdS/b4makNK7A+d9KED+SEsQMAqKp2mSnGhATB9MwFaZL5S4nGnEkqW5+eeAQxJ8JRawwumOOx/xhPOoEMIfHMpyTwFI1yUh1nJhZ9k1nxHzPlM78goyIuf0MjeZfSZ2fIlNZGVruYM28i9hpO4bzPFhk51uryWv8DQZiZlpCkHl6Po7rVVf5pNqm+l9SD/t0DnhS2rJHdeFSI2lM/uZtdOxaY5fTTj83LbCGhFtuZnZRwoQ73tpda8J7Z1E5Ni9bi7vOiZQ4pEIPt4LLu0X607sPWMkqrmgalKQQS13b5oliyMpkIguvmj9822BpaNVqamIrfn0z38+0Gog8iuGlMAQnRO9tGDO4kbVLcZQTRWpSwIC3niTPjPgLq/N92XQ9xmccrFT7efwemgF65FNM5ltv8+9AmI+hsuyXfqeHaAV9wmxRAAhaqvRgnSLYa3u1CPn5fF2CDvPvPcyCEIWnyxc7dYHDpzAQDcyuSejtbnL8gpkDqEHpy23hTjgZnZD7Pk7PQ7ayA8zBumTMGZ+/GAn5Wmgce+w0M= - secure: RsFCZq/1Q6/++mgCZB6WsnIcbBsBwHFn6nfwC+vAomxbPtHevdiC930eIn8jKDza6Vmd4LoaMklvNOBEK1QpphbZXhKZIecakZOb+KyHVanSbQwErZCuVQdEo2p8cHJfuEh3guxmkE2OjAiBnSsgHlLmGiLAUF5GW5NPDLASPXIxXbBKOIKv7sTWj6tYYfVdUs1pQVz3Z+MkhRoS2uhVBOvQ14axtAtil1WmhgEJzuHAvjW29b1Q6l2goIuqoglqwKSna437CCt6mMFt6IVQqi36/lwXw0cYCLyJq3PURGDce6FdeQlwW0YfOXwT9k6BH+HcNuYmCSAbuL5hqC994avYbpemsBKKGfBK0Q8xZe0lQpS+R1C+iF3XXnPLU8B5TtALiBcFVRd3s291mxigxYqjkXbkgwVNAgkXKze+MhvrEQgoQwwhU3SbnmrZN8U6wW58MDYzjDxPaZdE5tUI+ROkfWeMRqtQrGNSJX6AwjkCrurW1/n0DXMlsUFnq4WGWF9nk8aHVzD8Y0cetQ+tLj3HxuxNqmAquewn+Z7pL41YTHlSTZ9+nHhI0GLQem6ANWL/4xJO8nBeOUETv1nULgbMyNOVaS9yBA7b2omE+Zuf8CMRCr9ID+Eeqtx1cUSMkWRymTdZvyPFPLjQ9KASTc7aCM7Cfc0aBceOoOOxMRw=
addons: addons:
chrome: stable chrome: stable

2
ABOUT.txt

@ -1,5 +1,5 @@
******************************************* *******************************************
*** This is SABnzbd 2.3.7 *** *** This is SABnzbd 2.3.8 ***
******************************************* *******************************************
SABnzbd is an open-source cross-platform binary newsreader. SABnzbd is an open-source cross-platform binary newsreader.
It simplifies the process of downloading from Usenet dramatically, It simplifies the process of downloading from Usenet dramatically,

2
INSTALL.txt

@ -1,4 +1,4 @@
SABnzbd 2.3.7 SABnzbd 2.3.8
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
0) LICENSE 0) LICENSE

4
PKG-INFO

@ -1,7 +1,7 @@
Metadata-Version: 1.0 Metadata-Version: 1.0
Name: SABnzbd Name: SABnzbd
Version: 2.3.7 Version: 2.3.8
Summary: SABnzbd-2.3.7 Summary: SABnzbd-2.3.8
Home-page: https://sabnzbd.org Home-page: https://sabnzbd.org
Author: The SABnzbd Team Author: The SABnzbd Team
Author-email: team@sabnzbd.org Author-email: team@sabnzbd.org

24
README.mkd

@ -1,18 +1,16 @@
Release Notes - SABnzbd 2.3.7 Release Notes - SABnzbd 2.3.8
========================================================= =========================================================
## Improvements and bug fixes since 2.3.6 ## Improvements and bug fixes since 2.3.7
- Hopeless jobs will be failed faster, based on the first article of - Changes to newsserver configuration could be delayed
each file. If 80% of these first articles is missing, the job is aborted. - Filenames would not be sanitized when using "Make Windows compatible"
- Option "fast_fail" added to disable the new behavior. - Sorting could fail on root-folders
- Added option to quickly add a verified test download - 7z-files were not listed as supported NZB archives
- Readout of some RSS feeds could result in a crash - SSL cipher settings were ignored during server test
- Direct Unpack could get stuck processing - Windows: update 7zip to 19.00
- Show Details on Servers page could break graph display - Windows: update MultiPar to v1.3.0.4
- Windows: Update MultiPar to 1.3.0.3 - Windows and macOS: update Python to 2.7.16
- Windows and macOS: update UnRar to 5.70
Still looking for help with SABnzbd (Python 3) development!
https://www.reddit.com/r/usenet/comments/918nxv/
## Upgrading from 2.2.x and older ## Upgrading from 2.2.x and older
- Finish queue - Finish queue

6
appveyor.yml

@ -1,10 +1,10 @@
environment: environment:
SAB_NEWSSERVER_HOST: SAB_NEWSSERVER_HOST:
secure: UNnTfVHDugC9amTucdTRyxe8RZfVBLYfI1EOTaDUjNM= secure: 6SvOPWr5ypJeoumXJAZh90DLpk4C/5UAvzwyX7OOUr4=
SAB_NEWSSERVER_USER: SAB_NEWSSERVER_USER:
secure: npe0D4TiEzXMUVMCH3+SHA== secure: Ty3ZG8T5vnacqIFPj5j5hg==
SAB_NEWSSERVER_PASSWORD: SAB_NEWSSERVER_PASSWORD:
secure: 28COv3RG+KAnBLxIrR1EDw== secure: bO3XHtWTleVF9AqRV/V/nA==
install: install:
- pip install --upgrade -r tests/requirements.txt - pip install --upgrade -r tests/requirements.txt

8
interfaces/Config/templates/config_notify.tmpl

@ -62,11 +62,6 @@
<span class="desc">$T('explain-email_rss')</span> <span class="desc">$T('explain-email_rss')</span>
</div> </div>
<div class="field-pair"> <div class="field-pair">
<label class="config" for="email_dir">$T('opt-email_dir')</label>
<input type="text" name="email_dir" id="email_dir" value="$email_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-email_dir')</span>
</div>
<div class="field-pair">
<label class="config" for="email_server">$T('opt-email_server')</label> <label class="config" for="email_server">$T('opt-email_server')</label>
<input type="text" name="email_server" id="email_server" value="$email_server" /> <input type="text" name="email_server" id="email_server" value="$email_server" />
<span class="desc">$T('explain-email_server') ($T('host'):$T('srv-port'))</span> <span class="desc">$T('explain-email_server') ($T('host'):$T('srv-port'))</span>
@ -404,9 +399,6 @@
<script type="text/javascript"> <script type="text/javascript">
\$(document).ready(function(){ \$(document).ready(function(){
// Autocomplete and filebrowser
\$('#email_dir').typeahead().fileBrowser();
// Expand on enable // Expand on enable
\$('.col2 input[name$="enable"]').change(function() { \$('.col2 input[name$="enable"]').change(function() {
if(this.checked) { if(this.checked) {

12
interfaces/Glitter/templates/include_overlays.tmpl

@ -1,3 +1,5 @@
<!--#from sabnzbd.constants import VALID_ARCHIVES, VALID_NZB_FILES#-->
<!--#set $file_exts = ', '.join(VALID_NZB_FILES + VALID_ARCHIVES)#-->
<!-- Notifcation box --> <!-- Notifcation box -->
<div class="main-notification-box" style="display: none"> <div class="main-notification-box" style="display: none">
<div class="main-notification-box-uploading"> <div class="main-notification-box-uploading">
@ -433,7 +435,7 @@
<form data-bind="submit: addNZBFromURL" class="col-sm-6"> <form data-bind="submit: addNZBFromURL" class="col-sm-6">
<fieldset> <fieldset>
<legend class="row-wrap-text">$T('Glitter-addFromURL')</legend> <legend class="row-wrap-text">$T('Glitter-addFromURL')</legend>
<div class="input-group" data-tooltip="true" data-placement="bottom" title="$T('Glitter-nzbFormats')"> <div class="input-group" data-tooltip="true" data-placement="bottom" title="$file_exts">
<input type="text" name="nzbURL" class="form-control" placeholder="$T('enterURL')" /> <input type="text" name="nzbURL" class="form-control" placeholder="$T('enterURL')" />
<span class="input-group-btn"> <span class="input-group-btn">
<input type="submit" name="Add" value="$T('add')" class="btn btn-default" /> <input type="submit" name="Add" value="$T('add')" class="btn btn-default" />
@ -444,10 +446,10 @@
<form data-bind="submit: addNZBFromFileForm" class="col-sm-6"> <form data-bind="submit: addNZBFromFileForm" class="col-sm-6">
<fieldset> <fieldset>
<legend class="row-wrap-text">$T('Glitter-addFromFile')</legend> <legend class="row-wrap-text">$T('Glitter-addFromFile')</legend>
<div class="input-group" data-tooltip="true" data-placement="bottom" title="$T('Glitter-nzbFormats')"> <div class="input-group" data-tooltip="true" data-placement="bottom" title="$file_exts">
<label class="btn btn-default btn-file"> <label class="btn btn-default btn-file">
<span class="glyphicon glyphicon-file"></span> <em>$T('Glitter-chooseFile')&hellip;</em> <span class="glyphicon glyphicon-file"></span> <em>$T('Glitter-chooseFile')&hellip;</em>
<input type="file" multiple name="nzbFile" class="form-control" accept=".nzb,.rar,.zip,.gz,.bz2" data-bind="event : { change: updateBrowseLabel }" /> <input type="file" multiple name="nzbFile" class="form-control" accept="$file_exts" data-bind="event : { change: updateBrowseLabel }" />
</label> </label>
<span class="input-group-btn"> <span class="input-group-btn">
@ -569,10 +571,10 @@
<input type="hidden" name="retry_job_id" /> <input type="hidden" name="retry_job_id" />
<fieldset> <fieldset>
<legend>$T('opt-extra-NZB')</legend> <legend>$T('opt-extra-NZB')</legend>
<div class="input-group input-group-addfile" data-tooltip="true" data-placement="bottom" title="$T('Glitter-nzbFormats')"> <div class="input-group input-group-addfile" data-tooltip="true" data-placement="bottom" title="$file_exts">
<label class="btn btn-default btn-file"> <label class="btn btn-default btn-file">
<span class="glyphicon glyphicon-file"></span> <em>$T('Glitter-chooseFile')&hellip;</em> <span class="glyphicon glyphicon-file"></span> <em>$T('Glitter-chooseFile')&hellip;</em>
<input type="file" name="nzbFile" class="form-control" accept=".nzb,.rar,.zip,.gz,.bz2" data-bind="event : { change: updateBrowseLabel }" /> <input type="file" name="nzbFile" class="form-control" accept="$file_exts" data-bind="event : { change: updateBrowseLabel }" />
</label> </label>
</div> </div>
</fieldset> </fieldset>

BIN
osx/unrar/unrar

Binary file not shown.

12
po/email/he.po

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n" "Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n" "POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-08-01 16:45+0000\n" "PO-Revision-Date: 2019-01-21 15:26+0000\n"
"Last-Translator: ION IL <Unknown>\n" "Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Hebrew <he@li.org>\n" "Language-Team: Hebrew <he@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n" "X-Launchpad-Export-Date: 2019-01-22 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n" "X-Generator: Launchpad (build 18856)\n"
#: email/email.tmpl:1 #: email/email.tmpl:1
msgid "" msgid ""
@ -91,9 +91,9 @@ msgstr ""
"הורדו $size\n" "הורדו $size\n"
"\n" "\n"
":תוצאות העבודה\n" ":תוצאות העבודה\n"
"<!--#for $stage ב $stages #-->\n" "<!--#for $stage in $stages #-->\n"
"שלב $stage <!--#slurp#-->\n" "שלב $stage <!--#slurp#-->\n"
"<!--#for $result ב $stages[$stage]#-->\n" "<!--#for $result in $stages[$stage]#-->\n"
" $result <!--#slurp#-->\n" " $result <!--#slurp#-->\n"
"<!--#end for#-->\n" "<!--#end for#-->\n"
"<!--#end for#-->\n" "<!--#end for#-->\n"

42
po/main/da.po

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n" "Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-01-04 12:42+0000\n" "POT-Creation-Date: 2019-01-04 12:42+0000\n"
"PO-Revision-Date: 2018-11-28 04:21+0000\n" "PO-Revision-Date: 2019-01-26 09:26+0000\n"
"Last-Translator: scootergrisen <scootergrisen@gmail.com>\n" "Last-Translator: B.E. <Unknown>\n"
"Language-Team: Danish\n" "Language-Team: Danish\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2019-01-05 05:41+0000\n" "X-Launchpad-Export-Date: 2019-01-27 05:44+0000\n"
"X-Generator: Launchpad (build 18847)\n" "X-Generator: Launchpad (build 18857)\n"
"Language: da\n" "Language: da\n"
#: SABnzbd.py [Error message] #: SABnzbd.py [Error message]
@ -889,11 +889,11 @@ msgstr "FEJL: CRC mislykkedes i \"%s\""
#: sabnzbd/newsunpack.py #: sabnzbd/newsunpack.py
msgid "Unpacking failed, file too large for filesystem (FAT?)" msgid "Unpacking failed, file too large for filesystem (FAT?)"
msgstr "" msgstr "Udpakningen fejlede, da filen er for stor til filsystemet (FAT?)"
#: sabnzbd/newsunpack.py [Error message] #: sabnzbd/newsunpack.py [Error message]
msgid "ERROR: File too large for filesystem (%s)" msgid "ERROR: File too large for filesystem (%s)"
msgstr "" msgstr "FEJL: Fil for stor til filsystem (%s)"
#: sabnzbd/newsunpack.py #: sabnzbd/newsunpack.py
msgid "Unpacking failed, write error or disk is full?" msgid "Unpacking failed, write error or disk is full?"
@ -994,6 +994,8 @@ msgstr "[%s] Bekræftelse i %s, kræver reparation"
msgid "" msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr "" msgstr ""
"Invalide par2 filer eller invalide PAR2 parametre, kan ikke bekræfte eller "
"reparere"
#: sabnzbd/newsunpack.py #: sabnzbd/newsunpack.py
msgid "Fetching %s blocks..." msgid "Fetching %s blocks..."
@ -1029,7 +1031,7 @@ msgstr "Bekræfter"
#: sabnzbd/newsunpack.py #: sabnzbd/newsunpack.py
msgid "Checking extra files" msgid "Checking extra files"
msgstr "" msgstr "Tjekker ekstra filer"
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking" msgid "Checking"
@ -1837,11 +1839,11 @@ msgstr "Deaktivere kvota styring"
#: sabnzbd/skintext.py [Config->Scheduler] #: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category" msgid "Pause jobs with category"
msgstr "" msgstr "Pause jobs med kategori"
#: sabnzbd/skintext.py [Config->Scheduler] #: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category" msgid "Resume jobs with category"
msgstr "" msgstr "Genoptag jobs med kategori"
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates] #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off" msgid "Off"
@ -2539,7 +2541,7 @@ msgstr "Gentagelse test"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Test download" msgid "Test download"
msgstr "" msgstr "Test overførsel"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "" msgid ""
@ -2825,19 +2827,19 @@ msgstr ""
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Keep all jobs" msgid "Keep all jobs"
msgstr "" msgstr "Behold alle jobs"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs" msgid "Keep maximum number of completed jobs"
msgstr "" msgstr "Behold maximal antal af gennemførte jobs"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days" msgid "Keep completed jobs maximum number of days"
msgstr "" msgstr "Behold gennemførte jobs maximal antal af dage"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Do not keep any completed jobs" msgid "Do not keep any completed jobs"
msgstr "" msgstr "Behold ikke gennemførte jobs"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Jobs" msgid "Jobs"
@ -3179,7 +3181,7 @@ msgstr ""
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Allow proper releases" msgid "Allow proper releases"
msgstr "" msgstr "Tillad reelle udgivelser"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "" msgid ""
@ -3197,7 +3199,7 @@ msgstr "Mislykkes job (flyt til historik)"
#: sabnzbd/skintext.py [Four way switch for duplicates] #: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job" msgid "Tag job"
msgstr "" msgstr "Marker job"
#: sabnzbd/skintext.py [Three way switch for encrypted posts] #: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort" msgid "Abort"
@ -3251,7 +3253,7 @@ msgstr "Nogle servere levere en alternativ NZB når et download mislykkes."
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Use tags from indexer" msgid "Use tags from indexer"
msgstr "" msgstr "Brug mærker fra indexer"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "" msgid ""
@ -3293,7 +3295,7 @@ msgstr "IONice parametre"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "External process priority" msgid "External process priority"
msgstr "" msgstr "Ekstern proces prioritet"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Disconnect on Empty Queue" msgid "Disconnect on Empty Queue"
@ -4099,7 +4101,7 @@ msgstr "S01E05 Episodemappe"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Job Name as Filename" msgid "Job Name as Filename"
msgstr "" msgstr "Job Navn som Filnavn"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Title" msgid "Title"
@ -4171,7 +4173,7 @@ msgstr "Originalfilnavn"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Original Job Name" msgid "Original Job Name"
msgstr "" msgstr "Oprindelig Job Navn"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Lower Case" msgid "Lower Case"

14
po/main/he.po

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n" "Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-01-04 12:42+0000\n" "POT-Creation-Date: 2019-01-04 12:42+0000\n"
"PO-Revision-Date: 2019-01-05 10:03+0000\n" "PO-Revision-Date: 2019-01-14 07:17+0000\n"
"Last-Translator: ION IL <Unknown>\n" "Last-Translator: ION IL <Unknown>\n"
"Language-Team: Hebrew <he@li.org>\n" "Language-Team: Hebrew <he@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2019-01-06 04:48+0000\n" "X-Launchpad-Export-Date: 2019-01-15 04:50+0000\n"
"X-Generator: Launchpad (build 18847)\n" "X-Generator: Launchpad (build 18855)\n"
#: SABnzbd.py [Error message] #: SABnzbd.py [Error message]
msgid "Failed to start web-interface" msgid "Failed to start web-interface"
@ -1129,7 +1129,7 @@ msgstr "התגלה קובץ פגום ,%s שגיאה בטעינת"
#: sabnzbd/nzbqueue.py [Error message] #: sabnzbd/nzbqueue.py [Error message]
msgid "Failed to restart NZB after pre-check (%s)" msgid "Failed to restart NZB after pre-check (%s)"
msgstr "(%s) לאחר קדם-בדיקה NZB נכשל בהפעלה מחדש של" msgstr "(%s) לאחר קדם־בדיקה NZB נכשל בהפעלה מחדש של"
#: sabnzbd/nzbqueue.py #: sabnzbd/nzbqueue.py
msgid "NZB added to queue" msgid "NZB added to queue"
@ -1161,7 +1161,7 @@ msgstr "%s ריק NZB קובץ"
#: sabnzbd/nzbstuff.py #: sabnzbd/nzbstuff.py
msgid "Pre-queue script marked job as failed" msgid "Pre-queue script marked job as failed"
msgstr "תסריט קדם-תור סומן כנכשל" msgstr "תסריט קדם־תור סומן כנכשל"
#: sabnzbd/nzbstuff.py [Warning message] #: sabnzbd/nzbstuff.py [Warning message]
msgid "Ignoring duplicate NZB \"%s\"" msgid "Ignoring duplicate NZB \"%s\""
@ -3255,7 +3255,7 @@ msgstr ""
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Pre-queue user script" msgid "Pre-queue user script"
msgstr "תסריט משתמש של קדם-תור" msgstr "תסריט משתמש של קדם־תור"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Used before an NZB enters the queue." msgid "Used before an NZB enters the queue."
@ -4024,7 +4024,7 @@ msgstr "החל מסננים"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Presets" msgid "Presets"
msgstr "קדם-קביעות" msgstr "קדם־קביעות"
#: sabnzbd/skintext.py #: sabnzbd/skintext.py
msgid "Example" msgid "Example"

3
sabnzbd/downloader.py

@ -903,7 +903,10 @@ class Downloader(Thread):
self.init_server(server.id, server.id) self.init_server(server.id, server.id)
def update_server(self, oldserver, newserver): def update_server(self, oldserver, newserver):
""" Update the server and make sure we trigger
the update in the loop to do housekeeping """
self.init_server(oldserver, newserver) self.init_server(oldserver, newserver)
self.wakeup()
@NzbQueueLocker @NzbQueueLocker
def wakeup(self): def wakeup(self):

2
sabnzbd/interface.py

@ -2591,7 +2591,7 @@ def GetRssLog(feed):
LIST_EMAIL = ( LIST_EMAIL = (
'email_endjob', 'email_cats', 'email_full', 'email_endjob', 'email_cats', 'email_full',
'email_server', 'email_to', 'email_from', 'email_server', 'email_to', 'email_from',
'email_account', 'email_pwd', 'email_dir', 'email_rss' 'email_account', 'email_pwd', 'email_rss'
) )
LIST_GROWL = ('growl_enable', 'growl_cats', 'growl_server', 'growl_password', LIST_GROWL = ('growl_enable', 'growl_cats', 'growl_server', 'growl_password',
'growl_prio_startup', 'growl_prio_download', 'growl_prio_pp', 'growl_prio_complete', 'growl_prio_failed', 'growl_prio_startup', 'growl_prio_download', 'growl_prio_pp', 'growl_prio_complete', 'growl_prio_failed',

29
sabnzbd/misc.py

@ -280,13 +280,10 @@ def has_win_device(p):
return False return False
if sabnzbd.WIN32: CH_ILLEGAL = '/'
# the colon should be here too, but we'll handle that separately CH_LEGAL = '+'
CH_ILLEGAL = '\/<>?*|"\t' CH_ILLEGAL_WIN = '\/<>?*|"\t:'
CH_LEGAL = '++{}!@#`+' CH_LEGAL_WIN = '++{}!@#`+;'
else:
CH_ILLEGAL = '/'
CH_LEGAL = '+'
def sanitize_filename(name): def sanitize_filename(name):
@ -295,9 +292,15 @@ def sanitize_filename(name):
""" """
if not name: if not name:
return name return name
illegal = CH_ILLEGAL illegal = CH_ILLEGAL
legal = CH_LEGAL legal = CH_LEGAL
if sabnzbd.WIN32 or cfg.sanitize_safe():
# Remove all bad Windows chars too
illegal += CH_ILLEGAL_WIN
legal += CH_LEGAL_WIN
if ':' in name: if ':' in name:
if sabnzbd.WIN32: if sabnzbd.WIN32:
# Compensate for the odd way par2 on Windows substitutes a colon character # Compensate for the odd way par2 on Windows substitutes a colon character
@ -306,9 +309,6 @@ def sanitize_filename(name):
# Compensate for the foolish way par2 on OSX handles a colon character # Compensate for the foolish way par2 on OSX handles a colon character
name = name[name.rfind(':') + 1:] name = name[name.rfind(':') + 1:]
if sabnzbd.WIN32 or cfg.sanitize_safe():
name = replace_win_devices(name)
lst = [] lst = []
for ch in name.strip(): for ch in name.strip():
if ch in illegal: if ch in illegal:
@ -316,6 +316,9 @@ def sanitize_filename(name):
lst.append(ch) lst.append(ch)
name = ''.join(lst) name = ''.join(lst)
if sabnzbd.WIN32 or cfg.sanitize_safe():
name = replace_win_devices(name)
if not name: if not name:
name = 'unknown' name = 'unknown'
@ -345,10 +348,10 @@ def sanitize_foldername(name, limit=True):
illegal = FL_ILLEGAL illegal = FL_ILLEGAL
legal = FL_LEGAL legal = FL_LEGAL
if cfg.sanitize_safe(): if sabnzbd.WIN32 or cfg.sanitize_safe():
# Remove all bad Windows chars too # Remove all bad Windows chars too
illegal += r'\/<>?*|":' illegal += CH_ILLEGAL_WIN
legal += r'++{}!@#`;' legal += CH_LEGAL_WIN
repl = cfg.replace_illegal() repl = cfg.replace_illegal()
lst = [] lst = []

1
sabnzbd/skintext.py

@ -829,7 +829,6 @@ SKIN_TEXT = {
'Glitter-addFromFile' : TT('Upload NZB'), 'Glitter-addFromFile' : TT('Upload NZB'),
'Glitter-chooseFile' : TT('Browse'), 'Glitter-chooseFile' : TT('Browse'),
'Glitter-addnzbFilename' : TT('Optionally specify a filename'), 'Glitter-addnzbFilename' : TT('Optionally specify a filename'),
'Glitter-nzbFormats' : TT('Formats: .nzb, .rar, .zip, .gz, .bz2'),
'Glitter-submit' : TT('Submit'), 'Glitter-submit' : TT('Submit'),
'Glitter-openInfoURL' : TT('Open Informational URL'), 'Glitter-openInfoURL' : TT('Open Informational URL'),
'Glitter-sendThanks' : TT('Submitted. Thank you!'), 'Glitter-sendThanks' : TT('Submitted. Thank you!'),

21
sabnzbd/sorting.py

@ -377,7 +377,12 @@ class SeriesSorter(object):
else: else:
head = path head = path
return os.path.normpath(head) if head:
return os.path.normpath(head)
else:
# The normpath function translates "" to "."
# which results in wrong path.join later on
return head
def rename(self, files, current_path): def rename(self, files, current_path):
""" Rename for Series """ """ Rename for Series """
@ -626,7 +631,12 @@ class MovieSorter(object):
else: else:
head = path head = path
return os.path.normpath(head) if head:
return os.path.normpath(head)
else:
# The normpath function translates "" to "."
# which results in wrong path.join later on
return head
def rename(self, _files, current_path): def rename(self, _files, current_path):
""" Rename for Generic files """ """ Rename for Generic files """
@ -848,7 +858,12 @@ class DateSorter(object):
else: else:
head = path head = path
return os.path.normpath(head) if head:
return os.path.normpath(head)
else:
# The normpath function translates "" to "."
# which results in wrong path.join later on
return head
def rename(self, files, current_path): def rename(self, files, current_path):
""" Renaming Date file """ """ Renaming Date file """

17
sabnzbd/utils/servertests.py

@ -32,28 +32,33 @@ from sabnzbd.misc import int_conv
def test_nntp_server_dict(kwargs): def test_nntp_server_dict(kwargs):
# Grab the host/port/user/pass/connections/ssl # Grab the host/port/user/pass/connections/ssl
host = kwargs.get('host', '').strip() host = kwargs.get('host', '').strip()
if not host: if not host:
return False, T('The hostname is not set.') return False, T('The hostname is not set.')
username = kwargs.get('username', '').strip() username = kwargs.get('username', '').strip()
password = kwargs.get('password', '').strip() password = kwargs.get('password', '').strip()
server = kwargs.get('server', '').strip() server = kwargs.get('server', '').strip()
connections = int_conv(kwargs.get('connections', 0)) connections = int_conv(kwargs.get('connections', 0))
if not connections:
return False, T('There are no connections set. Please set at least one connection.')
ssl = int_conv(kwargs.get('ssl', 0)) ssl = int_conv(kwargs.get('ssl', 0))
ssl_verify = int_conv(kwargs.get('ssl_verify', 1)) ssl_verify = int_conv(kwargs.get('ssl_verify', 1))
ssl_ciphers = kwargs.get('ssl_ciphers')
port = int_conv(kwargs.get('port', 0)) port = int_conv(kwargs.get('port', 0))
if not connections:
return False, T('There are no connections set. Please set at least one connection.')
if not port: if not port:
if ssl: if ssl:
port = 563 port = 563
else: else:
port = 119 port = 119
return test_nntp_server(host, port, server, username=username, return test_nntp_server(host, port, server, username=username, password=password,
password=password, ssl=ssl, ssl_verify=ssl_verify) ssl=ssl, ssl_verify=ssl_verify, ssl_ciphers=ssl_ciphers)
def test_nntp_server(host, port, server=None, username=None, password=None, ssl=None, ssl_verify=1): def test_nntp_server(host, port, server=None, username=None, password=None, ssl=None, ssl_verify=1, ssl_ciphers=None):
""" Will connect (blocking) to the nttp server and report back any errors """ """ Will connect (blocking) to the nttp server and report back any errors """
timeout = 4.0 timeout = 4.0
if '*' in password and not password.strip('*'): if '*' in password and not password.strip('*'):
@ -74,7 +79,7 @@ def test_nntp_server(host, port, server=None, username=None, password=None, ssl=
if not got_pass: if not got_pass:
return False, T('Password masked in ******, please re-enter') return False, T('Password masked in ******, please re-enter')
try: try:
s = Server(-1, '', host, port, timeout, 0, 0, ssl, ssl_verify, None, False, username, password) s = Server(-1, '', host, port, timeout, 0, 0, ssl, ssl_verify, ssl_ciphers, False, username, password)
except: except:
return False, T('Invalid server details') return False, T('Invalid server details')

4
sabnzbd/version.py

@ -4,5 +4,5 @@
# You MUST use double quotes (so " and not ') # You MUST use double quotes (so " and not ')
__version__ = "2.3.7" __version__ = "2.3.8"
__baseline__ = "7a8df5ee916455f17a2c5841f87a7641bb123859" __baseline__ = "83ccc0a765e8b3e1350d89fe4a02b95e17fd059e"

2
snap/snapcraft.yaml

@ -3,7 +3,7 @@ version: git
summary: SABnzbd summary: SABnzbd
description: The automated Usenet download tool description: The automated Usenet download tool
confinement: strict confinement: strict
grade: devel grade: stable
icon: interfaces/Config/templates/staticcfg/images/logo-small.svg icon: interfaces/Config/templates/staticcfg/images/logo-small.svg
version-script: | version-script: |
grep -oP '(?<=^Version: ).*' PKG-INFO grep -oP '(?<=^Version: ).*' PKG-INFO

6
tests/test_functional.py

@ -121,6 +121,12 @@ class SABnzbdDownloadFlow(SABnzbdBaseTest):
if not ssl_imp.get_attribute('checked'): if not ssl_imp.get_attribute('checked'):
ssl_imp.click() ssl_imp.click()
# Lower number of connections to prevent testing errors
self.driver.find_element_by_partial_link_text("Advanced Settings").click()
pass_inp = self.driver.find_element_by_name("connections")
pass_inp.clear()
pass_inp.send_keys(2)
# Test server-check # Test server-check
self.driver.find_element_by_id("serverTest").click() self.driver.find_element_by_id("serverTest").click()
self.wait_for_ajax() self.wait_for_ajax()

BIN
win/7zip/7za.exe

Binary file not shown.

2
win/7zip/license.txt

@ -3,7 +3,7 @@
License for use and distribution License for use and distribution
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Copyright (C) 1999-2018 Igor Pavlov. Copyright (C) 1999-2019 Igor Pavlov.
7-Zip Extra files are under the GNU LGPL license. 7-Zip Extra files are under the GNU LGPL license.

9
win/par2/multipar/README_MultiPar.txt

@ -25,7 +25,7 @@ Be careful to use those special features.
[ System requirement ] [ System requirement ]
MultiPar requires a PC with Windows XP or later (Windows Vista, 7, 8, etc). MultiPar requires a PC with Windows XP or later (Windows Vista, 7, 8, 10, etc).
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
@ -71,10 +71,11 @@ Don't send current PAR3 files to others, who may not have the same version.
[ How to install or uninstall with installer package ] [ How to install or uninstall with installer package ]
Double click setup file ( MultiPar126_setup.exe or something like this name ), Double click setup file ( MultiPar129_setup.exe or something like this name ),
and follow the installer dialog. and follow the installer dialog.
At version up, if you want to use previous setting, overwrite install is possible. At version up, if you want to use previous setting, overwrite install is possible.
You may need to re-start OS after over write install or uninstall rarely. Before overwrite install, you should un-check "Integrate MultiPar into Shell".
You may need to re-start OS after overwrite install or uninstall rarely.
To install under "Program Files" directory on Windows Vista/7/8, To install under "Program Files" directory on Windows Vista/7/8,
you must start the installer with administrative privileges by selecting you must start the installer with administrative privileges by selecting
"Run as administrator" on right-click menu. "Run as administrator" on right-click menu.
@ -99,7 +100,7 @@ In either case, user made icons and association are available for the user only.
[ How to install with archive version ] [ How to install with archive version ]
Unpack compressed file ( MultiPar126.zip or something like this name ) in a folder. Unpack compressed file ( MultiPar129.zip or something like this name ) in a folder.
MultiPar.exe is the interface of MultiPar. MultiPar.exe is the interface of MultiPar.
You can create short-cut icon or send-to link at Option window later. You can create short-cut icon or send-to link at Option window later.

BIN
win/par2/multipar/par2j.exe

Binary file not shown.

BIN
win/par2/multipar/par2j64.exe

Binary file not shown.

BIN
win/unrar/UnRAR.exe

Binary file not shown.

BIN
win/unrar/x64/UnRAR.exe

Binary file not shown.
Loading…
Cancel
Save