From 0abe1620c63c8e5887c0ea1988cb2be9dd1ac6ce Mon Sep 17 00:00:00 2001 From: deranjer Date: Sat, 3 Feb 2018 14:22:21 -0500 Subject: [PATCH] closes #9, closes #8, closes #3, closes #4, added new notification features, search torrents, change directory, force seed torrent, updated Readme --- README.md | 20 +++- config.toml | 4 +- documentation/images/frontend.png | Bin 68695 -> 64952 bytes engine/cronJobs.go | 7 +- engine/doneTorrentActions.go | 96 +++++------------- engine/engine.go | 21 ++-- engine/engineHelpers.go | 2 +- .../TopMenu/Modals/RSSModal/RSSModalLayout.js | 15 +-- .../src/TopMenu/Modals/deleteTorrentModal.js | 4 +- main.go | 46 ++++++--- public/static/js/bundle.js | 21 ++-- storage/storage.go | 21 +++- torrentUpload/desktop.ini | 3 + 13 files changed, 125 insertions(+), 135 deletions(-) create mode 100644 torrentUpload/desktop.ini diff --git a/README.md b/README.md index 9cce8aa7..a82e6459 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,19 @@ Image of the frontend UI - Automatic stop after seeding ratio reached - Pushbullet notification on torrent complete - Automatic move of completed torrent to new directory (leave symlink behind for seeding) - - Doesn't work on Windows yet, have to copy file for now + - Symlinks don't work on Windows yet, have to copy file for now ## Roadmap - Early-Mid 2018 + - [X] Ability to modify storage path of torrent after it has been added + + - [X] Backend to frontend notification messages + + - [X] Global Rate Limiting for Upload/Download Speed + + - [X] Add torrents from watch folder (cron job every 5 minutes) + - [ ] Unit testing completed for a large portion of the package - [ ] Stability/bug fixing/Optimization rewrite of some of the core structures of the WebUI and base server @@ -40,8 +48,8 @@ Image of the frontend UI - [ ] Ability to set priority for individual files (just added to anacrolix/torrent so coming soon, already added to my UI) - [ ] Ability to view TOML settings from WebUI (and perhaps change a few as well) - - - [ ] Ability to modify storage path of torrent after it has been added + + - [ ] Authentication from client to server - Late 2018 @@ -96,6 +104,12 @@ The `config.toml` file contains all of the settings for the server part of the a SeedRatioStop = 1.50 #automatically stops the torrent after it reaches this seeding ratio #Relative or absolute path accepted, the server will convert any relative path to an absolute path. DefaultMoveFolder = 'downloaded' #default path that a finished torrent is symlinked to after completion. Torrents added via RSS will default here + TorrentWatchFolder = 'torrentUpload' #folder path that is watched for .torrent files and adds them automatically every 5 minutes + + #Limits your upload and download speed globally, all are averages and not burst protected (usually burst on start). + #Low = ~.05MB/s, Medium = ~.5MB/s, High = ~1.5MB/s + UploadRateLimit = "Unlimited" #Options are "Low", "Medium", "High", "Unlimited" #Unlimited is default + DownloadRateLimit = "Unlimited" [notifications] diff --git a/config.toml b/config.toml index c736fc36..72bcdb96 100644 --- a/config.toml +++ b/config.toml @@ -3,7 +3,7 @@ ServerPort = ":8000" #leave format as is it expects a string with colon ServerAddr = "" #blank will bind to default IP address, usually fine to leave be - LogLevel = "Info" # Options = Debug, Info, Warn, Error, Fatal, Panic + LogLevel = "Warn" # Options = Debug, Info, Warn, Error, Fatal, Panic LogOutput = "file" #Options = file, stdout #file will print it to logs/server.log SeedRatioStop = 1.50 #automatically stops the torrent after it reaches this seeding ratio @@ -19,7 +19,7 @@ [notifications] - PushBulletToken = "o.QW6G7F6FUOKXCUKmw948fBceCUn0msFi" #add your pushbullet api token here to notify of torrent completion to pushbullet + PushBulletToken = "" #add your pushbullet api token here to notify of torrent completion to pushbullet [EncryptionPolicy] diff --git a/documentation/images/frontend.png b/documentation/images/frontend.png index d56087e27caed1c78b01eea4ffbbfc523b3109f5..901adf9a0f1cad461c49417bfa8f9f9d9c0d1357 100644 GIT binary patch literal 64952 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

am3hCPrTq?+M9x%YL zEMppXh0`FVRo((VE-j2oW%dH6DN(=Bfso^R^9#AIIoCvW=hkbX-+Z7zUbyt{Uj$kb zje|aB-Prg8wiu?sPSe(JQ$Q%*erp+%yS=6w{mn$^_tQO=PTiJ``b3g40xtTyWy#@L z4^9&GB|bp>8Qx1%X!yRCwF2N%4S$%uiXYOhe%|w?SClq-eAt={fe*;pup%OGzuXO= z1a)YKYZmHP!f~4Ux%MDG+XNFn73I&-uad%UK^_-nAZZ7`g2B-KGSc1|B`W)GSY~=f z>cQ6F_pz-VlL1=NUQ&F*ytX(N_AP7joy+3FMy(yhum?H8MPh#5OPF#H zIkZkFgJL_X0bmz0WIC3H2iRfj5EA>PpfCAItY~d_*g9b@cx^sm8+(9gfg3*ED_IEt zOyEKAaCdP2_Dk>qm*0IM+I{M3eHVcFgS~=KtHse7(cX*OB+5?+Db8m3H|13YL_9AZee*k*xW-9!B)SYT90&taR~FB zBt;$lCMkg50;1UoSnio~gj*7S{5?|AUWdR#W*m{F*&MaAEw@dIHj4JqPTf5e^K^@- zHxHPi`!;jqc3Bk(hzPS^&qY7`h*e1GFZX)GcW=sE0UJOAErj>>vk0^7r&^Q^)Mxfx zXJ?6$`nR}fQ{`0J3-GS*6LSkNINSE5L5zM`iNJt~Q3a3u1+@f>yYK5*w|W(kygeRB zvk~n#yLI4~;KOl}*kV=|=ksq5{QUjPUJmSrvevuf z^sDQ|j_YA7SD(imnXEhZ^J4zQ-`>*n#PjKOD>}ZX3Gy*G;1?Y4dnVm^SCCWq-$H%# zN(YgD{t&|}-hTrZL0-pAxduo)rS>v1ME=kT{Bv}A<8glRk6Z8xn4)}tl`==^VcRH= z4~lh+Y{5I}h##F=2GnF1XQU%%KLQro6oOL60VrrOJB#tv%UZ5dlZ3??FH+6b*2hoB zKYy!SYFl!05p*8MWn*sl+=4nwWO4-#YPL?Kzo#RE(LBUKPu0A;5j_MztU`L9al&9G z-OWaQ35O$UcX9A7f!$Y4qaL=MH3`?I5O1s6jfs|deZX;q)NSIC)0Dm-HM38&%YH&8 z{eeS-r@p7V@#(y&uZV$O+gODd%u!f(UC8ql101v{w`j=#7GdZS8TaFdh~jdzrom(d z;5TtA*wh3x<0?cXxseYty5G$tY&fyUo2hm#+^y*N!A@fwI2kJJkKcL`k(Q5$IK;)I zt%g35ZB9mVxe5(SBM!Qo>^b|B2nnFUy3&@e1iL zq-?k)!kdEeigsrpix{1*67>enEFzS*<8q1uGxi+Tfvy*1`V&+{MW49dh;7L|V7H3? z6D%xv3l(P+?c$#dntk0kf1lzl_#G=uSKOL;yg}18(w1SYIP;y#RxSxK7gy--J0DP( z9CiZTsM~vKFV$ROb?IV(ULd(vAwz{Z{;67^AvNm#+yhGQou%xRV}omG5bz^&kIkJ@=a*PRGk9QYI>Fmwjbg=5-M>NL zIVwXtw5M5k_%4*|ASSpU;~E8Yr4B;`>Y;vT+bxXpJbI?T^@Vv;+&g>+_MgM5D7AXl zC&`V64VbwOR}Sd*iWNj9*Dm3FrE(L=HGoSrYFkjybu0QaI>_a)mUA+ihnuM#sTYW2 zaK%8^Z^6}r6;aJ-9BJ?_{solx1icxKt|ajCLJz$+O5xM2?@O6XMl=0>M5^&{TKGjZ zZT%_>Gfn@?;xwB}+ap`Krf`)Qmk-fZpr5KCAIi>RH#n3?SQ-@WKfT;{v94ftdQRLp zd+N4GPohw#m^mv0P#QOuiX;u-f=}zpqd8t5#ZA`Cc?(&vo zg^~bkx4EOaYoy1A>lTMC_PXx|lK*B~6L!9qa?+}ixu+@y-^hC1jLWt1>N1!i^x4Fr z{o@)CWuBtg`w0Wd7dDra*D&DpwqUGsO{iTT{9h*JQKGNU$ zGyeyX#b>R%Y)+NWm6X#c4i4F}CJ^hJ&r67ZfR3IqN%Xj#u^g(ougVp;0ACwdB{DMo zgcs@Eyb2~{+S_q*nz4M-?9o94A2Cpniw~3(QgW&YOs=aIlp8tF6-k~Rw2<@2N?|4W z?FMK7LL|*`SZI$EFbZFC{n594HZ4rKLC7G5UUtDL;5yah@P;sb#VP?>&wlI7D3Ge2$HU8r0uLMnNKJvR4Hho1CiHY zzk&P7uP0-L3l{6R!oKI&fIMXy>e4*$Y$9FJn0qnJR=@tvMQ?9u&iqH~)+)X>+YqE$ z+UEQ3T)oogWf9oR_{deJib155vtA%NCd|w*q?f6%((ty`D{nreR#^}y=FVVRTao6Ve2Fctv^f{P8Ib0jZnrLpKP<}+ZKQoD6)k4ue(0m9`= zzMe0SyQcg7wPv?7W~O45#mUDkhjrx-H!hyIf|Ydq!O@d#oOsx}^T42d%6rHdY5BCK}ppTOUT2r4Tdl#RH?ZW-5(B>5Q{sZqz_`^EJ{Bw3O zR|6RuRP4jElgN4Av-WD^9HUJ@p*^l1L-ZGh0PK9@k5`|Hk{_L3Z* zq3!JdgeI?vyFT;p&n=X?{OxfGzfPR8Q3D`pzhDkd$stInrL~!Ubn9tMk8G;-6g$hv z8ll75FPNKEKBTY}omN>wQp~7?;hNQ38U(_`*~k5@9c`RHUrM*`DLb4dtN39Qq9e5g zpDAJ*RzPP(N+DJI@3a5kz$L*GbYUHa>6m!f*2AYIn?%~wwW|n?3PZLI7cG4DphB$2 z>rTIErgb}$ky#cB1%l~w=JuRjih6$$pB3!9mQNIAC-A~n7@~t;mNq~Sv6zR2wKuA` zG{jgAqK)uI@{afrqG?iR8r4+W{I;LP=4tting=4V=JvLn-=*#2@GQo|FV@!K2b04H zC@6aRE&lD&-Q1408lQq@qVsh@nTMAzibY3;nSNe!Kf@N=JitJFMMo_6@~v1^EY9Vh zt)GsIx$4ElcGgP4nNmaQb&sw(=kntBHZhkA-f^IFzuoQd26{a8y!Dpo3cYsJx=us{ zlLp0-kK$aGnlA}q@&v-z&Y)d*F2LzJhpGihXWyzkP}(DjXc4qp!45x~|n z;6bcGIigU>``LN^TRI@QnrX5xjEVf2Y;Q%Cz~VhOa#O~Nr~IUhXFVl%my_jz6nntq zfG{#0pjJCBN$~w^L5xBO zm!c4C{>a6w+J;uSvDap~LMBVw4`lq%Of->RLX(=z)Nkkv6r~_0sd)w)IA+aKXW%XA2$xuy*^ff5P(gQUST389{Q^sv6o&* zcswQ4&=ENmKKP_hV2E*cvl5jWoEk4ZI3~YZNiv;hbGkw8ec@2ca&#~ZaRvL@W;LoZ zOpS8xIkfksI6Jj^<>|a_+S8hP4?t=CaIt*Zdwq0yVG>)Qjlwn;eD=Iu{I8B)m3ru! zIXV`|La<30e=zm8O8h}>z08x8wNKe79X%gkCL4)zy7YTBWH+dK)jacMJJ?_oH1yR2 zqOfe9c1$?Z*LBf8FILFyXgX`(^k%d%4iUDY_xb8*>N=7r5T+0|BqqJ}q+jISMAw zoKjN}BPr(((cFpD?>XsghWae10;7%VpuHY!La^LAosA25=-7zsg5!NUle{5yZIbNj zs9PTab@k{YjS! zxBhn8Y{bGs*?MPS+xR*2r6_hN_Y$}|wY2%Si^@^r?0lB(*JPEGvUEQGU=TW$$(N+( zg3>wz?S3|CT`?zDsMDxGpZvvf^Y6X7nwL#Tmafla4+pP>A?lkWpb>3iNNdl|FH?&H zk{ws-HLVWWNr-6Hd@pb-M8$mvQnM00JIU^>;(4+z!WQDxsp4&f_PDdd} zit@p`nTBZ)YFc;XG+wB`6Fu)$sqIS5vk30V@h~+pnN2G0;nfUu^&um3dlS|Q{3MrU zR??ag{HVLG8LH`r>TRLLrDzwyng_nz>gPZ#s8<^Y~)a)#0 z*__bKsbn`VzwO!}E+wmMJYGpef+ zUX-d7$R;dU$Th_9m0CVoD^i!j5lm9(+{Aa-<2(wYNyC@W#Mfp;H<^i5b$^tq*i6(Z zd{_-%eH09~T|WR(@A!!S6L@IS=)r+WKl!sejafjJGo5LBSu&uiO?Wc_WqmEc)1fHO z+emvhtiQO}Ki>6z`oA=`z@Al{J$l$|VR$#g%Wy>pw@mSkT`f&PiK)^XnYW7o+3eGDRb1ikrHhEJUb zKP$zdz!*t7ay3g|cCjK9dtzULv^TXxi zs66=(fuYUKZP{FEO3TjvPv#sHmQT?3E}Wnlu(bV7zM0)39ro^(T;uK=jpadN*H5_> zwi@f?cQ1-6*W4$D)a=&$-AKyFXXPPp+$ru01F;J6CSn@3SDutc+otqy(CSY*%$gOz zG}2xb^rn0~%5celdnu)wwlc`~;L9$3aS@{%zH+Sk^K@rkF6!Jg(Ac+InrM~S=Gz$y z+yWlgErZ{=l(N7(`zx?AwiyPOz6p~b-Y7+ax0SV%nbxRCc%XRA7O58 z;O_hmIKL|bbL137{|(@?ZtcrT_YJsLw>dN);Ipwj4GhGqiG}tp!1P@WpRdP1PVPaj zetze{Nu|4}b5eojs1NXh2Oh{90hF{5-f$T*-P5*zyN07`A)da$vU*Op zTK1!WnjEpOs>HtKCGc`SCk+l`=T3*1A^%wPzDQ!`q|z;G!N5eEGZ+}uaIrfV2kG~4 zYpK0K&Kr1p50=7We75P20 zXOrlRwFV>8jpBj3Guoe5~U~wZqE)Bft!c5p%3^ae3kCL4t_P+o-zV%2$rvR@6|(Lh=3Y6_g*kryuRO_XQu>M z{J8jtQRXX0sdQ6l%CI{JiB;9cik%@|0SD zx(kwmgN0xpA}*5rfqQZQaPt0q?;|r9WfgeJ(#4~IH?&d@u&cgaX}wAwjGzBDSKYhy z=<-SW$#e?e);qhDPB(D}zUY3yzUvx2Y)0|thGQw}^Z|i`un+j}ZVv)n3Lh8-#Bz+{ zhNGYVR2tp9`URq`hxX~aKwE~fZR&aYJ!RFE2TtE%eA^2l^hh~Ifh_l0!o~*|K_tq6 zvjcRAYEUHLxqR;nJraPqIq$su##9F7f=|op%DT=;0~(zW{qVWaEr2NY`D^6vJH4agFu=E*1BunlWP><%Dw%d)q9Lg zgHPhx1|kBO!HDmtUQA8S4t#oikps0pzrHkCy^5btlJ{MF8xJ`~t+@s5NmN22y0v9o z2MX%$t6J|J-E=LTl33M_rPy*S02 zx!@?v*mt|}-aw@5WLpyFTD?BSq#C#=&jHTigTax*^eOm*Zt_k41@Oyu2Hy;_O4BnR zaIs)Qlt6N#hZX%I!TQ}}$2lK>Q=DtzW?t0RFR%;`y|D1%i{r-yIa+T8poxJx8mDhNk#m+BA? zzzG18`lcNbR#@M>|2(4ICmAvK&LPELx_fvlgm{=w(GScgu;j20VrS82 zI|9k^blJpVG#ehntFTcEf}Pr9D5&!$)W_ukNNT{9Z%2Cgy~K(6ZwTKKTa=3tvBK#PGHTe%hfg!?|~pRls6w=bNBX)5!1w zNIoD%s3wHMvjb79>ys(%NSTr`W~+>0dYk}5=t!CMJuLFiuE0*d61^ozpH@vV5BgK% z4iN#ap1v}EEZp@$?u#TEFot=fL=YwgpU$NnJh_++U*fo2+Xv=sWjZ^h?aeBwVg3k0ZpdcxdcgS^zZ!q(z1jNGL*p zNFYQA351f|_e0&5*>|7&a9>*6@Hi1An0-YnLH|Umd~)J_=lo zUK2Vu1uZ5pCtxq3&?!W)XE91o+xDKyY zv{)+x&`bCNJwy)jZg3RjIKb`oJ_FSP`@x0otK#dRRnoXC9?PrclrxAF&(qX`4951-ppI>S+_9H3wK#B3O3Nb^%LyC`!o)HEHW3ZxDP543jkH z+{gBSmSuo}U4l&X4H>5uM0IN}V>?ecrc+xnbW?7sW^rn93fg+%koyW4X#^%b_}!c5 zU|Ax8)gLy@|Ijt?DeF$KOQ9J7V`u?+>F)=CpEbk?mw*+I0KMx2z-=23Y!zq+PivLA zjewPr7A$q(Q+u`qfh9g7#lH=q1rj|+q--y@0zM$y`5t_L6(aUyfA1B zSbPN3l^Ge{0Ki4g^DktS2VQL;64lcD0-a>!+tXcU;7*TZy=fYXbOH4R?TJg-MzwT!h3R#86i0Y95!yo(X zHP&XcPKlR$_aRL?^FD0?)nf2y?EmgjPkBp@Os%j)#1s+VsmY`X>*1sGhvrg4MAzb* z-X1UZoW#88@m7kMU99w+S{e||RmqB4GMi4RD3VCTbxo!T6hrz4;?ZU zQRAJLIQaAsVS$J%0gug+R17Uppj2L=oG{>#G?6D`MejV3gVm$V4$qh-<7c!$@-M7% zyB`bqEK;+A8oK(2VnkR0M$D`JfLtMmbd@(6quKd<+^uUA7baktof`D(;0!KwD)EG^ z)XNK;$T`kv_PmuNTdFKP)11>`B&X(DeV<(-UFfr%Qbe{7UEsuDAwaX;`QpU;!SP&e ziBv9O4lXHmNChsw;t-P&_y<>g4CEF^e)cJ~{{7xzuj%C7?f%x2O z9i};Eg|RSJ6WlGcveVhux7JQk!@n$B_m@@$8aunoB16^6y!OahK}JKKG+onqHifWc zAQ@Z8b~%%J$m&H{IeBnfkX~;1OB1}>G|9WY=2vbl#@l>Jq0x|tp%Tx8UVNJ3xu~9= z7A#jL<+e+a{ATuLkDqgQnQIiEgQywi?Os^{tY;4aez63x*7}Tr@gg47{%up9H_I%2 zP5O4R(qvyHjC|Xvc~a?#D)H&dw4Sz&=Uj6JyS+k4v%R!?(V2b&GhAuR+@NdJkqlLD zsKMK0JZ@=nkBc&Aeh)VHoXSx(HLra-eS4(JXZXoQ=TX66E&i!UGJl$Il!r@JYn@dJ zTJ$2%OJVq^#aujPj8D>=7>v_$B1PB2HBDERU8nngfEP0Vs7`Z_M^kUPXBugiE(7qj z{4zcQtDkSyDQD_F6((#ISsIUwXLdfJUM`oWYiwqCADm>y-=^KuJ(pf#l(+S4N1?@; zn?FsnNcom=^AHLuv*iKU)%!#M`$k1R(gkbaJB zK&2bZ$!t4VGt-r$cGkN3h(>y$nIGk3pkMmJjdb5?d(q)e8M{NzXf`U&r2Oc_XWx!e zBSaPk50Fe<_4HgdwDls@q`;(Vo?{i3#hbF4qC#k0 zt6YP|wG^g0!RZ#i))sWVxG`RWPj)GIq?Uj0RCZ8dSP*T8QC{n$N6p)5bp6$iLN|Nf z6K6Ijwz6+ap<~VX%pRPScUNKrdyX?ZcsF~zR-ElDhj-HAK1tTI)$HT<((E#4(rmB9 zcyjkNdzNS-YV*Ou5uO~pwqk56PwrveICuX(L9@yE&8c;sMk!t7!eV3L_9!?@Mt8(d zpjmyk*m2dHn3;7E^vq6l*Y=^dmQFQqkJ*h~>4)5IX#IKh#VBInYvJGA-Emoo3GKIN={D$C(k_s-#(#z2+uG+)n?{~F4 zt?x@Q3@Qw#rBKngw>so4Uu`gxSG!zu5^VLZncoeH49|t`$4B0VFGW)im<-q7rY`(B zSnF#pQn=Mm!b~`6IzJkRFY)8HGCD-9`85j_Ot5jj$)Y%T4|5O(v4#xf&;38G;3>zN zkMsLeXUeNdL5ygvoe55Kcuwt7V^jq*N@>~1WDLHaHLE7vXEJQ60#aN;X={9=c&>%G@Ztoq3}!n??uW$v>Xk6J9E%6vQR`85~tnE}l5VSUluIxRokgP-2Ls>OH?>nvGta)dp0 zyZWM^L@dT^FFCAsYmJB$Y@K?3!DrjXPU{RqrkCFR%9D7ScUqxk&9e?Q^d#1@ofI4{ z0QSn(`2xPEDY39-wcv;bruNSrr&soe5#Pky{}1GsV|MWUvkI1l?>i2Cp_24J zkA4_|v%6URAhZO50>PKA%sRa?z$^cF-~ZsFQZ14H3OQwE%WN$GZbFbbP&*$}JD(_G zn`jL`dfWc#Q-R&iBA#;$`Wy^w)i4j}WIaCMTo@3er$u$pytg6uUe~esPw?nbNzKxz z+8_Y-0J=%P2d0{c&QNCB6^QDD0A$3wYf4bi4|uS*?U|-h5J`AxjXru7#K1-iAh2D2 zvkpEFqEPf){}m9*eT0QHOJq5SEr;XKfKd}>iDt17Ls!P$KvxP}n^v63&Ur zrVT->U^v*G4XiNH;-F|q3NsH~&^wywTr*WU0XPOlz*O4-rrP@$5yT8_*>fp_OJh1U z({bSP*yaNV4uESL^uiZrbF8wQe3n+eW)r!2ZIDIUksv@dgX8z|^Yb0RkU-oOpea8P z&iM+wo1k5Q+A0iZdxNkboY!Rof^8^beNQYukKpAw7v$$xgM*#H-Pn$P{V5+_27#O&2u}eC1#yi4n1jh}hp?^+D=vyKfS!P0 zb2XsXiUX&VhJ81Hx9Ya+?Rb3h_COf76-3hRU}6D#w)Ml@dUncPo3@^UxD8krX1P!V zMfd&1Zc)(UY7UMG)@f7XJ!C+W{JTHhmjKK@w3cqIl%AI#1L3m?7{rW~TRT+myi1t;v)4D`zl990Rwm9;&9rZ zeR8AG7J9HqcdLcqtl2rUT~Nd4{8a|%F|law?V(nk!PtpaMb#Mzo@Vg_PL*M%dFy1? zg)6$up7G`_19DJydM$2vS)RkLKSpGaf;}x`69$-1XK|O_V{>;D71InBLN4=AUfEsZ zv5`hn>S*uMg#pM91karb%GkYCytvC{U3vi ztl41Os1jF4j>_#f#@Gkxp*`s|X0gU&r^r z4%WV9wbL_SnqsM-2c};<4&mEW9OwbGLBQ2a^?#bdY$MvcG6{rDk!PgTl@|=^-r@^t zuImz^@dZn6Tlp-GML}!`Z>VP;-5F=Pv zP>&H|v%6NoWOcqA8W0W!R4TL9{I0YKR#!gGg=JF97B&yhe*b>KCv<38s==0T!C++b zf70n_wAfqI)i8Cx|MXofd!9L9m1W_Gza5-AS$b(&rR-wI({Z|P#8R*%xuh7eZH;VB zP%LZ!FfNqvsleW&nT3GyJ1VnAwhzq{08-E+sumb-HHY%M*L<1r3IRogq^O48;ndOT z(M>u^gGUDfajR(e&NxbvsGwf>2qBPJ-i4s7DbgtYa^`)nnG!Xmn_j&pk@h~lCT>F9 zC+u^T)X~U_WtS6<+*l)93@)L3_L3SD;WIDg0h4KDcZSZ4yh_zHKSuPY0C!LkUQxh* z>8=qx(s(ba3(u`Cr)QeRk7?JH7uc-c$SxI90 zo&6_xwf>~TLjk5l{~2#wg~wRGg(*?fJpTer`|tnQKp%EQGl!+%<@y~)S6b}YmTMY1 zanX*8O3Xcybr0N#-$%YpEk25achT)Kzp?Ru)8Zyper%$PX?60q!H7k6(w~H!x0{a> zy~B3nEjinpff!pP_SGKp&B+`%xemu7l?XENdgXu#oUa6vYU32LC;j$QX=gXW($2r@ zQb?8>iu#55`6GUMPFEy?DEq;9`)!x2uurc@qvHuSDi}?*QvBjzFUx4>+Q6t&wG%z> z;9BBx4M$91_(2af^A7WJg=ltJ>rKGF*Hb4GcsaCG#yNv6Qr?Mo2I$&OFy(wVtW!HZZJx9*hMcGLQh zJMwyeN}l0)&^#x8c`V6B^tfnlQ1b*;mgV@Ewoxx#o z2f8z1-8Ns%@501bcMhhwk>3~#^dQ};zjxRf-NQmjISqgs2!2J>v@NnVSdqRK0z0SC@e zF>%#zm`FCxU*$^BEn5Czb$Qq)JHBG9%Bn4qKGbNNZ0_UKgf2sF-I2j2&%n(O1E#tx zvI4NO(QK`!XEl<5ykco{p7a{o?gbOrK09|l zQR~sAQc};(s<~qc&IJu*Nw(=)7}s{t$T@T1ZoiS;EDfwc#?H0e5*Jr}l2JQ<0&&&4 zg3=1(|-QXRCOb=8dNpd!`y7FXAQ4mE>k_7uzp#{a|t=^l_N z-+1TcL$xO--HIZ%l2C@HLun|3lawWukx`cEub~yyc}usFi^$*DEGlx3vR`qn@`W=| z<=lmXb)y|$EvYBB&~7*HH}g(019y79I*STsa{%B6x(`VS)e-U)r26B-<|$A zU7g(gJPm!5A92)&>ilM76w`=$*_BZ!S||)WKYSF30m+U+`B! zq{ohJJ*2wmR9dxQ?fb<wlNYkVcAc)jy3wln#2Pr$pNp_O!qT zi|rlih>oev(>d1A7M}5B5JmTGe?o6lTGuV9q)%GXBY3M&;;*50cV!-R$Z&GUhww-Z z=91kBQ47)1v{93!`6-$=ai-}&5XHcEvEesn?7d3FvT6V!T2nkf@h@%$!CO_-o^P`n zR!9Ehe~`~-xc9#jxZApwN8XchEi9m&BW7#yBpx&K3xxQ6SN{$IksmJ(0|XlUz(^SN z71|QBL^|ZPNdVmT4$?n?n5(p^C^aL>R3$#biFrd%oB>|H1_5o&e}L(LhYz>P^B~~&89BTpM(;Se3tHBvjq78M=qNfxL4UUA&a-o=jzW&F&b+#x702g$BgxvQ^N=u8f zb<}1-+?!?;j&^q+CDbna3LdD#4raX_c^}=xODcssfnY@%LgY{X@#`y4p7wnvbS{3_ z{7}@B99U6H2G-ODdk0pEj`V*GA_io}$5`b9)S8shJ;n(Zj3%1ti@6An+fYKzMdV-L z!FFYSu_2&#y~&;faSgcsZU6f)2qd8CdhuYHkN@%{)PwJcjCvX8gC8O$=8bkH9vwN| z{!gM7i5RpqxR#E4G*TlPr${8mL9NyJXHWi5eDnV{gu{QU$V)#G#L7KQvU1P5S`B1# z>|!62)taj7|GjWGHz!yYQ7NB&ydkol@zYlp%p;pNj290yi z0hPC7xrAL@Y%Iy&sw6Lw6w%PyK)5@X8gmczhgWTy?G6VJ1P3LEEukC9Z${2F4b*u2kvGgn}`#+>36@v4@u#OgpCD8+avmh-iYcqy$P^y zFj8`TVbDLo7>id?amX5Y3a+xTz})%*E}#?%@|u7Q3tqjd`8Jr2Vk6i~lAg656- zHGhnI$}ExZtaj9GzWCM7eYS)fh|a!pZdl55Ocd~7B1}}FSpFOMCG|~NsuA}LiccWT zO^G`(7rdvjCtxw9cfyV2LGlXFxYOt3L(IP8;mTCkODlcvuPGg^U3atVYj=MKt%;0_ zw$7e-C*KET`LO=diya3Ft2ZN#cSIKkH9hDk4$@Nx2 zq5>I=&e`0d`dPz~w3zs-?!|XD{Ycklc>7Sb0%vQ45dNxpp~I&XiP@*y%nomtD4Cv}Q2rjfzfH z&L%`XSw{`JOWCMTioiNHO17oU8NOZF&M);)1J$p>-#V2E?%H6xoJKwkFH7G&VmQ*a zZzb{(sNi_f6|xqE>yUlEaMd{WU4c@kURhW&>4A86mxH%q7*pB*015b@MjoiM9~hcxa<< z6iP|aqnEYGZy`6>z;+2V$+bX40kr$<5X#su8#K0j=(Ok7p&;)tZ6zw3E&=$K1vXW%M_jITit zveRD0P@w+QsN!~;-r0UlseG#^VPz@(Tl5gQQPgnP-DULYE)ssmI^^d&rE^<{H~6Pl z=XFi(oLgxVDVps#`gTlab0#uZ6gzZ6cRwiu7)v#_oGI?xT8X=Jqf_HrD9#dSlk|$(Bvr zUP|@4$Wbtrb;sx@d+SQ%2+wl5jo{oKT`#mcsm6wXRBO&u&e}!2w0h&wN=qzzHZ7>-VuaXVSk-59)ee9ReEHu=^HC(x-?%TcjRo`#q(hs zv4aorqXWsWni=qxRWx?>)dlr@loYJlU13*bneUlixHr5|c_FN{BUtvDK)qFdgTJ*x zp_05bL;5M_5OT*Hg}ty(+Erhvt@_Lq2lVD|?|XA|GD=$W9gXg-=ICos>RZ+?Sz)iJ z-yh(1eryAr6yl+(pk|yPyApE zVAg15y|>TE=k@wD?zF#f!QRg(KfDGtd7<4mu}!oklX!~#t~kwXnlKole`_dJ7$h zOJIemj#wXT2;AI#hcu~@6)Pxe`}3#|)8$qImCKwgFf=wi7n^uZUqjIfm-?TKeR7A+|JG8XW)mZ2~pcuN1-Y7`&qW}u#mMK(ZA29C<6teBUvIn_Dup*8Bx>WFg1Gf8LbrFB# zIMF})?GCKNY$)uZ)i?tiwi(hwY>bjq??rbwN4z5g?5m3#GA(*=n~Fq3=a)u(*0PyGxy+Ws5rUO{JS6N2x+NNic5nCq?###hYSoL2B97O`z}vzOF9d z_KJ=ts2r*O2`Fmwmk&j>13|6&)JbVbzdG!@dL@Qjzhj{q%%+hqR!ws;XU!T|bN1}C z#W*L?1WKUeFf6JGGTV62wZ7dVnA`hB!~>zE+n;>F;gWTcXFsHe1e{fc1SU(hx^f^G zB_({&q*R-aLz)z8jjRsPm;yf}6TEV-Sdp=aFa}t~E*2k@uZn{*kn)u+|)hVIw2i_X{py?(w z2dqe3XfZNSUIzT~JAxj?Q;9F-I=w$QBxj=q;n8n;U*v2%Ps{myw z1cSA<`zN;WOf(M~&Pw^xO7|H(ZnBV&!D@{f2~YL;PN`4t+ep{=4N-8YCI_fd=sM)L z&`5sP=b1Pqo?m|@9*5PG?Ac+7yq%Kc?>n|C@F`IMRLZNPcqdC_X{*m_?AZ0+tZW@+$^C9-M~QS7KhE`cf`*pErArQSl@ z%0l88k|QX`verE8MIR@EI*Ue8x=uS6#3@^)c{u*X!yw|Q#52lK?JC_HgJ!Ub0GHAl^FPSTS8*Hg%ghWxn47-wNqfX${n#L+}$cv(mZL#m;-xT?V@m>4^H^fk5HV^`80J zdAR(mmtr8p^0U1oAjhMPReuV!w4)A5PmI|9K6YD&5J>4;A0(jRUNL%5_fi*0k|91m z4Z)Ll^&1RZmTWH5q{oUw+LC4dR@^=iIEk&Q7gh|kWx=#-)*K_YtCV2IP<&?J`d$Jz zJJ`0$ZxS2r70y?I3w}veiEmP_w)6BGwF-G~2DK=UtXlTGokow3EMqhEj8ll@m$FD? z=JKv4_L6Eq)qt17o)MRH?R2l&j_74Ek1t1G?RaMj>#%O((+;z4hXo6RE&2^s#l}Vt z0-|(Ja4fE#%D3p=YLhc)@xziiX8u~~wDq?bI)_MniKb%}U&|k! zR@tb}6b9ZAZ~1CH&)4P=mQCFPDpF!tsPPnuvC0TZjr5oy+lDdWX!KN$gDgQ}3_-1t zL7d)2?b*4Gx=|)g7qg|o!eMV`s3e<+r>LViPHrP_ zRr4rNak+E+KFzh;k%%#>f31g!CAcC%(WbHH}6`}8d7?*@ta{vx1>6gw5{^L1Px zqhhHq=}{rM8|9|ewOK}|V@YkifRM+1IOVOZt`>>-Y#p>)NFVRd z5cDGHs&t%Ax?#x7dCBgFiuzOqT3agRsloY$2-eke3syV$IW{@2Q9zD|DGpHHmkBQlRX%nB!uaT_yHSV;x zszY<2mDyC7EbG^bJEWnCI-JCt`R!?Yv1p*J4)5;2Q$H(w?6i0Eh#vNDK|9ktoc6Yz z(Uq^)h1o3SnWIs$tPy(lLdfgrdkHFthwET1&uW0Fkc<1uPs){{ zny$6AIG3#d5flyl#WNx=h-9cgOp69qsRQr$mp?u}h?l`3 zT^0~BCe74{m&aO?p%g!;P6|{6inc|%OZV%egFnJ&f@R?usiMg<6I^!>DOd@FDl4`l z0IknG3JTI_;~iPRS4V(V`EXFU24F}FMSy$Jv;4R3Rzv}ft~a z#i)ldt6h?h12k`>0CkU{-p*`pQG|JX%w2kqf&u)D5R4uU{0KkcXMluo@8V)ua<6#Z zK?n)r$Q^&r9C#mFCv|Ur z@4k3_Hl9^7oxB-)P_GguviN_#$8IR zvyDD;iIvr}o%+aADRK>Plb?kTYL1<9u5k(n*!Yf~jTDd{mSK=&pFfgmT>pxC=Qjc{ zq+~CK=CY-}IK-mxObXlHmByi8HZ?VE4;O+AW47tb(hCetx8CSHYkxU!O#bz*Hi79` z_S)Rw{kYAG8-&|5DA;e*UBC27?f}5{ai5x}blZx1%2%Tt^bg@Sn-W1)>$FyWaT4dK zou%5PgRsR9MBCB>IR1W7&bN+e74>Yl4Y<0&sDKWUzq0qVA zv}-_$XnSeNy_;eCw|j(yO;g{L?&7^0utY|jCk=(r_zaif)Q-8WG|KNNCO}4vqngMa z^+Ot#cQR)T*nS~y{x&>t$hDe`juqb7iA4;mS77^7)XOWCN&RQS%*4T1jp=geLF|29uL@u6)cL|D1Qmo*GJ^)m<9yd$&^+YJNAtoDSNc7 zh`eoPUCzw8$qpwSi^IhOZ3+3>>CM73vH4}1b%!haEIFi?(Teo4w|6NfB?Z3P{2Y2g zbjKN97CJC$Y4tY(!EcMyK%75vUwYFRc9CSIiO}6?A;-)aw2}YwW`VTL#oFh(_EX7= zo!&Qk;8*e%NiLxxZtOp4nGF(W7U=6hCFmv5{cl#vIvJ-PN*pb4m>Mf#|1x~e*3CdQ zO|C#Tx#E4ZkYx)C>Yb|F4a=4<+?w97$E_OB=2cq$54`Z%g#Oy}z_`#n>?vNImWA$4 z{yrsm92#gbs+MqFRx1gWdPuZd8Mnn%-^8_gO8OexutihS;VZD)EXy0S)1hK3(!6P? zD#r;6>^VCFxdsd8Cytf`mFVd(uefPl1DiKpUi#t(Gn*B7V=v1P-DSOH9c6>Kvi?UG zIQ!PR?M5U~<6d%e=JRuELm#IH;zOIKm$tI_q%HJtyJGug!=tC=PuIpob4v$ZQVW)C z^BLgWajdKl=Ulq~o2D;Kj&o(Uj?H5m$E6TDs$XvK=YuB#{nHu6#AnYy;!0syC5u=- z6{ndBSa5AS|Cyx3h+ayci)^JrK*K<(CCci5EGjT6NMmgWnYiCNVRlOfiO2r~QYGirj#*B5x+(uTh^deJd3#Kt-%bOE` zdHIZ98Emvf;w}arqU9c-TT}BuX3(z0=hJvUCJj%Y$gMnqV4tRGp$vT+r)?L;UiQE% zZTo>Z;$Th9VtG~HDb;Tvlj6jDE=|bs${Y#&7F0F)-cC86J0qy6jp16_8EN25hHL#l zB^cJ`_UqQ4ZjzRPA0D<2p`kT-7A!r_0sC35e5|+|rKd50It@xY>VwHSr$eom2k0qF zl(fD(Y4j95FeH9d`UNQ;wI9Nzf+)J$W!#&_sc@0Jt3H|A6Z|&tZ@9gX>HIFi6EHr% zgS2dihsY(sIJmgk4Q5|qG=lQRvylgqzc7LS!V!Ajw?r-%tPz-PXxdx1<;x%kVzjW9 zCPbL^7smQO3zhUQdi9@y{{o z2leF5Gk}ZmFQ^pOUK)A<(s-6Y8c+E8k342b9BgJK?LR6xyryMR%w;Q-#Bam6_}mgY zv&Z@0Vwj<16*Nd|aVOaQ6+)ufc&Y`~2-?>4L1EbvU+pW#xe(C4uP%Rj@jX-o)fV7B zJ1#ij;Gtj_toa~RG%>!?y{Kp-XAeG1{bOprYO@SqLf-Y!{7kc2VlsFZknSe1_lZd- z>7QV7fL8j4tR#Sf+-d9UW@2zg%T-Xr+b?_xk^c=Y_X9|N-_Q?fI}@0XX*@m|W@?<_hA7i+AJpdErXe z#iGGUMg8T;EfTcJ9l{Nnh0*A%2buu6DsXQ1f^C;e(e|yppRLojQEBT$dbWq6BmCOT ze#1YVBHed>Y5Ly)R8e_^gj&4xd^o})-5{CnFUO9L1_JNVP6-FgZlD0iKL!C(Wh;t0 zmxZP_lT3d#T51tJ*@Xhdau-5iMb=+2Q-GjV;w`k?nBAcaSoj02pi#-mIOO3f|BQiV ze-&8FS1p(a3DjG=u)?FHv!Vo_wa*1UPjNxJsa*mIr2vI=#PPXT3IPS_`q#Bf3qUpi zxV-}4)^|)xb~1NEMO$H3fyPe*zk)grJz2E|0F+tAk>7d~GX~WAcjn2y%A%PV_6O0Q zPgd@1V2t3g4XDXLkkkT>F_3nx(syomQXLg=1MpV~Iu5ll8|iHGn?0KGx3dC7C~!CE z&Z+YYELe=nmjgBrvdd>RWnKnZ_NyiZ>dTNT42xgHPtR|UBGigBu(y{3i_@Y=E{zJV zf24cb^}QnfTHOyPgJXss=_Fi9&x%u+Q5?>>a3e%BMBLX2Ry1AU)+v{<&V%417qp?f zX1imlHrr=U9=;V9Ko;?AV7lR@pu-7nY9zKj8Dt4N344KE#jW|mAll5QKWr3VGwN(-De z&`@0G6xga&pIV)mi{)=J{9ESK}wNNifVvfz)w1) z@#s9C5|(s0xnR+{*Sdt>@Qdrr2T^4CGe>(O2 z5s{<$!DhPLdfw(@e~_s$Pm?TLBst=9R@WVdV!Q1Zmu1w9`P{d6i#IuE+CNlLy}i{g z#cRthU#qyNAnd|Vcj@>bg3@X>D%9ry@*qcr-}eKr88tj~+VN+Fnf-a;t4XL0Wjd)U zEeYa28^3VvkYYl1)uoQ);IMAHY&!LvY~Da^dw~UQo9t?N-bL~YQ5p4DS?g91k&&<~ z&+*FG5X|hnLgv7Q-`Wo~Ghzz#$&86(soTBW)Z+CudbGQA&-qrfg=|0HYB^UC0&_H& z=iI4i>Ml-+^3UZnFVS&M1QnxIGw0-G>C#b%z72IIJN~i`^KVZKS2$`S47zY5Zc%-0 z?jbn3Ta{vpYn5T3P=1O;TLd;Hr0rtyZ^*fm#etzV9lLl&fd&LOgLGd^_O~t!`-W_t zN9XBMjB{g;+b?EDQ7>yPoHt0(?~G6k4+aab#sty!yzh=U_greO?~5RPRNlB(Y*de} zu@j;HP@6NdaQV~)xHG7X2<|(N5(djMLdq5#nSRA$MgD*q{7mgj90uk6Xx)b$LH+3g zt*MM4y!^0!)A0y-JSg1>-rsg=&WEy*t|#ktUp=s>%Sq?tAL9Ovv*tGeKp%#e4%#SC zQba8zF_%jdvb=PIkY{C6ulaR7ZO>0N(9<%Xdx+xs_NK15ory-Crk@Ie_{W$lD;c_gf8}6oz;?^LqmPCkI7v%Ho$6Fk^rh^jNU2_qS{r z**s8VKCP!a9U9$0iwczB!W~6A9i{5dNxW1B;aC!bM7YO`GC+9xB2qpZVt!d1jYf07wCw`qv zhOhdVI}UZvKk4mXm`~t%pGJeK^MGW%RYgk~d7i89DjfjdZ7ls~SQ?RboRO4R=VE>3nn*kQ6#mKzJppm+n$x8pB-c2V{msF=kI*U5ec{}Vp@ z;0pHt500spy*n4-C1Oh)xjM|elxPS;%}QmfLTO}*jV8> zR)|RJxfP`$i+Dg(`^jN=aJdRIR|`|$3K7eRs)L~1m<&=+#OqFCW>hdUS(t?^4Br!@ x% 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

a*&{Hc)j_{>TORY9~)`>qIwN) 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 diff --git a/engine/cronJobs.go b/engine/cronJobs.go index 291f0a54..80752a42 100644 --- a/engine/cronJobs.go +++ b/engine/cronJobs.go @@ -2,6 +2,7 @@ package engine import ( "io/ioutil" + "os" "path/filepath" "github.com/anacrolix/torrent" @@ -46,9 +47,9 @@ func CheckTorrentWatchFolder(c *cron.Cron, db *storm.DB, tclient *torrent.Client continue } - //os.Remove(fullFilePathAbs) //delete the torrent after adding it and copying it over + os.Remove(fullFilePathAbs) //delete the torrent after adding it and copying it over Logger.WithFields(logrus.Fields{"Source Folder": fullFilePathAbs, "Destination Folder": fullNewFilePathAbs, "Torrent": file.Name()}).Info("Added torrent from watch folder, and moved torrent file") - StartTorrent(clientTorrent, torrentLocalStorage, db, config.TorrentConfig.DataDir, "file", file.Name(), config.DefaultMoveFolder, "default", config.TFileUploadFolder) + StartTorrent(clientTorrent, torrentLocalStorage, db, "file", fullNewFilePathAbs, config.DefaultMoveFolder, "default", config) } } @@ -84,7 +85,7 @@ func RefreshRSSCron(c *cron.Cron, db *storm.DB, tclient *torrent.Client, torrent Logger.WithFields(logrus.Fields{"err": err, "Torrent": RSSTorrent.Title}).Warn("Unable to add torrent to torrent client!") break //break out of the loop entirely for this message since we hit an error } - StartTorrent(clientTorrent, torrentLocalStorage, db, config.TorrentConfig.DataDir, "magnet", "", config.DefaultMoveFolder, "RSS", config.TFileUploadFolder) //TODO let user specify torrent default storage location and let change on fly + StartTorrent(clientTorrent, torrentLocalStorage, db, "magnet", "", config.DefaultMoveFolder, "RSS", config) //TODO let user specify torrent default storage location and let change on fly singleFeed.Torrents = append(singleFeed.Torrents, singleRSSTorrent) } diff --git a/engine/doneTorrentActions.go b/engine/doneTorrentActions.go index 05dfbcb2..167a8b76 100644 --- a/engine/doneTorrentActions.go +++ b/engine/doneTorrentActions.go @@ -1,8 +1,6 @@ package engine import ( - "fmt" - "io" "os" "path/filepath" "runtime" @@ -20,22 +18,21 @@ func MoveAndLeaveSymlink(config FullClientSettings, tHash string, db *storm.DB, tStorage := Storage.FetchTorrentFromStorage(db, tHash) Logger.WithFields(logrus.Fields{"Torrent Name": tStorage.TorrentName}).Info("Move and Create symlink started for torrent") var oldFilePath string - if moveDone { + if moveDone { //only occurs on manual move oldFilePathTemp := filepath.Join(oldPath, tStorage.TorrentName) - oldFilePath, err := filepath.Abs(oldFilePathTemp) + var err error + oldFilePath, err = filepath.Abs(oldFilePathTemp) if err != nil { Logger.WithFields(logrus.Fields{"Torrent Name": tStorage.TorrentName, "Filepath": oldFilePath}).Error("Cannot create absolute file path!") } - - fmt.Println("oldfilepath", oldFilePath) } else { oldFilePathTemp := filepath.Join(config.TorrentConfig.DataDir, tStorage.TorrentName) - oldFilePath, err := filepath.Abs(oldFilePathTemp) + var err error + oldFilePath, err = filepath.Abs(oldFilePathTemp) if err != nil { Logger.WithFields(logrus.Fields{"Torrent Name": tStorage.TorrentName, "Filepath": oldFilePath}).Error("Cannot create absolute file path!") } } - newFilePathTemp := filepath.Join(tStorage.StoragePath, tStorage.TorrentName) newFilePath, err := filepath.Abs(newFilePathTemp) if err != nil { @@ -55,70 +52,27 @@ func MoveAndLeaveSymlink(config FullClientSettings, tHash string, db *storm.DB, } if oldFilePath != newFilePath { - if runtime.GOOS == "windows" { //TODO the windows symlink is broken on windows 10 creator edition, so doing a copy for now until Go 1.11 - if oldFileInfo.IsDir() { - os.Mkdir(newFilePath, 0755) - if moveDone { - err := folderCopy.Copy(config.TorrentConfig.DataDir, newFilePath) - if err != nil { - Logger.WithFields(logrus.Fields{"Old File Path": config.TorrentConfig.DataDir, "New File Path": newFilePath, "error": err}).Error("Error Copying Folder!") - } - } else { - err := folderCopy.Copy(oldFilePath, newFilePath) //copy the folder to the new location - if err != nil { - Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "error": err}).Error("Error Copying Folder!") - } - - } - os.Chmod(newFilePath, 0777) - notifyUser(tStorage, config, db) - return - } - srcFile, err := os.Open(oldFilePath) - defer srcFile.Close() - if err != nil { - Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "error": err}).Error("Windows: Cannot open old file for copy") - return - } - destFile, err := os.Create(newFilePath) - defer destFile.Close() - if err != nil { - Logger.WithFields(logrus.Fields{"New File Path": newFilePath, "error": err}).Error("Windows: Cannot open new file for copying into") - return - } - - bytesWritten, err := io.Copy(destFile, srcFile) - if err != nil { - Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "error": err}).Error("Windows: Cannot copy old file into new") - return - } - err = destFile.Sync() - if err != nil { - Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "error": err}).Error("Windows: Error syncing new file to disk") - } - Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "bytesWritten": bytesWritten}).Info("Windows Torrent Copy Completed") - notifyUser(tStorage, config, db) - } else { - - folderCopy.Copy(oldFilePath, newFilePath) - os.Chmod(newFilePath, 0777) //changing permissions on the new file to be permissive - os.RemoveAll(oldFilePath) - if moveDone { - err := os.Symlink(newFilePath, config.TorrentConfig.DataDir) - if err != nil { - Logger.WithFields(logrus.Fields{"Old File Path": config.TorrentConfig.DataDir, "New File Path": newFilePath, "error": err}).Error("Error creating symlink") - return - } - } else { - err := os.Symlink(newFilePath, oldFilePath) //For all other OS's create a symlink - if err != nil { - Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "error": err}).Error("Error creating symlink") - return - } - } - notifyUser(tStorage, config, db) - Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath}).Info("Moving completed torrent") + newFilePathDir := filepath.Dir(newFilePath) + os.Mkdir(newFilePathDir, 0755) + err := folderCopy.Copy(oldFilePath, newFilePath) //copy the folder to the new location + if err != nil { + Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "error": err}).Error("Error Copying Folder!") } + os.Chmod(newFilePath, 0777) + if runtime.GOOS != "windows" { //TODO the windows symlink is broken on windows 10 creator edition, so on the other platforms create symlink (windows will copy) until Go1.11 + os.RemoveAll(oldFilePath) + err = os.Symlink(newFilePath, oldFilePath) + if err != nil { + Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "error": err}).Error("Error creating symlink") + } + } + if moveDone == false { + tStorage.TorrentMoved = true //TODO error handling instead of just saying torrent was moved when it was not + notifyUser(tStorage, config, db) //Only notify if we haven't moved yet, don't want to push notify user every time user uses change storage button + } + Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath}).Info("Moving completed torrent") + tStorage.StoragePath = filepath.Dir(newFilePath) + Storage.UpdateStorageTick(db, tStorage) } } diff --git a/engine/engine.go b/engine/engine.go index de3cb96c..15515fc9 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -4,7 +4,6 @@ import ( "fmt" "io/ioutil" "os" - "path/filepath" "strconv" "strings" "time" @@ -128,7 +127,7 @@ func readTorrentFileFromDB(element *Storage.TorrentLocal, tclient *torrent.Clien } //StartTorrent creates the storage.db entry and starts A NEW TORRENT and adds to the running torrent array -func StartTorrent(clientTorrent *torrent.Torrent, torrentLocalStorage Storage.TorrentLocal, torrentDbStorage *storm.DB, dataDir, torrentType, torrentFileName, torrentStoragePath, labelValue, tFileUploadFolder string) { +func StartTorrent(clientTorrent *torrent.Torrent, torrentLocalStorage Storage.TorrentLocal, torrentDbStorage *storm.DB, torrentType, torrentFilePathAbs, torrentStoragePath, labelValue string, config FullClientSettings) { timedOut := timeOutInfo(clientTorrent, 45) //seeing if adding the torrent times out (giving 45 seconds) if timedOut { //if we fail to add the torrent return return @@ -147,6 +146,7 @@ func StartTorrent(clientTorrent *torrent.Torrent, torrentLocalStorage Storage.To torrentLocalStorage.Label = labelValue torrentLocalStorage.DateAdded = time.Now().Format("Jan _2 2006") torrentLocalStorage.StoragePath = torrentStoragePath + torrentLocalStorage.TempStoragePath = config.TorrentConfig.DataDir torrentLocalStorage.TorrentName = clientTorrent.Name() torrentLocalStorage.TorrentUploadLimit = true //by default all of the torrents will stop uploading after the global rate is set. torrentLocalStorage.TorrentMoved = false //by default the torrent has no been moved. @@ -154,8 +154,6 @@ func StartTorrent(clientTorrent *torrent.Torrent, torrentLocalStorage Storage.To torrentLocalStorage.TorrentType = torrentType //either "file" or "magnet" maybe more in the future torrentLocalStorage.TorrentSize = clientTorrent.Length() //Length will change as we cancel files so store it in DB if torrentType == "file" { //if it is a file read the entire file into the database for us to spit out later - torrentFilePath := filepath.Join(tFileUploadFolder, torrentFileName) - torrentFilePathAbs, err := filepath.Abs(torrentFilePath) torrentfile, err := ioutil.ReadFile(torrentFilePathAbs) torrentLocalStorage.TorrentFileName = torrentFilePathAbs if err != nil { @@ -236,11 +234,10 @@ func CreateRunningTorrentArray(tclient *torrent.Client, TorrentLocalArray []*Sto PercentDone := fmt.Sprintf("%.2f", float32(singleTorrent.BytesCompleted())/float32(singleTorrentFromStorage.TorrentSize)) fullClientDB.TorrentHash = TempHash fullClientDB.PercentDone = PercentDone - fullClientDB.DataBytesRead = fullStruct.ConnStats.DataBytesRead //used for calculations not passed to client calculating up/down speed - fullClientDB.DataBytesWritten = fullStruct.ConnStats.DataBytesWritten //used for calculations not passed to client calculating up/down speed + fullClientDB.DataBytesRead = fullStruct.ConnStats.BytesReadData //used for calculations not passed to client calculating up/down speed + fullClientDB.DataBytesWritten = fullStruct.ConnStats.BytesWrittenData //used for calculations not passed to client calculating up/down speed fullClientDB.ActivePeers = activePeersString + " / (" + totalPeersString + ")" fullClientDB.TorrentHashString = TempHash.String() - fullClientDB.StoragePath = singleTorrentFromStorage.StoragePath fullClientDB.TorrentName = singleTorrentFromStorage.TorrentName fullClientDB.DateAdded = singleTorrentFromStorage.DateAdded fullClientDB.TorrentLabel = singleTorrentFromStorage.Label @@ -252,7 +249,7 @@ func CreateRunningTorrentArray(tclient *torrent.Client, TorrentLocalArray []*Sto TempHash := singleTorrent.InfoHash() if previousElement.TorrentHashString == TempHash.String() { //matching previous to new CalculateTorrentSpeed(singleTorrent, fullClientDB, previousElement) - fullClientDB.TotalUploadedBytes = singleTorrentFromStorage.UploadedBytes + (fullStruct.ConnStats.DataBytesWritten - previousElement.DataBytesWritten) + fullClientDB.TotalUploadedBytes = singleTorrentFromStorage.UploadedBytes + (fullStruct.ConnStats.BytesWrittenData - previousElement.DataBytesWritten) } } } @@ -276,7 +273,7 @@ func CreateRunningTorrentArray(tclient *torrent.Client, TorrentLocalArray []*Sto } //CreateFileListArray creates a file list for a single torrent that is selected and sent to the server -func CreateFileListArray(tclient *torrent.Client, selectedHash string, db *storm.DB) TorrentFileList { +func CreateFileListArray(tclient *torrent.Client, selectedHash string, db *storm.DB, config FullClientSettings) TorrentFileList { runningTorrents := tclient.Torrents() //don't need running torrent array since we aren't adding or deleting from storage torrentFileListStorage := Storage.FetchTorrentFromStorage(db, selectedHash) TorrentFileListSelected := TorrentFileList{} @@ -289,11 +286,7 @@ func CreateFileListArray(tclient *torrent.Client, selectedHash string, db *storm for _, singleFile := range torrentFilesRaw { TorrentFileStruct.TorrentHashString = tempHash TorrentFileStruct.FileName = singleFile.DisplayPath() - absFilePath, err := filepath.Abs(singleFile.Path()) - if err != nil { - Logger.WithFields(logrus.Fields{"file": singleFile.Path()}).Debug("Unable to create absolute path") - } - TorrentFileStruct.FilePath = absFilePath + TorrentFileStruct.FilePath = singleFile.Path() PieceState := singleFile.State() var downloadedBytes int64 for _, piece := range PieceState { diff --git a/engine/engineHelpers.go b/engine/engineHelpers.go index 08036f62..84c3c137 100644 --- a/engine/engineHelpers.go +++ b/engine/engineHelpers.go @@ -62,7 +62,7 @@ func CopyFile(srcFile string, destFile string) { func CalculateTorrentSpeed(t *torrent.Torrent, c *ClientDB, oc ClientDB) { now := time.Now() bytes := t.BytesCompleted() - bytesUpload := t.Stats().DataBytesWritten + bytesUpload := t.Stats().BytesWrittenData dt := float32(now.Sub(oc.UpdatedAt)) // get the delta time length between now and last updated db := float32(bytes - oc.BytesCompleted) //getting the delta bytes rate := db * (float32(time.Second) / dt) // converting into seconds diff --git a/goTorrentWebUI/src/TopMenu/Modals/RSSModal/RSSModalLayout.js b/goTorrentWebUI/src/TopMenu/Modals/RSSModal/RSSModalLayout.js index c94b1965..83fd0194 100644 --- a/goTorrentWebUI/src/TopMenu/Modals/RSSModal/RSSModalLayout.js +++ b/goTorrentWebUI/src/TopMenu/Modals/RSSModal/RSSModalLayout.js @@ -89,7 +89,10 @@ const inlineStyle = { {i: 'b', x: 0, y: 1, w: 1, h: 5, static: true}, {i: 'c', x: 1, y: 1, w: 5, h: 5, minW: 5, minH: 3, static: true}, ]; - this.state = { layout }; + this.state = { + layout , + textValue: "", + }; }; @@ -103,7 +106,6 @@ const inlineStyle = { } handleAddRSSFeed = () => { - this.setState({ textValue: "Clear"}) //clearing out the text submitted let RSSURLSubmit = { MessageType: "addRSSFeed", Payload: [this.state.textValue] @@ -113,20 +115,13 @@ const inlineStyle = { MessageType: "rssFeedRequest", } ws.send(JSON.stringify(RSSRequest)) //Immediatly request an update of the feed when you add a new URL + this.setState({textValue: ""}) } setTextValue = (event) => { this.setState({ textValue: event.target.value }); } - - componentWillReceiveProps (nextProps) { - console.log("nextprops", nextProps, "Modal", nextProps.RSSModalOpen) - } - componentWillMount () { - console.log("Mounting grid") - } - render() { return (

diff --git a/goTorrentWebUI/src/TopMenu/Modals/deleteTorrentModal.js b/goTorrentWebUI/src/TopMenu/Modals/deleteTorrentModal.js index b655508b..9dfe5ec1 100644 --- a/goTorrentWebUI/src/TopMenu/Modals/deleteTorrentModal.js +++ b/goTorrentWebUI/src/TopMenu/Modals/deleteTorrentModal.js @@ -41,7 +41,7 @@ class DeleteTorrentModal extends React.Component { let selection = [] let deleteTorrentHashes = { MessageType: "deleteTorrents", - MessageDetail: "true", + MessageDetail: "false", //delete with data Payload: this.props.selectionHashes } console.log("Deleting Torrents", deleteTorrentHashes) @@ -56,7 +56,7 @@ class DeleteTorrentModal extends React.Component { let deleteTorrentHashes = { MessageType: "deleteTorrents", - MessageDetail: "true", + MessageDetail: "true", //delete with data Payload: this.props.selectionHashes, } console.log("Deleting Torrents and Data", deleteTorrentHashes) diff --git a/main.go b/main.go index f4a3d183..c8c88800 100644 --- a/main.go +++ b/main.go @@ -163,7 +163,7 @@ func main() { case "torrentFileListRequest": //client requested a filelist update Logger.WithFields(logrus.Fields{"message": msg}).Debug("Client Requested FileList Update") - FileListArray := Engine.CreateFileListArray(tclient, msg.Payload[0], db) + FileListArray := Engine.CreateFileListArray(tclient, msg.Payload[0], db, Config) conn.WriteJSON(FileListArray) //writing the JSON to the client case "torrentDetailedInfo": @@ -176,6 +176,21 @@ func main() { torrentPeerList := Engine.CreatePeerListArray(tclient, msg.Payload[0]) conn.WriteJSON(torrentPeerList) + case "fetchTorrentsByLabel": //TODO test this to make sure it works + Logger.WithFields(logrus.Fields{"message": msg}).Debug("Client Requested Torrents by Label") + label := msg.MessageDetail + torrentsByLabel := Storage.FetchTorrentsByLabel(db, label) + RunningTorrentArray = Engine.CreateRunningTorrentArray(tclient, TorrentLocalArray, PreviousTorrentArray, Config, db) + labelRunningArray := []Engine.ClientDB{} + for _, torrent := range RunningTorrentArray { //Ranging over the running torrents and if the hashes match we have torrents by label + for _, label := range torrentsByLabel { + if torrent.TorrentHashString == label.Hash { + labelRunningArray = append(labelRunningArray, torrent) + } + } + } + conn.WriteJSON(labelRunningArray) + case "changeStorageValue": Logger.WithFields(logrus.Fields{"message": msg}).Debug("Client Requested Storage Location Update") newStorageLocation := msg.MessageDetail @@ -183,10 +198,16 @@ func main() { for _, singleHash := range hashes { singleTorrent := Storage.FetchTorrentFromStorage(db, singleHash) oldPath := singleTorrent.StoragePath - singleTorrent.StoragePath = newStorageLocation + newStorageLocationAbs, err := filepath.Abs(filepath.ToSlash(newStorageLocation)) + if err != nil { + Logger.WithFields(logrus.Fields{"patherr": err, "path": newStorageLocation}).Warn("Unable to create absolute path for storage location, using default") + singleTorrent.StoragePath = Config.TorrentConfig.DataDir + } else { + singleTorrent.StoragePath = newStorageLocationAbs + } Storage.UpdateStorageTick(db, singleTorrent) //push torrent to storage if singleTorrent.TorrentMoved == true { //If torrent has already been moved and I change path then move it again... TODO, does this work with symlinks? - Logger.WithFields(logrus.Fields{"message": msg}).Info("Torrent completed so moving to new location") + Logger.WithFields(logrus.Fields{"message": msg}).Info("Change Storage Value called") Engine.MoveAndLeaveSymlink(Config, singleHash, db, true, oldPath) } } @@ -283,7 +304,7 @@ func main() { } Logger.WithFields(logrus.Fields{"clientTorrent": clientTorrent, "magnetLink": magnetLink}).Info("Adding torrent to client!") Engine.CreateServerPushMessage(Engine.ServerPushMessage{MessageType: "serverPushMessage", MessageLevel: "info", Payload: "Received MagnetLink"}, conn) - Engine.StartTorrent(clientTorrent, torrentLocalStorage, db, Config.TorrentConfig.DataDir, "magnet", "", storageValue, labelValue, Config.TFileUploadFolder) //starting the torrent and creating local DB entry + Engine.StartTorrent(clientTorrent, torrentLocalStorage, db, "magnet", "", storageValue, labelValue, Config) //starting the torrent and creating local DB entry } @@ -296,8 +317,6 @@ func main() { Engine.CreateServerPushMessage(Engine.ServerPushMessage{MessageType: "serverPushMessage", MessageLevel: "error", Payload: "Unable to decode base64 string to file"}, conn) } FileName := msg.MessageDetail - fmt.Println("Full Message", msg.MessageType, msg.MessageDetail, msg.MessageDetailTwo, msg.MessageDetailThree) - fmt.Println("FileName", msg.MessageDetail) storageValue := msg.MessageDetailTwo labelValue := msg.MessageDetailThree if storageValue == "" { @@ -314,21 +333,22 @@ func main() { storageValue, _ = filepath.Abs(filepath.ToSlash(Config.DefaultMoveFolder)) } } - filePath := filepath.Join(Config.TFileUploadFolder, FileName) //creating a full filepath to store the .torrent files + filePath := filepath.Join(Config.TFileUploadFolder, FileName) + filePathAbs, err := filepath.Abs(filePath) //creating a full filepath to store the .torrent files - err = ioutil.WriteFile(filePath, file, 0755) //Dumping our received file into the filename + err = ioutil.WriteFile(filePathAbs, file, 0755) //Dumping our received file into the filename if err != nil { - Logger.WithFields(logrus.Fields{"filepath": filePath, "file Name": FileName, "Error": err}).Error("Unable to write torrent data to file") + Logger.WithFields(logrus.Fields{"filepath": filePathAbs, "file Name": FileName, "Error": err}).Error("Unable to write torrent data to file") Engine.CreateServerPushMessage(Engine.ServerPushMessage{MessageType: "serverPushMessage", MessageLevel: "error", Payload: "Unable to write torrent data to file"}, conn) } - clientTorrent, err := tclient.AddTorrentFromFile(filePath) + clientTorrent, err := tclient.AddTorrentFromFile(filePathAbs) if err != nil { - Logger.WithFields(logrus.Fields{"filepath": filePath, "Error": err}).Error("Unable to add Torrent to torrent server") + Logger.WithFields(logrus.Fields{"filepath": filePathAbs, "Error": err}).Error("Unable to add Torrent to torrent server") Engine.CreateServerPushMessage(Engine.ServerPushMessage{MessageType: "serverPushMessage", MessageLevel: "error", Payload: "Unable to add Torrent to torrent server"}, conn) } - Logger.WithFields(logrus.Fields{"clienttorrent": clientTorrent.Name(), "filename": filePath}).Info("Added torrent") - Engine.StartTorrent(clientTorrent, torrentLocalStorage, db, Config.TorrentConfig.DataDir, "file", filePath, storageValue, labelValue, Config.TFileUploadFolder) + Logger.WithFields(logrus.Fields{"clienttorrent": clientTorrent.Name(), "filename": filePathAbs}).Info("Added torrent") + Engine.StartTorrent(clientTorrent, torrentLocalStorage, db, "file", filePathAbs, storageValue, labelValue, Config) case "stopTorrents": TorrentListCommands := msg.Payload diff --git a/public/static/js/bundle.js b/public/static/js/bundle.js index 1e3c341f..10538700 100644 --- a/public/static/js/bundle.js +++ b/public/static/js/bundle.js @@ -97281,7 +97281,6 @@ var RSSModalLayout = function (_React$Component) { }; _this.handleAddRSSFeed = function () { - _this.setState({ textValue: "Clear" }); //clearing out the text submitted var RSSURLSubmit = { MessageType: "addRSSFeed", Payload: [_this.state.textValue] @@ -97291,6 +97290,7 @@ var RSSModalLayout = function (_React$Component) { MessageType: "rssFeedRequest" }; ws.send(JSON.stringify(RSSRequest)); //Immediatly request an update of the feed when you add a new URL + _this.setState({ textValue: "" }); }; _this.setTextValue = function (event) { @@ -97298,7 +97298,10 @@ var RSSModalLayout = function (_React$Component) { }; var layout = [{ i: 'a', x: 0, y: 0, w: 6, h: 1, static: true }, { i: 'b', x: 0, y: 1, w: 1, h: 5, static: true }, { i: 'c', x: 1, y: 1, w: 5, h: 5, minW: 5, minH: 3, static: true }]; - _this.state = { layout: layout }; + _this.state = { + layout: layout, + textValue: "" + }; return _this; } @@ -97308,16 +97311,6 @@ var RSSModalLayout = function (_React$Component) { value: function onLayoutChange(layout) { this.props.onLayoutChange(layout); } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(nextProps) { - console.log("nextprops", nextProps, "Modal", nextProps.RSSModalOpen); - } - }, { - key: 'componentWillMount', - value: function componentWillMount() { - console.log("Mounting grid"); - } }, { key: 'render', value: function render() { @@ -116880,7 +116873,7 @@ var DeleteTorrentModal = function (_React$Component) { var selection = []; var deleteTorrentHashes = { MessageType: "deleteTorrents", - MessageDetail: "true", + MessageDetail: "false", //delete with data Payload: _this.props.selectionHashes }; console.log("Deleting Torrents", deleteTorrentHashes); @@ -116893,7 +116886,7 @@ var DeleteTorrentModal = function (_React$Component) { var deleteTorrentHashes = { MessageType: "deleteTorrents", - MessageDetail: "true", + MessageDetail: "true", //delete with data Payload: _this.props.selectionHashes }; console.log("Deleting Torrents and Data", deleteTorrentHashes); diff --git a/storage/storage.go b/storage/storage.go index abdfe2a3..f6655fcc 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -46,14 +46,15 @@ type TorrentLocal struct { Hash string `storm:"id,unique"` //Hash should be unique for every torrent... if not we are re-adding an already added torrent InfoBytes []byte DateAdded string - StoragePath string + StoragePath string //The absolute value of the path where the torrent will be moved when completed + TempStoragePath string //The absolute path of where the torrent is temporarily stored as it is downloaded TorrentMoved bool TorrentName string TorrentStatus string TorrentUploadLimit bool //if true this torrent will bypass the upload storage limit (effectively unlimited) MaxConnections int TorrentType string //magnet or .torrent file - TorrentFileName string //Should be absolute path + TorrentFileName string //Should be just the name of the torrent TorrentFile []byte Label string UploadedBytes int64 @@ -144,6 +145,22 @@ func FetchTorrentFromStorage(torrentStorage *storm.DB, selectedHash string) Torr return singleTorrentInfo } +//FetchTorrentsByLabel fetches a list of torrents that have a specific label +func FetchTorrentsByLabel(torrentStorage *storm.DB, label string) []TorrentLocal { + allTorrents := []*TorrentLocal{} + torrentsByLabel := []TorrentLocal{} + err := torrentStorage.All(&allTorrents) + if err != nil { + Logger.WithFields(logrus.Fields{"database": torrentStorage, "error": err}).Error("Unable to read Database into torrentLocalArray!") + } + for _, torrent := range allTorrents { + if torrent.Label == label { + torrentsByLabel = append(torrentsByLabel, *torrent) + } + } + return torrentsByLabel +} + //FetchHashHistory fetches the infohash of all torrents added into the client. The cron job checks this so as not to add torrents from RSS that were already added before func FetchHashHistory(db *storm.DB) TorrentHistoryList { torrentHistory := TorrentHistoryList{} diff --git a/torrentUpload/desktop.ini b/torrentUpload/desktop.ini new file mode 100644 index 00000000..141aa8bf --- /dev/null +++ b/torrentUpload/desktop.ini @@ -0,0 +1,3 @@ +[LocalizedFileNames] +Plan_9_from_Outer_Space_1959_archive.torrent=@Plan_9_from_Outer_Space_1959_archive.torrent,0 +Return_of_the_Street_Fighter.avi.torrent=@Return_of_the_Street_Fighter.avi.torrent,0