From 33b9e9cfc6b03d2b7deb15950d3dcd6fd2b061d7 Mon Sep 17 00:00:00 2001 From: Andy <88590076+AAndyProgram@users.noreply.github.com> Date: Fri, 3 Jun 2022 20:42:28 +0300 Subject: [PATCH] 2022.6.3.0 Updated plugin environments and dependencies Added automation Fixed Insta hash issue Updated groups Added toast notifications Updated tagged posts notifications Updated M3U8; fixed audio issue Extended some of log exceptions Fixed minor bugs Other minor improvements --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/plugin_add.md | 4 +- CONTRIBUTING.md | 33 +- Changelog.md | 13 + ProgramScreenshots/MainWindowGroups.png | Bin 12354 -> 12793 bytes ProgramScreenshots/SettingsAutoDownloader.png | Bin 0 -> 13389 bytes .../SettingsGlobalDownloading.png | Bin 13610 -> 14402 bytes ProgramScreenshots/SettingsSiteInstagram.png | Bin 23973 -> 26714 bytes ProgramScreenshots/SettingsSiteReddit.png | Bin 12995 -> 13975 bytes ProgramScreenshots/SettingsSiteTwitter.png | Bin 13820 -> 15348 bytes ProgramsComparison.md | 6 +- README.md | 32 +- .../My Project/AssemblyInfo.vb | 4 +- SCrawler.Plugin.LPSG/SiteSettings.vb | 2 +- .../My Project/AssemblyInfo.vb | 4 +- SCrawler.Plugin.XVIDEOS/SiteSettings.vb | 2 +- .../Interfaces/ISiteSettings.vb | 2 +- .../My Project/AssemblyInfo.vb | 4 +- SCrawler.sln | 14 + SCrawler/API/Base/ProfileSaved.vb | 2 +- SCrawler/API/Base/SiteSettingsBase.vb | 2 +- SCrawler/API/Base/UserDataBase.vb | 34 +- SCrawler/API/Instagram/SiteSettings.vb | 83 +- SCrawler/API/Instagram/UserData.vb | 95 ++- SCrawler/API/Reddit/M3U8.vb | 153 +++- SCrawler/API/Reddit/SiteSettings.vb | 17 +- SCrawler/API/Reddit/UserData.vb | 18 +- SCrawler/API/Twitter/UserData.vb | 2 + SCrawler/Channels/ChannelViewForm.vb | 4 +- .../Download/ActiveDownloadingProgress.vb | 66 +- SCrawler/Download/AutoDownloader.vb | 325 ++++++++ .../AutoDownloaderEditorForm.Designer.vb | 277 +++++++ .../Download/AutoDownloaderEditorForm.resx | 718 ++++++++++++++++++ SCrawler/Download/AutoDownloaderEditorForm.vb | 136 ++++ SCrawler/Download/DownloadSavedPostsForm.vb | 2 +- SCrawler/Download/DownloadedInfoForm.vb | 4 +- SCrawler/Download/Groups/DownloadGroup.vb | 100 ++- .../Groups/DownloadGroupCollection.vb | 7 + SCrawler/Download/Groups/GroupDefaults.vb | 142 ++++ .../Groups/GroupEditorForm.Designer.vb | 200 +---- SCrawler/Download/Groups/GroupEditorForm.resx | 77 +- SCrawler/Download/Groups/GroupEditorForm.vb | 36 +- SCrawler/Download/Groups/GroupParameters.vb | 48 ++ SCrawler/Download/TDownloader.vb | 54 +- .../Editors/GlobalSettingsForm.Designer.vb | 246 +++--- SCrawler/Editors/GlobalSettingsForm.vb | 18 + SCrawler/Editors/LabelsForm.vb | 27 +- SCrawler/Editors/SiteEditorForm.Designer.vb | 63 +- SCrawler/Editors/SiteEditorForm.resx | 15 +- SCrawler/Editors/SiteEditorForm.vb | 2 +- SCrawler/MainFrame.Designer.vb | 30 +- SCrawler/MainFrame.resx | 3 + SCrawler/MainFrame.vb | 60 +- SCrawler/MainFrameObjects.vb | 24 +- SCrawler/MainMod.vb | 1 + SCrawler/My Project/AssemblyInfo.vb | 4 +- .../PluginsEnvironment/Hosts/SettingsHost.vb | 4 +- SCrawler/SCrawler.vbproj | 18 + SCrawler/SettingsCLS.vb | 2 + 59 files changed, 2556 insertions(+), 685 deletions(-) create mode 100644 ProgramScreenshots/SettingsAutoDownloader.png create mode 100644 SCrawler/Download/AutoDownloader.vb create mode 100644 SCrawler/Download/AutoDownloaderEditorForm.Designer.vb create mode 100644 SCrawler/Download/AutoDownloaderEditorForm.resx create mode 100644 SCrawler/Download/AutoDownloaderEditorForm.vb create mode 100644 SCrawler/Download/Groups/GroupDefaults.vb create mode 100644 SCrawler/Download/Groups/GroupParameters.vb diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a148167..d8a0a35 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,7 +12,7 @@ A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: -1. Profile URL: +1. **Profile URL**: 2. Do something 3. See error diff --git a/.github/ISSUE_TEMPLATE/plugin_add.md b/.github/ISSUE_TEMPLATE/plugin_add.md index 38fdeaa..a6d1c39 100644 --- a/.github/ISSUE_TEMPLATE/plugin_add.md +++ b/.github/ISSUE_TEMPLATE/plugin_add.md @@ -1,6 +1,6 @@ --- -name: Add plugin -about: Add plugin to plugin list +name: I developed a plugin for SCrawler +about: I developed a plugin for SCrawler. Add plugin to plugin list. title: "[NEW PLUGIN]" labels: 'New Plugin' assignees: '' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c32516..8166bd9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,30 +3,35 @@ I welcome requests! Follow these steps to contribute: 1. Find an [issue](https://github.com/AAndyProgram/SCrawler/issues) that needs assistance. -2. Let me know you are working on it by posting a comment on the issue. -3. If you find an error in the code, please provide a link to the file and the line number. -4. If you have a suggestion to change the code, you can post a block of code to replace. I don't currently have time to learn pull requests, so it might work this way. +1. Let me know you are working on it by posting a comment on the issue. +1. If you find an error in the code, please provide a link to the file and the line number. +1. If you have a code change suggestion, you can post a replacement code block. I also accept pull requests. # How to build from source 1. Delete the "PersonalUtilities" project from the solution. -2. Add the latest version of the "PersonalUtilities.dll" library (from the [latest release](https://github.com/AAndyProgram/SCrawler/releases/latest)). -3. Import PersonalUtilities.Functions for the whole project. +1. Add the latest version of the "PersonalUtilities.dll" library (from the [latest release](https://github.com/AAndyProgram/SCrawler/releases/latest)). +1. Import PersonalUtilities.Functions for the whole project. **Always use the correct "PersonalUtilities.dll" library. You must download this library from the release of the code you downloaded.** # How to request a new site 1. Check [issues](https://github.com/AAndyProgram/SCrawler/issues) (open and [closed](https://github.com/AAndyProgram/SCrawler/issues?q=is%3Aissue+is%3Aclosed)) and [discussions](https://github.com/AAndyProgram/SCrawler/discussions) to find your issue. Perhaps I have already answered your request. -2. If you don't find anything, create a new issue with your request. I usually reply as soon as possible (within the next few hours). - - If I'm interested in a site you want to add, it may be added in future releases. - - If the site has an API that does not require authorization, it may be added in the coming releases. - - You can make it faster by posting a link to the API. **I don't use OAuth authentication** in my application, so if it's not too hard to make a new parsing algorithm **without OAuth** authorization, I can start developing it in the coming days. Otherwise, I need time to figure out how to do it. - - If the site does not have an API that does not require authorization, this may take some time. - - If you will be posting request urls **without OAuth** authentication, I might consider adding your site if I have time. - - If I'm **not** interested in the site you want to add, you can pay to have it added by making a donation of approximately $10. **But before that, you still need to create an issue. If I'm not interested, you can offer me a deal to develop it for money. I'll check the site you want to add, check the availability of the API and tell you how much time I need to develop it and the price. If you agree, I will do it.** [![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/andyprogram) - - +1. If you don't find anything, create a new issue with your request. I usually reply as soon as possible (within the next few hours). + +# Requirements for new site requests + +**Attention! I'll add a new site only if I'm interested. I also have a life, and any development takes time. ** + +- Post a link to the site's API +- Post request URLs **without OAuth** authentication +- Post a **complete cURL** request which provides the required information (JSON is better) + +**I don't use OAuth authentication** in my application, so if it's not too hard to make a new parsing algorithm **without OAuth** authorization, I can start developing it in the coming days. Otherwise, I need time to figure out how to do it. + +If I'm interested in a site you want to add, it may be added in future releases. + # Sites I will never develop - Facebook diff --git a/Changelog.md b/Changelog.md index d93f439..8b84bdd 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,16 @@ +# 2022.6.3.0 + +Changed version numbering method. From now on, new versions will be numbered by release date (YYYY.M.D) + +**Attention! Starting with this release, SCrawler may not work on windows 7 and 8 or may not work correctly. All future releases will only be guaranteed to work on windows 10 and 11.** + +- Added + - **Automation** (downloading data automatically every ```X``` minutes) + - Expanded settings for Instagram tagged posts that are downloaded for the first time. +- Fixed + - Videos hosted on Reddit that are downloaded via m3u8 playlists are missing an audio track. + - Instagram hash not able to be auto-filled from cookies + # 3.0.0.10 - Added diff --git a/ProgramScreenshots/MainWindowGroups.png b/ProgramScreenshots/MainWindowGroups.png index 225a38065591ecb04a1531c2577d5693f776a32f..784b3fb43b49e1723291fa61b06d3cdcd33827aa 100644 GIT binary patch literal 12793 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 literal 0 HcmV?d00001 diff --git a/ProgramScreenshots/SettingsGlobalDownloading.png b/ProgramScreenshots/SettingsGlobalDownloading.png index 051fa825a28d6d69a6011acbc7770d451cd35564..d2bedd1da042513937cf0ddb19a1dc0360831b33 100644 GIT binary patch literal 14402 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 diff --git a/ProgramScreenshots/SettingsSiteInstagram.png b/ProgramScreenshots/SettingsSiteInstagram.png index a83fc3b7010e1cb1ce756c4ec4c70ccaf55ced9e..00fd91118a7fdcc6c19aa8888c09de8188cba598 100644 GIT binary patch literal 26714 zcmdSBby(DCA3lnrfQrC?pn!l3DXAbJEi!b6D6KMpw35=UAPn6lDIEebbX#;uNrTcb zgbW=6=NZ&pci(+?-`_dcb*^*%P-X_c^*o=v@B1@;s>(9w&r+Sm!NEB%Cks=@!8r*9 z|6UN_flt=*pSyt{C+yT^ZsQbmUS0riPMJz5N#NiVg`7Kha2mWn^H^5f4hM(m1NPsE zCYx+H4vy)n985yu~cRuBhi-Bw0f3t88_PJn`#YWFLzGkMhyjj=KF5C%!FM90j{&BLygD8P!!#cE(^XjSrXEG)r zerB9Hq=kW4^lAv5yNfHp7oN^U#ws~&p)mnwl{ZFp70~cyD9oz=o>^Y!xG{aYu z4-#p3Tt3iO8ugw>m-dP?+^sth*_~|@=M>=Fe?CfDyuG1h+hw>E?pyabPvqMg%6L)N z7e1XaGE+5CF*q{!GUljslzE^<{AnRr&9{1zQd7Q18}5aHB~@CmCMa^3d}Jn|9^>qM z@a4?zmM&Mgh37gMI+1Cv#i(42Q9M?Nay?z-2}(ln+h;5E7sI7U*NF=KBpOlr3Fn22 z)0r{)^ULdfFxZF~V@z#}(|PbLCTEi$E6UuC43>hseiO_&{G2ttz!1{5TsQ$OKbV!7 zp3YB0HwQy1x1Gcow;M!Ux)CA{ZP}yy$dFcCi_RENA+-1CZqNGk);(!AcPQ{F9E=}3 zZEqAwh7n|Fb7Zb{Q_{3$J4BS3_@G4)UE5C=N+-JK9ay*M**0%eqbqHQ7Nf*0pGT+V zu)r<5n`XY`dWOjMjoRXS_MPCmJ~uS&Yc(5p!mkMbCe`bM-iG z-bf|~c6#m2Ngn+(YC;rY@rU0;(PJ|b9RrUtOd!FNXtY>X{@qK*xzYW0t#Kh|ok z-ffU5?4O}`@8E{)icNpbM~l^(Bz2h0iLrx?eReGmiagr13HKc@k@v7ah!t_1r9=#E)2sRRO9{` zf2TcAR+1xO9WKqlNjS83-S0}@R7vT{FpGf)booggu0%LE*XoN%QzyoZ49B#9p%Nz- zDbnt)i-*!FU5+#rr)=f*+_ZIGd7Xit+P8_K6W@B&erC7ZX}iV9bHh<^3oRaDWOMWG zp_#opty>HJ%wbH@)N--dGp8$1Irr)d>d9lxdIHFY`#l*6(>elB^*)&q)3zjB9GrGT zx5?}JlprExj_=D0R(`eL?RK9Cr_(MyQG@7q;p;aywipHoGT>YUY6DuSfKVeOek?_nGz`F}&Jkh&JC{Q}X2G z7O~B1?p@2qEIo1l8W)?zJoBQ7WxA<}Hk@v}>@KZmmoNNa!-)}!eqfWF5vt>XjnzD0 z)jYmMfh`fun`siLQ8U<4X5}8;Gey7Ww28P_N7EWozsu}=XmOu2dAk=sB*#tLC(V*WuO)zj@-l2B>>T23@ zj@V7rpkfuml%7O=yt+aKbE9W2ASaW zMPmureXUPdpy?MSU<6mWmtpXS4{tMvh%*-+O_!qS4mT9gMT=t2(;ug7=ReU?Qd3)` zEW7upGD3%)v>t8fwTf0Mf?n(@C`z4*( z9PZmaZu+Ye7TigN4PAy!T_SgTCg=P@iF)N>L?Luht4nk-W977w0XA;83`$lW?pE^p z%xJ_cMTHzJ%NS$!KU0r?^ATuHbQ)iX!b?VETV57+RAgphnVIiS%T#27WyrKy#hrup zsPsY4sMo*6J(HK@B35EWBG=)>>BYYOL3 z-0xgI(Xc;k9P&BM0jy2>we z?=Y^MhtB5dANDDZ4jc~KnS0H8r*=G(2o^;0VbcZpEbs-vyDhErRL&#O)YGQpNJ)=9 z6~|cZupBZLe_Dtub`E;S%bh4hGpZCW+r?MmSjP0SlZ$Be-BXYS79Jk8Jf99bQR@R_FH`(Wn1pSCgW`y4 z>b1vt9JbT!}+lZSjW@q=se&1=)Y!uZgTH^k-OVUd4BP2P0jrY~_ z`-{$pV!~C1d#l%6lQs4!i`NcBAUzNKVbcp)$=$r&^ zdv>V5yie!TrLpR}z)YCWUF3>nQiyIY(65G@o3pXdp9LMKvUj*;ug0MhTlZO{#)_++U=mJXj9bSI#=t!LOpyr z*{m#hyFv^nPAMfRF1XL43ufwIyZvc!-Lg_?R`6_cWp*vIYsY|!p5+l&`|JMM3MEXs z7$~)y$}Cd6Z1!k%3f7K9D&*R3wbhda6)M}xP1Po6h3r+%trkb@lWz`KjigR7=6fU& zm_250 z8lk7m+X3}9WnQmb#gh@4D_`r}2X=W|`mUQrmb$vXr05z)%y|sCRNDReRMH6pw`DJ0 zB@JUqc2ghU?R1)*{vgFPDJ(F-lb;dizQ5J-lFy=DQTCD#(so9kK}<*?wU~*cV}thv zI>lA$q~DUIZ@z#AG`0RsN2I;2L1<(BG_w9tqUSFEe!pQ^OFc!0bHb9lmHN!W!jsx8 zCo^gMyH*jkrUx93pFWq@IBpg8!yo5dbiw!7A4YWUzj?jxpW+qWMS>qCeqS@mOG3v z=gmArPP)BMzQ(;-{0@8!sqU+TMUttk;U9d71x#*j(A=oHkls||UY=}5Ps~Q=cqE&m za3j-zZ|Dt`{H7)hu9aH<$epJ*J~ocvP)-olo!lgGM%)NqkRc0;bX~2zJAN=L;L7w7 z9qd#i*?I6bPJbCvluVX-JGJdbnPL|?MlsBi8g|O|k;xs{#>I+5i*DiKYZ$mG)MZq3 z;mW!`Y=@G;PB0$^i;?XVLU9y6yJw$_SXrHyhFu^JdHwjF#FI7-1i|#D_QOB|dhbw! z%qYZQh+g@TXq?s~*W?=){AA0oKtmx}G9LzabJJ5!xJln7 zw*OjWd(_T{CF$wy;LC#HxiP09ziCVSc*I16qM~B+^jg#OW^#?z;fG`oIWes$7pJ|Nxq9T}k7lnX|X9Qk{GGilKY)K|}Byv!S5Fp-Cus6QU9gMe#MW?%3_oPFOs zHiaI(cY7;Hxpkre{i>MW=4dns{pEv(E!vMIiwWwuYy83IJo4$J3rrPLJY1I?(HiR49^A7;aq zm_k2s43)%6_=S9^DBL4eiOn@?^SXj4G{&>#t?lXGIcb{{e=DUY$r0*^ zduD#=oD@$*{0Z^bjZH%LO;0uSslZrhKPh3JrfmDma`2W}RjFiIrRf=GUlo`3PMBLa z5STghV%u(U(B=HD>>j@r>iNUP>v$~n3H;Qd0#I%b|g5u7c`EV`zWt6m=eKgEeVYa(RkwQ2=l;ho? z=WZ6B9{ZKJ6GFo4_uEF!k4iZVms+(?!%bl#0~#|@7>XK`a*qci)1yDVQx-<+JPlbd zphyORtaw4{;&SYkNxxJ8MN4B4wXwauW|`H9$yPvnbw}=|vES^i;RHy|IXSysXl;7x zvVFa;eyZ6DUyHwj`U+Pe9N#)WzA8pcqdFrF&fF-kWj-$I-oF@w1vb(J*YaiDby-=B&d^Oyvw+YIF|LA&b7eTST_>TwCf~G1knkG6# z-@V0Ar2^Y_vai;@)4;%fSxa>kbe^_sSD?TzXCLYKAu!Dj`x6mnFUq#%B*PH)$8G6% zm(cNRw*S%Qg2s750+wRaJx_cM2WLZo3R7F) zf9~+ZPW*Zl<>MQ5#EmC#o*mv!s~>QugYxSy-TPY2uWy-50fWEo9;CaE%|~&s5j$cA zwYqv{v3_Elh~{T$parK-ulGXSnn?Zr(k>Tj`}oL%GQVHl7(vi}mZ}gD7`%9db##eL zcBn5gUG(ahU5MV%ic?#;*tZjvN71@e1459nwY4XLw$rk?ie06noWS!Zhg)V zLM_8!##4huMm&OoS7kzI`Hb1<$;ikuN24pRK#LVQ&oUwK*ZoOPk!o3tyKv@6k)8_c za~p7Z#>@o0Dsd^QLsAmy%xw8e7DjRbWC5Wue}sJVy#7GT+~JxLx|7qBQ$Wu(Bhc-u zTP4Pan#uv}r99$n)5=)2u>}V=+Z8rO9exoJj*)U30cdy>1O}(bk&@t`3)8fa)6Qpm zz!ch? z)#QpVQ?^aZ<;|}oiTM^wNFmh+$Oj+rv}>LgSq>qYtX*XtS4OYqY2}BPS`4%f4#r*< z_YmnPg2eHelb-GkC88@9Vc@B9mi0-v8oE^3GEb{55ZS(=>GM!cuAs@bo0U$7<-F%w zR2E3P3VTo5c$b%q=6U&6L>YSdfC(BdNW*AF9>=(Cqlud}jOJRzMO}W=d)yg6T}53G z?uFl^z6lmVKbn$~GOR!EZksxQ6;Zfc^=vXI~=PNOrMOY3BN3i6qaZV&vSx9Uj}wff|P>M`&vHoL5D21YVJ5QAws6!4G;vZRteu@XJd9Kx*iWtGuPub zi;Y8Sm}iLSn_rdd!-859@!93}UJE6o*N?CeC$3xZ6KGK@%U=b4`SJJ*?4 zHgyUfH`kt2&REz)<>e-~aW++8ZRk%qL{+Om&&)*TIEmbQc{PZ_6{d4W<`u$QUFjqA zHHBXJGO{n1^hFh{cPLO+hn1&|f!Xio;Cl`ImpK>tGt$(OYC|~7w|QSA%`td~zEc3D z+RZJ|%Bj|K({ESmBk9E4%0_GVIg$IRvb2FSAM<0t##F@LxyY%*NG)I;cyvOLZKTYK zcVBAowGck5$AIEHQpM^F%3favnjmy~;uvlZtJ6e=28Z;^NW@38eL*OVl~ySaS<~Hd zk^q;$l=({Cm2s9*Z3lg$A?EV1Xp-A_*8onnMO_$)&vk?lv1@9YIkc(K=NfY?6M1}e zs7XTys&*!rF}x|5hEyudS@=yNHn)JDxaIQt)>ycldoaTKk`kk&@vF+p8)1Q|XrFt7 zVyNd4FD0(;%UB9K6`QXgO8Ca#q4w*D##{soP6s;BRrgg_bUwGI9&P2~<;p1qx=@s( zhcxZeFSq20{K4M(V-iTnN%b>}j9m)mP5t2`*ibh`4k|!;_XsFtw~5<2LNwXAoX~S} z%oZcy*t#tgNs^HWOqf>t>zn73(b^=C=2zc?tp+2s(7D56rgtuhVS={OfQVKkHvGAx zJrp|j9C3^2_tYv#P6CM~|50v{K<0IC?BNmu5-143wW#|O?7znPUx8f!{r-iC{KwYf z2Y-o|(5oU|YvG0ghb!WP^r2QX&x{}d$%_=cStv#H<-R%<<*!Nl{95?Stnr!@3OSPY zZ>abnR~(#35GB5V`=6ScLc&`}EB6-jbOR9bvLIf3=E#$JrTN~xDoH_{xMXX{6wP-9 zigT?CAj}Dl(1%RZiK}i|*uH}kmd>n3B0DWBE7Oh-S<^?6gNwJ@0lXQsS8yhn1}ij? zF!o8}HQ8vZ=hvbsqAt27nZ+-62^LC8AUDWlFZG|@E3>+NMlzpHp07WKvrv}g4iit) z6VHAMjB%^iy_$Br_``5hB~B$XPdVWj#fjOfFMiIPF{?a?c5XhU0-} z$-Xxq9&pyz-#19*_6?cX>HuP%L`gJ?32kf z+?JAj@u5{V%==MQ5=8ENx?k)KRk=sKTuugb&Fn?2-fDa+0+sw@b?!}xTXUbC_6Qs@ zKbF~{s;!W7G?4-(5}MC+ma9+T%rksH+tl%?&Pp)~2i$*xuQ^daS&aKw&3R>%E9;|s zlKe#7l=8kED&96RNA-aj*J}FWeygo}39HJfbgKH5(PUnnTgliyQ44lMOWL0irojQd zZXzhra78f0nBKDeETaNxXA;pW&S*;A!F_za^|JdK+>}d7l~KuD`;Kk3O{XzKwocko zZPWw2U9VR!A>9SOZ9IrE8Liq9xkI~6SKhIG2Io`#6)0{nJ2Wvp1Mx9kOa>-kSk*?! z#w-*%Y+>@Y;N@?ErEz^*GuHCw^AUacPhCS&=+7n96?;`T0JdjK)Iz;!T$pfiGtn`} zw3mr$Bw0bPeyDtIe8o9aFUFLrkP_!U?KAKQwG@z8In7`Z1!=IQgvVQIA5cga`@r54 z(TTi9eG+G#@Lw7HfA^bj{>@vRz*-AY&}AeIaKZaxE{`N3b4jrM(Rxfl)(AqDvC zu@o#M;7zxYp}1Ktsn+cr7eHaZO##6o_%-~(gS4hPj~?vFLjfgoS-XYxy>y5>CVdSd z%NY*5#r(Nys!lBjBILuhYcmp>QO%d}K>^i)Qm&RxjyqIz&aJO_O(mZ)aDLeIFlhxD z#>E*Yv_*@9^GO5TT3A#d)N*5RK;`9YL?7eX=T&a=m0`chn(v8Hc>6?FGzFpjN(hz=^B@~O2iK+l@U1Hp$ zPE}YxjL0%^sYsW<1AUDmrBPJWfvWgQf2dL^4h}CN;CqnaYTiM#`+IUzWRNaPFZR=Q zQ-L?^?-q1@X%D_osszlIx%he+Ktf!I{`A+nFLPusm4=?2DDnu|Uobbzq^I08eN-0o zg27cqS7rNUdMlvEm~R1qf}JuE?gAy%P{4C5hD};)DV=)jWLbx=EG$DYX;Eog9&#y) zxSBB?vm=#WCqi~l?j+7LN?fqaybMs$_YCK2WlpygTLKPH6ub6p6l0SpQ|VYUNH>OF zNcX)Z0nXdk&;GLe|6mx{Ur9F|8_hMciq3a|SSxA=7V{6sOn<`+IE;Kn0lQ0~0qd;# zBWz<4DccQAn0XjBYExm0=EJHi|8aIi`fT;*^RUWH;JQx{l>r zgeWDyf<5@cvCX)=RO^Oe>;I(9CO>Svh%Yf}vlVAG(Ngr*N*}gAJ0=;_*MWd_3W2S*;eN4Y*G-t)BjjOJS5f= zNZ$7Tn?&LI1Zp0XC6rbw#oPdDN1Q4YQVoJbiO@BSDq$7@Fn?IhZD1Xl@+^VFe zNm9>{RCrukw*H96ooAC0V#4fd_rwLcb5WuzXxhEneoJ5L6+Q*=b_CAbgHykF@+Di` z#~6LyO?R^VXjS`LHg(m~rqb%Jvi^7u8U}qf?#!8$_#e35JzcEEuvfa?G|rjoTKmd&NBhNn3!T?eN;2~Jr6w+}CahHE=MB5Z8goR#i?s|pPMCM-DMPOYV`cj9r^ z82Y)#9m1vcbp8x;U0qrQm0VBPF+1XkCoJ2tHd;X$X=|^|{LD5!nB2jM%>qxGmIXa& z(C%|@0#66$*$J#;9Qy!%PwY%aW1y_vEH2Ld(7({oSjPNcbW_-X8hb`>?!Gkkk4=7u zL4VXL;Im&U9NV2kRMqmgO`wbTL@)N z>-s1kgN@!iQ()n9;4wasLqxfb!{#LnrhgUmnSH%O2YgXvC12o-+qa;gmovJ zGw~J-Hb(+HK-hj3{3kPAeWn-nhE$%fk`}K8sq~5C+>%3ifhfPb59y2Fibo?#inr05 zd76@@Ijm+eIdrF<)Q_7IG3N52;!Qa!Omjopi!0oBl8Pt<3oV#Uf^l$WNq&i)O<#!m z&YJ@ta5(mXBnU5#@0~dpJpl@Qnn;b*R}*8k%xo9SMo06q4PB4CQ}H;Z@)RO2#eq23bK{qveZ_i+Z!9tlNc@2Q5AleO9SzwVm&p zaM3vG)_e0}kKzLP;9lSSs$(#(^)CPAKE2|J}BGxJU_Pr-|GK#ZMDNDd?0R*b3MOyH3O^i;*&!=VI^ z6Dc-eA!a!{6}^~*=h-=pQ=}5Dhlhtkr$q>tEPdwUmWm3KwPv<1*_VEiXd>3MK2=xGn5n0Gx*Cr@Y5o+SB)k zyyx6cdCwK!#zR%I+XQj@f06h6>{30SBi`2BJ|=&T;6hN_Bg}SNmXqFWZRQoID%E#{ znS_Cd3_X;1w^fo@G%|0*4-ps=(iX-bqYfJ98S6Me zDFp)+5a_za7htfJ8rOQaJtXxE=fyE-9#^HI!G5WlwtYtgvT9Fs_p{SVbH5D>l#Lp+ z`VlQHa)K@!*;h5r#Kp#5n<;BQ4Ox%@#f=1GsiX1od}`2l)L%{*Qn|jeKm9sUpp8!N z=`9Km2So#i1;}oPKFjogPe_Z|NJ#U(<0$L4__tfRO6(A|GiqN4YhBAN$Ex}X5NG|O z&l3|<+o(cXS_z;%A;+-qaC#JgLxWpQ>pjwHX4VHxrUl~y*$t?x;-9aJ|GWULbv&xr-rXhHXx1LC+;+_s;ADdT|3Ro_`_oIVT^6>yzq^W4l&~v zTmbJ?`}(QwZveG)Ihs#-&&5~v-lhv7kZ7*c&0VV z#1SYY?903};&yKV2~%9iEvRr?SVWLH@)-PAZ8ZZpnd>UK!ATgyGp ztx)d>EAzkzRc>`+kn5SQGoFU_UI#;S1(EJf?gIS>7lxTvNE_;h35rJjXKS6#*mE*U+2N}Reu;18| z1d3{m7l>rX$XCUeA1ucyTM_{EckOs&{XLsLe-E2XaZFAQ2*w_>EZTofq0JJ2bWoI$^a0KbG#DvM@w#=%(XRtfI1VYj>KAQk;DA$B*7u z0ke&0)=LAZ8cf~d?&n~xVUV)fqWtL*=Ho)gD}yI|jC{T@+Flt$I-s-|elQl6H4;*c z>cMh7d zK>g1)9b)#4chNJ*`|nQjQl}O(vM48f`z!-abiR_6H6Y|eN@ZmU7tv;1pu8Tf^qri3 z5zNk>!!-pS&VpmH0C>EA2GrwFB^Mxxy9A8L;>&_V*~|*pTLNVlb&3!rFV7VHTp?13 zQ}JS|Q~-RcF^ES<=yybXn7f2LOck2AhG?@;izR?TSu^!aWi+*fE!&&Wmk6K7*hC5i`kqc4i|Yzej<8^*doI2OQT+ z8#$!Z%Oi}o_3B54$mRsw9eAg{rXn>yg@`)+^cSG0F*BK{b4QwVQ1OzH`n-CrSJ~4Z zJkR0R8U5x4ug2iJae>hCOJ7g}c`ayJ9)^b~N86<&lvA&7;`Jv5t}y{;_nx2_|IK@a z()wb=?ENGstf>c?V*55zGbpR!;T*{o#TN=Lr8BG(F^dqKU9RT6C3&j7lKmo)$%M3>cKTJw1EZmj1d3YB zR1Z`3RZ0w?7uQN>XEh8l)0I>M3Hw?6dHkrkPMSZg^S>wN zlw$FK0xZ(!IFr8vxM{|#Zn|4IIF~GM2ytcK+VEeB#dZ(CvOhKoC z6`Pmo`Rksf#sHK-a%$gO6kLG=TwzCy-k}QKbQ$!`kCuq909SaYs0DL7T8^~_j?M5N zxfH1BvC{jK zO2>TyUl-qx^n6@Cy)ObIg+o;ic@V(taZ=OL@{gw+^Zx0CI)ppLx4SV|ffqez&;MS? zp9C=e@ge{2+wG_NRoNVG4ZN!*mG7@zA=+7ca!E5?-S5nE6XBSO`dfw60I%9~lpqnZ zig3LURefPpoVCg`@cX6#J)N2+kA0)j>Ub^Ea)?K};_)jEZ6wTbd6-El4(XK5`_P7 zuz#Yg<2dbA%X_|5e=Z`({&b4e*i^}X*s;e{z=7-!ldslx=uVYFKADoHq@npkBzwoc zMKT6%u6`c(Oeze@5p+Vl_(qzmge^1$I>}Ya*v2v}Qy61X!iCjkre9e$foV!RE)CMF zU1<6G!Izr%${x{6rFi~0qwzZ7bLsd;V9pDI>jgwtA753%C&^Ak5$k3Zz3SV5v?(LI zOS%iPM>D=0{w5z$=<&-&EX{dmhtBf^arW9tiEA*9;6dUfV>?oZh612^abSYs!Y}2D zzl_$+*C`do6tHx-{X%2AUhGi7Y`DDcvDp+SD8tgh%XxzDd+>|pA7{UL;wyj;;-{jy zsCmUj>NsKknp1(7{)K6x3BVEuZxz1?;qw9z6X%-6?-UexhlLyjK`J7lp19eqfUR=Z z+}{J)FENnIsS)fJ}EL<~%ij^JGH+=v6tf!$iM`E!lxi z)%IX#O;Z>K7X$PPh(45x)szr@kAINBG~W-9<%{&Esc;}E^j3E$tj2W(eJOd4=ELVH zL!J2}j|`)(xw_>JbQDQ)a+P;!oMC+Zxu=V|zU-}D@j$7P?U)-e6XDbV#E>{O7dCry zfyK4((jS2+8$KV{G+yg!43weB$6s%2BjJ8a!=(zDnVGhvse}iCvV4kollQpV?=KtJ z5H6MOxMT>*R^xi$=99^4287&sJb6NlZzmbOxpUK@aK{CnEMv@Mt-IOZj{*vHeH5w| z*;Kdnvky3KxCiS!>p2YT^ne)hzKNuL^z=tRvhh7!Zs;bZuRoyb(-dbuwljWw7)tfl zih8a_O~AUaiH*4b8tq_OMetS*FPY!9jY*fq$_;J3(YZh%DNV|;8NOM_pwZ=;a4bmt zz7PMY;O7+v^*Nx$fY6b~ZTZ%6bu>-Im~DB%!*q$$w+a_}tFE;e<$Te7OqpzAyEhcfCeI;RZ zUpe~r(%XXfUufQ-irG6T3C9#BS5|NKqoN%ZcwJ~e$LNAU$U1ZmTc;2Rz5or58s$)t zk#AhTxZBQSBRtrIM6p>fvt9d$6OFl=$R~klc=$UJ%9`^-5;~^J?Mr@VpWD1Gdmoz*GRQyG!h5*D&%J`An@*D>48o2()?b=h;Of6{&sfL*cZ%^(>EHH| zTk;#g7J9t^SD0W)SC08!A%FovMu3vUw)i7f>uGv9|LAd#i;C~j;FreYyFkQtx;acU z?uS79_k2I>hiGjqGHQa`+NuZBiki1--ezWIR;=W-i%W*82QX%9rl+3z4R%K*(csng zS!m8~LC4Qh;UCNO*;fcnrq>_QY6_h}k>2VZ{U``86Vy)e@gJ#0-(%>_11}DPntNrI zLr`BLn($x7$$0qrnVUlBR7&GLp*$nFH?fHXeyiu-@;eW)DeSlhPs{CFdX31S;*YUp z`_0>=C9{E0-tBUudw) zU;n((D_J}<-p9WEJNI5NGq7fQK!y6#JvammAb$9EBm84oy=7_zJbjUL47WSioeSg9 z-kSQ`qXPwB9O6(<4&{D%|$_i~@`Emk+peyp2bo5OP2i%3d;@W zTyksLJcOO~DgW5}zbh+ni?vJZM!PSo#`8iQ=*_rd(qlAB5?8k0DBS3%W!8Qo*E%*6 zwS<#IxHZPv!N_}E%U_-MLJ~@D!hxqyY5V;R1G_SPG~v*|3v6&Pi*V$HvM~rdE`_rC zPk;ORA&8R19ls+}DZYIT2TZ>(_ctDfUK%4Y$Dh9^wuFRPN92V0w&NHE044OW>@P~_ z$Gq8pD51meW0la{SS2*o^0GznDzy&e>Z3VV{o~e>-|TPnYVDGcINTD-zJ16q1>RHm ziw|f0v6C7mC$TtWvxp)KwC5ijc>|vWeB%RkQ1Cf6l3J+nEU4`P=Ri=j7DQGHXr}-8 zCXAq9DQx#}pZRg37bTY9iskz&Y4sn+{0G^)7pMbRCG{|WQg70Jk23e7}Cfh5`e78$-1dBYAtulpDAD8oD+?^ESw(*`(o`9T~rv_f> zXJ0YH#`3^n3pNeEb32N@yweiP24R^n4+;DS$vCm-E3_%gwn`$Z@h5~MSqaf?SJz74 zs0nBf%Psn5dd$+!>ezh~P>|dj)n`U-H*fWqDN8-iekqb?P)IJ4X^J7@B2vjdNj_ri*Us3ZQSj|kl4j%9qh2OL!$YteFlm1w8VC2?cs zbJ64%+HzNAJN-6cXU@*0psU-6%Q%sMQ2oSx;e2}8DAC8V*Vpe0&t(=ckmJ#m@NViO z-Hi)g6cOHFVycvx9p^;t1aDU7Ph43~NbI|gB#mj>CQdUSEsQ?#R_`Qs4S0BQqLsH0 z>3BOQRr^*k^UU!3E^ z4Ac{CxFpe}kG-pSVvtP#XesK=Ox?Q?^{4rDOAi{dDH^(>QF&fM<5S8>#Sub&fM2@! z^X5%2cm~TJ6nYdt(U5AO2{amA*AclH@1neK=^jHdpvkdRe5&dob(3dv$EkPtfo2C3KxwS_-a|9vn! z8T0xwtvFPeJLl(Uw(Yl9AEcE>9T5oP)f9tck;EN-1yB|624;fJeoTZ>vNO_0bhRu2 zM50lJHp;Lp55}hCr&`k16>3_A2Au3#uR}Lc1Joz9tL$@@>JDs+EhDfv+0Hk@Z#k4< zSdDrcsRXN9{!oE7?Z=Os#qO1Jr!jr075Vx^{<)-lixpj(3Na%d9owq!-;B$oEO!)f zarTRJ#f=K|b8+kaf|60j3GKdKs$F3ItMXh%MQm#9jXz@Nlf)3>nWTv9-5}O%oKshK zvje1RM~SxBxbmgav*}D{8$^7^1$uoOILn(dm3nNpD*D~6^x4^e<{pqZZ6_D#nh$aD z;lHETJUl$m5b@=sZ@jRNGDe@u=7iY8EVcM>9i`RVagwa22){|q)Onbq(?k&#_o;4cN<(QWlrKwB*yj zr0AouLgxS8sLQ>!u+p!Q8+v+Si%c`1^$eIBiUa6>gPXK02LP35Vr0U*&Z(_^>bf9E zrO^CD?2{#h8Sk5I>X!w_$+1QOTc=CYwk+Xxt7vz0dfy`ni#rLZH4>h#p8wCl>F+aQ z42F6Cqje`1KlpYPgr=Xg!0#;nuU)({3zSDpj7ui?vRu?cWpp*bDF6UJMIP4Ofh<5O zZ!uUk^$DIxn$e7kHVloY0J*J|E>?JmE? z(046mem5s=X$5?$f@>-kXYf*qzPOVKZ1P<>7iCN7>-1O& zo{>gMSU{^gh7q@>Gke}rmXir0M>kZ5JdO?S+Z|%{4a;eFDo2j&+cqoWO%?u^(!G5l zgA#MmZOZWAIP!q$naV=C01$Y9sQOQV$GUCoFiW?fX-q`-`*7zwfPnrQe|{nX>0SJJ zCNXT5;5#1F3MWQ2)NNw8SJRW>IjIptXI+=r6=*Jw4&=u}b?ZBN6uVI!TdTD;#w8^RZNHZt@M*Qay<`5$`A)ABbPBf0E>EH72GT2qF>I zqL~0K`q$C*cr+~iVhN?lE2p0j>VIeP6g&e6+P^Due)Z-5e*pWvSY^%P5qjZ{Aczmz zDt{Y*BFMlOuqdS_==xb6xc8LnH^S)1hv&wmjBN45tbnUq&O*|jNc=K?GtJN zc5v<(J9q-((hvh`QoOi|F0gghp=E8}gpz9batz}P7$VeGak&G^n)DKo9HL0bga7&^ zIBR(1VXr}vRB%aA=0cU35z28mQ{TP3rdKS>56mLEewNFiKdW3K!j~6DAYX{hGm+8% z2OMGF7kzAT)SurQY<=o}6;id&+Gpm2)Rceo{Oqep*1<=+p}YPm-_g0msK76wp=_@9Nw3ilTM+e)WE2h@Y%90}gc4OK3V$uh9E42=>c&nJ0>q=TMpU?Rb4w9Q5OSHk(4XMX<>dgNzs)rzIq!4Ch@v5Pz z2-5TJ-x-X%e%)%yi1(SU#5X-K$X!;jkDVwWsAv+be6#)daobo`{@#s3&a3OC#mI1p zh-Ao!$XHbR+=Q+l<^+Aw~se$rx2B7!39rVx90 zdv5#3xfkCAu_C2%Y&!d|Tq9RL-o(yJn}|o8XQ>saf1_+)_UYf_kUVs$>gr2b9iMO- zWmT9+8_LocH%p$qNs-xTVJDEsJRthW7TUu$=AmwW+&7qr{#}fEM**3?q;&Tf5*z=^ ztlLix11MqsU#2ub=l2H<5<0cftFlUEC=Nbd#*TaVO9^1*3-_x4a*;LwRnPMw)nrqb zBX}=sp5y`;lBd|uvw*sa)LT8DugzSIHR{dFf;shoNq(AEc>#wgYZNZd+dv={3Lf{9 z1+v-D|EslYk7s)S|IX1#QaR~35>kW`+X*F+A(ukQwGcZbj+AR?F54+x}D?|c6F{%iJmygu*G>+`-mZzJdCWZgUj zu#aEOz5{GYg05EKL7NkLYtW}|Z^N0V{rR2-`)u6!3;{ z2d8{*VgKn00SF3-0P2TV8P}v(|M{J=Sk(=_umPO4=ZiFLm4t!^zL=Yjd@yp_KQyce z8gJuvv+YF}69v-&{FOj4ECWRM#+KTF)K077)I+k$S1!g~`^6*h!t1`ATaK3!0XaP= z2%7j3&uE^?$VgNi&;*t~Df_zMY?}r^fS_l_pN7*?vVA;yq!GsrZ^(B?Omw4 z%HTk}Vz3?1TmgTT)PNG`R;*oe+r|%ZbXRxT_lccr_;DLfBlp-a_+f(88MfetY`Q0* zJ2m@GGMbaQ_c35JX256w@CHCfcUFOm06{;nZULYu?mzjfKRxW_Gyk8Eg1?u{{`os* zNs`zPaZ7vvWc?xs9;Syu0}!jo$n*fgmwNM$xnFT8N1N~M-R9rk?ve6U>xvt1H^|7y zN|`d?HPGK`y}j3`w(7^rZt|652@pG31Xfn)oVIG@TNzoYqbWg8YxlK_R$2}=`v4Xr zvvDIJ-nxy~j|KgjIdMtqp1D;0_wy`PoeWU<9S7+?UiHZ(W$@DgP-^ zb;qIUu&i%n_|ksqSjtE>G?hKArMot8$9+QRXu;Ke?g0b+md3H0xcd4oAK-Hq2MEph zj;WXimR+opbvL%)rw46k(G$Rdw>&($T77*h)6HcB;#0*M8O^MH2kyMc!G0tYrb?Ug zLdZpR4`TGeH#d#;2DM)WaN$i&>Dw5urIeRUcecp661VsQa^Ssa9q~e+j;BBT!7q^X z_hoqtZ|u8k4&p2XYq0#_Yo$>$D<0lXSjlj6a>L)J;cf(1y$#jK9{xsVVJi?ZeX01} zbQsk@-K?)W_iW&4@Jjj;Ty)PsfES;ur(B&f1^&ZT7pH3Tq8Y}e6LJALHxv^0PnY+- ztIzhO@6XPT;nd>kzIyWseO0Sv=2u9Y+{c#Ea>i)4@#@0-cssAXplyM+Ols>hBqAv# z{pSa&y0)8y>`kMTuLbQCN%^0*@xP<67u0VV(=0$VFNko=Qo#5pgwnnWxL&{4v;weF z3dn=75YE0V2krPL%t}f^t4>M}hTy;(bk0M9adDOI%FK%YQqBnY;KX-p50$y?T5~qM z->y07;FZToABsvJKLz;BK~!ns|A|5j3JiR4eZUBV*s9h0$a3T7Rh2`0V|zpN7O5pI zF3scRv!;7Mku~)5l_KjrC9vl!tqHGv%Q*=W9X(r~wo12X(bTIgdmWd{A|Cp0he@)< zZE0|ieA#&O9)$&)ZwDqJ~w|f*{fw$nz;gc)xR!TO@*rM zIg`_xt^(*|U*_xI4%Ebq9`Sy1I={-V(W|Ykjrn`NAav~9Y{X@Jb~wLq+PDCnY7%0* z$p+n0q>>M|rDMf^yD#fNt*^MEWO5_y;^#N^7PD8Z-8Qe-)xKrW6|vpbkl`}?uI}bH zmbhYrhd;nlEaMNCv>^twL)G@uG`SmEMSGo&G#KRj;C7uo<15&I{ik}=_nvtn-J|z+ z7vXv8*io0)AP~jTPRBcLnT8XC&Bx!QDWvSy4wM@WdS)sc^@?TfXqm(bt6n&7*RqbE zfD2@Xg?)FoyDp~qjQ6MA3H}j;%!*=*#Kpb7w4s+NZF*Yv+czb`r2T`X{TEecu|!Kr z@zHNx9`C)sW8CpI+1SV;B&VFW!vFZT4iG_gv^dsxv1+wj^ey|=*7xlpiu-%#?*Mj@ za;Z>0^wNImZYKg9nkV0M5R(N#ows%e>uy_fz`H)W46D)YtyE~J`lw8G|FHmaM`V!P zha;3^V?#R*fU*xETtC=aEfkt$dT(+fWa3G29FW+iRWft2qAIVzX%?pn3a@ms0z#V+t+UJ{09RJlX5rX_0o-FHPXnMh+aZond$*y!w6wWr2a?IQFgW= zCU1;wJ84QEW2A~O$B>Q{7@?wi$R^&PGdvx8<$S!10KGQ}^qz;1@f zo#$Fuc10*X++^LIS>fqxI^d82p{?-BI8k$UkU;!okBx!Xkyac&ZC~oQ1UQXV*!aKX zfQ;8;HwWj1#^LSK*=*MxY=xK3zl}M9`Yv@e{<}_;`YbI~RQhIeje{$%z?!ukxo74K zdChWG%qdA(#p(suf30-Si zXb6A$Ss}W2!!ffb!825io8^1Xq6hpJjSzd&m=1J!al>bJi(p6(q*Sjq1M+~TpNvKx z_9$BLn0e9)J79wshQM{Rpi~|D3(r-+ z4egn*36x_wz(k>{i4p;8_LZgX$q733LM`n^2%flacO(qe>lw|ytC_E7DGWd)0I8FN zO1eHrk|gq;KcU|n=O|?FU)=b|9ntYL_&h?jerjL+lmMQWt&yDG#2L=15)Dy6f>dbbKf_?!?T+n7nyu)r!drciGPd zhIAcsPYv9&42Xp3drK9GDbS?8DjU5=B~BI5woloC%szGLiGz1l zgBg2rJipF^RVC*|4V&Rd)CdXi+*VUjO%tCF&tZ`GqpSrg(h>4h;I0KtO&ZIBQb^|I zS|m1Bq8-kauaBf%&P0yGW5 zuIc3W3z4vr=x!Sqd{NQUeg^e%#VIMH_^LL^hZ6A=C?iH7X~es`G?O8_}gwy znzfcnVn1uf<qzX8{E{@`AVISIN%bvtRFE5T zRLDT1;==93JcKeYL~=A&1to@4Fp$nOKA!96D3{IMOSIe==IGmIJC@jMU%SBLu<|B#g%_4_ozIL@ad1CZZQj~<@7}-iA3rO?j>2`aEH?NQBbe2g;;6S36p6eDL6SxYV=4@aBL z*UXfRk^P}Y{OW9FgZ6Fbe$sZstT9jjn3lRzu?yi^T+x@aLfdG{j#-pAy?pW(2go5r zk7`g&hG_2KqjzWQn>kDI%*RtCT`0c;b^WTYBIWtqE?(KZI9)iAuFrN?ImRrnjP>%H zbBdmuhVJH9pknJBN{Q9IdXO<_{LkXK{9_dN>PyZdA&bdKd1@UIBg?cQI>0JdFvG3WF_v^(`WZJ!a{;a-`f=xA4X z+KvQzM&G0UV0^0iPZN!SSrVqp9vx;m(sA>NdN-W-6YRzuT(FxLZm`w#)!=;__5jK7 zuyhXww(nrdq>onr99>!1TFI3uVy<47SqS zCa={`DdTgxrHfTsuzg0*UMJnmWbLkdJw0CJvcis3ldjt$o@r&=Xx^HiNxR_CYP|b-36}hM9zSnx0&9eDMiUGAp?Lg`i~{rKg5nW%Yl;V5u0y#f*%i%aPnYKCvjA@Fx|zA$?)9C zj-h)pk450gVT;WNuV^lr*E9R^WZcWfg3ZB;pa>VQN~8MVObfmOY0Hx!T_$0k=F)6# z4_ah$Mtme3!2=81Q-4k@K2L!m@HcCU3AuX&w#&%q;@9a;<<&Hg2SU74=#NHYaNGFA|Q{#po*li!_jjC3`l(V zhjCGhhp{pHxguo>wcx;R@! z3Pp$Ueg_8r#1}$hPek_>Ih|U%70`$5S@ibJiUKpcHv^scr4pVmM_kZBOy3G~qn{{h zVmtP!q*I=!L#KV^U2zTL`d=r!X)73=lq9=wC$d%f*gv0ey%MsO zE5BHO41)_cNv9u~TAI7dejOT2lH_l@ApOHL=Mp8f(z4~fZ?ujnk=qc_u`v=K-w8gG OIb?Ul7H9MG#eV=i-w%lZ literal 23973 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 H{Qds`$D9hk diff --git a/ProgramScreenshots/SettingsSiteReddit.png b/ProgramScreenshots/SettingsSiteReddit.png index bf63aa97ae4541ba77cf350f985d1db5622e924c..5029d26cc0a210527b6f4f0f825872200dad1c7c 100644 GIT binary patch literal 13975 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 literal 12995 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 diff --git a/ProgramScreenshots/SettingsSiteTwitter.png b/ProgramScreenshots/SettingsSiteTwitter.png index 55a1b68714614ed4a5380a515c49292579ba7fb6..6023ee6adddb588281872425383d74100ff070f4 100644 GIT binary patch literal 15348 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

sLw=n}m>)ge16#^eG5v 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 B60iUO diff --git a/ProgramsComparison.md b/ProgramsComparison.md index f163041..3acca59 100644 --- a/ProgramsComparison.md +++ b/ProgramsComparison.md @@ -5,6 +5,8 @@ https://www.4kdownload.com/products/product-stogram | Option | SCrawler | 4K Stogram | | ---- | ---- | ---- | | User managament | **Advanced** | Primitive | +| Automatic downloads | **Yes** | No | +| Downloading groups | **Yes** | No | | Labeling users | **Yes** | No | | Filtering | **Yes** | No | | Collections | **Yes** | No | @@ -44,6 +46,8 @@ https://github.com/RipMeApp/ripme | Option | SCrawler | RipMeApp | | ---- | ---- | ---- | | User managament | **Advanced** | No | +| Automatic downloads | **Yes** | No | +| Downloading groups | **Yes** | No | | Labeling users | **Yes** | No | | Filtering | **Yes** | No | | Collections | **Yes** | No | @@ -75,4 +79,4 @@ https://github.com/mikf/gallery-dl **CLI tool**! Configured with JSON files only. Users need to learn complex configuration options, JSON, commands to use that tool. Very difficult to configure. -SCrawler has advanced user management, collections, labels, groups, a beautiful view, GUI, the ability to add plugins for other sites and much more. Just try it and compare. \ No newline at end of file +SCrawler has advanced user management, collections, labels, groups, automatic downloads, a beautiful view, GUI, the ability to add plugins for other sites and much more. Just try it and compare. \ No newline at end of file diff --git a/README.md b/README.md index d0a0608..0c95f56 100644 --- a/README.md +++ b/README.md @@ -21,20 +21,24 @@ Do you like this program? Consider adding to my coffee fund by making a donation - Download pictures and videos from users' profiles and subreddits: - Reddit images; - Reddit galleries of images; - - Redgifs hosted videos (https://www.redgifs.com/); - - Reddit hosted videos (downloading Reddit hosted video is going through ffmpeg (**ffmpeg only works with the x64 program**)); + - Reddit videos (downloading Reddit hosted video is going through ffmpeg (**ffmpeg only works with the x64 program**)); + - Redgifs videos (https://www.redgifs.com/); - Twitter images and videos; - - Instagram images and videos. - - Imgur images, galleries and videos - - Gfycat videos + - Instagram images and videos; + - Instagram tagged posts; + - Instagram stories; + - Imgur images, galleries and videos; + - Gfycat videos; - [Other](#supported-sites) supported sites -- Parse [channel and view data](https://github.com/AAndyProgram/SCrawler/wiki/Channels). -- Download [saved Reddit, Twitter and Instagram posts](https://github.com/AAndyProgram/SCrawler/wiki/Home#saved-posts). -- Add users from parsed channel. -- **Advanced user management.** -- Labeling users. -- Adding users to favorites and temporary. -- Filter exists users by label or group. +- Parse [channel and view data](https://github.com/AAndyProgram/SCrawler/wiki/Channels) +- Download [saved Reddit, Twitter and Instagram posts](https://github.com/AAndyProgram/SCrawler/wiki/Home#saved-posts) +- Add users from parsed channel +- **Advanced user management** +- **Automation** (downloading data automatically every ```X``` minutes) +- Labeling users +- Create download groups +- Adding users to favorites and temporary +- Filter exists users by label or group - Selection of media types you want to download (images only, videos only, both) - Download a special video, image or gallery - Making collections (grouping users into collections) @@ -75,7 +79,7 @@ Read [here](CONTRIBUTING.md#how-to-request-a-new-site) about # Requirements -- Windows 7, 8, 9, 10, 11 with NET Framework 4.6.1 or higher (v4.6.1 must be installed). You can check version compatibility with this [tool](Tools/NET.FrameworkVersion.ps1). +- Windows 10, 11 with NET Framework 4.6.1 or higher (v4.6.1 must be installed). You can check version compatibility with this [tool](Tools/NET.FrameworkVersion.ps1). - Authorization [cookies](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-set-up-cookies) and [tokens](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-twitter-tokens) for Twitter (if you want to download data from Twitter) - Authorization [cookies](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-set-up-cookies) and [Hash](https://github.com/AAndyProgram/SCrawler/wiki/Settings#instagram) for Instagram (if you want to download data from Instagram), [Hash 2](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-instagram-hash-2) for saved Instagram posts, Instagram [stories authorization headers](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-instagram-stories-authorization-headers) for Stories and Tagged data - ffmpeg library for downloading videos hosted on Reddit (you can download it from the [official repo](https://github.com/GyanD/codexffmpeg/releases/tag/2021-01-12-git-ca21cb1e36) or [from my first release](https://github.com/AAndyProgram/SCrawler/releases/download/1.0.0.0/ffmpeg.zip)). **ffmpeg only works with the x64 version of the program.** @@ -86,7 +90,7 @@ Read [here](CONTRIBUTING.md#how-to-request-a-new-site) about # Installation -**Just unzip the program archive to any folder, copy the file ```ffmpeg.exe``` into it and enjoy.** :blush: +**Just download the [latest release](https://github.com/AAndyProgram/SCrawler/releases/latest), unzip the program archive to any folder, copy the file ```ffmpeg.exe``` into it and enjoy.** :blush: **Don't put program in the ```Program Files``` system folder (this is portable program and program settings are stored in the program folder)** diff --git a/SCrawler.Plugin.LPSG/My Project/AssemblyInfo.vb b/SCrawler.Plugin.LPSG/My Project/AssemblyInfo.vb index 294c942..aff7654 100644 --- a/SCrawler.Plugin.LPSG/My Project/AssemblyInfo.vb +++ b/SCrawler.Plugin.LPSG/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler.Plugin.LPSG/SiteSettings.vb b/SCrawler.Plugin.LPSG/SiteSettings.vb index 3e721c4..239d091 100644 --- a/SCrawler.Plugin.LPSG/SiteSettings.vb +++ b/SCrawler.Plugin.LPSG/SiteSettings.vb @@ -91,7 +91,7 @@ Public Class SiteSettings : Implements ISiteSettings Public Function GetSpecialData(ByVal URL As String, ByVal Path As String, ByVal AskForPath As Boolean) As IEnumerable(Of PluginUserMedia) Implements ISiteSettings.GetSpecialData Return Nothing End Function - Public Function Available(ByVal What As ISiteSettings.Download) As Boolean Implements ISiteSettings.Available + Public Function Available(ByVal What As ISiteSettings.Download, ByVal Silent As Boolean) As Boolean Implements ISiteSettings.Available Return True End Function Public Function ReadyToDownload(ByVal What As ISiteSettings.Download) As Boolean Implements ISiteSettings.ReadyToDownload diff --git a/SCrawler.Plugin.XVIDEOS/My Project/AssemblyInfo.vb b/SCrawler.Plugin.XVIDEOS/My Project/AssemblyInfo.vb index 74f2697..c06eed5 100644 --- a/SCrawler.Plugin.XVIDEOS/My Project/AssemblyInfo.vb +++ b/SCrawler.Plugin.XVIDEOS/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler.Plugin.XVIDEOS/SiteSettings.vb b/SCrawler.Plugin.XVIDEOS/SiteSettings.vb index 84ff274..6adce0a 100644 --- a/SCrawler.Plugin.XVIDEOS/SiteSettings.vb +++ b/SCrawler.Plugin.XVIDEOS/SiteSettings.vb @@ -83,7 +83,7 @@ Public Class SiteSettings : Implements ISiteSettings End If End Sub #Region "Downloading" - Public Function Available(ByVal What As ISiteSettings.Download) As Boolean Implements ISiteSettings.Available + Public Function Available(ByVal What As ISiteSettings.Download, ByVal Silent As Boolean) As Boolean Implements ISiteSettings.Available Return UseM3U8 End Function Public Function ReadyToDownload(ByVal What As ISiteSettings.Download) As Boolean Implements ISiteSettings.ReadyToDownload diff --git a/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb b/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb index 13bd746..eb42605 100644 --- a/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb +++ b/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb @@ -33,7 +33,7 @@ Namespace Plugin Sub EndUpdate() #End Region #Region "Site availability" - Function Available(ByVal What As Download) As Boolean + Function Available(ByVal What As Download, ByVal Silent As Boolean) As Boolean Function ReadyToDownload(ByVal What As Download) As Boolean #End Region #Region "Downloading" diff --git a/SCrawler.PluginProvider/My Project/AssemblyInfo.vb b/SCrawler.PluginProvider/My Project/AssemblyInfo.vb index 2006370..5d309d8 100644 --- a/SCrawler.PluginProvider/My Project/AssemblyInfo.vb +++ b/SCrawler.PluginProvider/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler.sln b/SCrawler.sln index 0123c75..9a208bb 100644 --- a/SCrawler.sln +++ b/SCrawler.sln @@ -21,6 +21,8 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SCrawler.Plugin.LPSG", "SCr EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SCrawler.Plugin.XVIDEOS", "SCrawler.Plugin.XVIDEOS\SCrawler.Plugin.XVIDEOS.vbproj", "{CCCF47F4-C97C-4193-AC4B-C56DF2F9AA8A}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PersonalUtilities.Notifications", "..\..\MyUtilities\PersonalUtilities.Notifications\PersonalUtilities.Notifications.vbproj", "{FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -91,6 +93,18 @@ Global {CCCF47F4-C97C-4193-AC4B-C56DF2F9AA8A}.Release|x64.Build.0 = Release|x64 {CCCF47F4-C97C-4193-AC4B-C56DF2F9AA8A}.Release|x86.ActiveCfg = Release|x86 {CCCF47F4-C97C-4193-AC4B-C56DF2F9AA8A}.Release|x86.Build.0 = Release|x86 + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Debug|x64.ActiveCfg = Debug|x64 + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Debug|x64.Build.0 = Debug|x64 + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Debug|x86.ActiveCfg = Debug|x86 + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Debug|x86.Build.0 = Debug|x86 + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Release|Any CPU.Build.0 = Release|Any CPU + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Release|x64.ActiveCfg = Release|x64 + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Release|x64.Build.0 = Release|x64 + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Release|x86.ActiveCfg = Release|x86 + {FC532253-1AB3-4DEF-A28A-DFDD9A481EB2}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SCrawler/API/Base/ProfileSaved.vb b/SCrawler/API/Base/ProfileSaved.vb index 842c0ac..525cb8d 100644 --- a/SCrawler/API/Base/ProfileSaved.vb +++ b/SCrawler/API/Base/ProfileSaved.vb @@ -21,7 +21,7 @@ Namespace API.Base Friend Sub Download(ByVal Token As CancellationToken) Try If HOST.Source.ReadyToDownload(PDownload.SavedPosts) Then - If HOST.Available(PDownload.SavedPosts) Then + If HOST.Available(PDownload.SavedPosts, False) Then HOST.DownloadStarted(PDownload.SavedPosts) Dim u As New UserInfo With {.Plugin = HOST.Key, .Site = HOST.Name, .SpecialPath = HOST.SavedPostsPath} Using user As IUserData = HOST.GetInstance(PDownload.SavedPosts, Nothing, False, False) diff --git a/SCrawler/API/Base/SiteSettingsBase.vb b/SCrawler/API/Base/SiteSettingsBase.vb index e114333..6dcb635 100644 --- a/SCrawler/API/Base/SiteSettingsBase.vb +++ b/SCrawler/API/Base/SiteSettingsBase.vb @@ -91,7 +91,7 @@ Namespace API.Base End Function #End Region #Region "Ready, Available" - Friend Overridable Function Available(ByVal What As Download) As Boolean Implements ISiteSettings.Available + Friend Overridable Function Available(ByVal What As Download, ByVal Silent As Boolean) As Boolean Implements ISiteSettings.Available Return True End Function Friend Overridable Function ReadyToDownload(ByVal What As Download) As Boolean Implements ISiteSettings.ReadyToDownload diff --git a/SCrawler/API/Base/UserDataBase.vb b/SCrawler/API/Base/UserDataBase.vb index 0f51e3c..ac67729 100644 --- a/SCrawler/API/Base/UserDataBase.vb +++ b/SCrawler/API/Base/UserDataBase.vb @@ -209,11 +209,14 @@ Namespace API.Base #Region "Images" Friend Overridable Function GetUserPicture() As Image Implements IUserData.GetPicture If Settings.ViewModeIsPicture Then - Return GetPicture() + Return GetPicture(Of Image)() Else Return Nothing End If End Function + Friend Function GetUserPictureAddress() As SFile + Return GetPicture(Of SFile)(False) + End Function Friend Overridable Sub SetPicture(ByVal f As SFile) Implements IUserData.SetPicture Try If Not f.IsEmptyString AndAlso f.Exists Then @@ -225,7 +228,8 @@ Namespace API.Base Protected Function GetNullPicture(ByVal MaxHeigh As XML.Base.XMLValue(Of Integer)) As Bitmap Return New Bitmap(CInt(DivideWithZeroChecking(MaxHeigh.Value, 100) * 75), MaxHeigh.Value) End Function - Protected Function GetPicture(Optional ByVal ReturnNullImageOnNothing As Boolean = True) As Image + Protected Function GetPicture(Of T)(Optional ByVal ReturnNullImageOnNothing As Boolean = True) As T + Dim rsfile As Boolean = GetType(T) Is GetType(SFile) Dim f As SFile = Nothing Dim p As UserImage = Nothing Dim DelPath As Boolean = True @@ -271,18 +275,21 @@ BlockReturn: On Error GoTo BlockNullPicture If Not p Is Nothing Then Dim i As Image = Nothing - Select Case Settings.ViewMode.Value - Case View.LargeIcon : i = p.Large.OriginalImage.Clone - Case View.SmallIcon : i = p.Small.OriginalImage.Clone - End Select + Dim a As SFile = p.Address + If Not rsfile Then + Select Case Settings.ViewMode.Value + Case View.LargeIcon : i = p.Large.OriginalImage.Clone + Case View.SmallIcon : i = p.Small.OriginalImage.Clone + End Select + End If p.Dispose() - Return i + If rsfile Then Return CObj(a) Else Return CObj(i) End If BlockNullPicture: If ReturnNullImageOnNothing Then Select Case Settings.ViewMode.Value - Case View.LargeIcon : Return GetNullPicture(Settings.MaxLargeImageHeigh) - Case View.SmallIcon : Return GetNullPicture(Settings.MaxSmallImageHeigh) + Case View.LargeIcon : Return CObj(GetNullPicture(Settings.MaxLargeImageHeigh)) + Case View.SmallIcon : Return CObj(GetNullPicture(Settings.MaxSmallImageHeigh)) End Select End If Return Nothing @@ -337,6 +344,13 @@ BlockNullPicture: Protected ReadOnly _ContentNew As List(Of UserMedia) Protected ReadOnly _TempMediaList As List(Of UserMedia) Protected ReadOnly _TempPostsList As List(Of String) + Friend Function GetLastImageAddress() As SFile + If _ContentList.Count > 0 Then + Return _ContentList.LastOrDefault(Function(c) c.Type = UTypes.Picture And Not c.File.IsEmptyString And Not c.File.Extension = "gif").File + Else + Return Nothing + End If + End Function #End Region #Region "Files" Friend Overridable Property MyFile As SFile Implements IUserData.File @@ -737,7 +751,7 @@ BlockNullPicture: Responser = New Response If Not HOST.Responser Is Nothing Then Responser.Copy(HOST.Responser) - Dim UpPic As Boolean = Settings.ViewModeIsPicture AndAlso GetPicture(False) Is Nothing + Dim UpPic As Boolean = Settings.ViewModeIsPicture AndAlso GetPicture(Of Image)(False) Is Nothing Dim sEnvir() As Boolean = {UserExists, UserSuspended} Dim EnvirChanged As Func(Of Boolean) = Function() Not sEnvir(0) = UserExists Or Not sEnvir(1) = UserSuspended UserExists = True diff --git a/SCrawler/API/Instagram/SiteSettings.vb b/SCrawler/API/Instagram/SiteSettings.vb index 7988e9a..bd03f70 100644 --- a/SCrawler/API/Instagram/SiteSettings.vb +++ b/SCrawler/API/Instagram/SiteSettings.vb @@ -57,6 +57,24 @@ Namespace API.Instagram Throw New NotImplementedException() End Function End Class + Private Class TaggedNotifyLimitChecker : Implements IFieldsCheckerProvider + Private Property ErrorMessage As String Implements IFieldsCheckerProvider.ErrorMessage + Private Property Name As String Implements IFieldsCheckerProvider.Name + Private Property TypeError As Boolean Implements IFieldsCheckerProvider.TypeError + Private Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider, + Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert + Dim v% = AConvert(Of Integer)(Value, -10) + If v > 0 Or v = -1 Then + Return Value + Else + ErrorMessage = $"The value of [{Name}] field must be greater than 0 or equal to -1" + Return Nothing + End If + End Function + Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat + Throw New NotImplementedException() + End Function + End Class #End Region #Region "Authorization properties" @@ -95,6 +113,12 @@ Namespace API.Instagram Friend ReadOnly Property GetStories As PropertyValue Friend ReadOnly Property GetTagged As PropertyValue + + Friend ReadOnly Property TaggedNotifyLimit As PropertyValue + + Private ReadOnly Property TaggedNotifyLimitProvider As IFormatProvider #End Region #Region "429 bypass" Friend ReadOnly Property DownloadingErrorDate As XMLValue(Of Date) @@ -184,6 +208,8 @@ Namespace API.Instagram GetStories = New PropertyValue(False) GetTagged = New PropertyValue(False) + TaggedNotifyLimit = New PropertyValue(200) + TaggedNotifyLimitProvider = New TaggedNotifyLimitChecker DownloadingErrorDate = New XMLValue(Of Date) With { .Provider = New XMLValueConversionProvider(Function(ss, vv) AConvert(Of String)(vv, AModes.Var, Nothing))} @@ -248,6 +274,24 @@ Namespace API.Instagram Return False End If End Function + + Private Function CheckNotifyLimit(ByVal p As IEnumerable(Of PropertyData)) As Boolean + If p.ListExists Then + Dim pi% = p.ListIndexOf(Function(pp) pp.Name = NameOf(TaggedNotifyLimit)) + If pi >= 0 Then + Dim v% = AConvert(Of Integer)(p(pi).Value, -10) + If v > 0 Then + Return True + ElseIf v = -1 Then + Return MsgBoxE({"You turn off notifications for tagged posts. This is highly undesirable. Do you still want to do it?", + "Disabling tagged notification limits "}, MsgBoxStyle.YesNo) = MsgBoxResult.Yes + Else + Return False + End If + End If + End If + Return False + End Function Friend Overrides Sub BeginInit() End Sub Friend Overrides Sub EndInit() @@ -259,13 +303,17 @@ Namespace API.Instagram #Region "Downloading" Private ActiveJobs As Integer = 0 Private _NextWNM As UserData.WNM = UserData.WNM.Notify + Private _NextTagged As Boolean = True Friend Overrides Sub DownloadStarted(ByVal What As Download) If CStr(Hash.Value).IsEmptyString Or HashUpdateRequired Then GatherInstaHash() ActiveJobs += 1 End Sub Friend Overrides Sub BeforeStartDownload(ByVal User As Object, ByVal What As Download) With DirectCast(User, UserData) - If What = Download.Main Then .WaitNotificationMode = _NextWNM + If What = Download.Main Then + .WaitNotificationMode = _NextWNM + .TaggedCheckSession = _NextTagged + End If If LastDownloadDate.Value.AddMinutes(60) > Now Then .RequestsCount = LastRequestsCount Else @@ -278,12 +326,14 @@ Namespace API.Instagram With DirectCast(User, UserData) _NextWNM = .WaitNotificationMode If _NextWNM = UserData.WNM.SkipTemp Or _NextWNM = UserData.WNM.SkipCurrent Then _NextWNM = UserData.WNM.Notify + _NextTagged = .TaggedCheckSession LastDownloadDate.Value = Now LastRequestsCount.Value = .RequestsCount End With End Sub Friend Overrides Sub DownloadDone(ByVal What As Download) _NextWNM = UserData.WNM.Notify + _NextTagged = True LastDownloadDate.Value = Now ActiveJobs -= 1 If HashUpdateRequired Then MyMainLOG = "Check your Instagram credentials" @@ -293,23 +343,24 @@ Namespace API.Instagram Friend Function GatherInstaHash() As Boolean Try If Not Responser.Cookies.ListExists Then Throw New Exception("Instagram cookies does not set") - Dim rs As New RParams("=""([^""]+?ConsumerLibCommons[^""]+?.js)""", Nothing, 1) With {.MatchTimeOut = 10} - Dim r$ = Responser.GetResponse("https://instagram.com",, EDP.ThrowException) + Dim rs As New RParams("preload"" href=""(https://static.cdninstagram.com/rsrc.php/[^""]+?.js[^""]*)""", Nothing, 1, RegexReturn.List) With {.MatchTimeOut = 10} + Dim h$ + Dim r$ = Responser.GetResponse("https://www.instagram.com",, EDP.ThrowException) If Not r.IsEmptyString Then - Dim hStr$ = RegexReplace(r, rs) - If Not hStr.IsEmptyString Then - Do While Left(hStr, 1) = "/" : hStr = Right(hStr, hStr.Length - 1) : Loop - hStr = $"https://instagram.com/{hStr}" - r = Responser.GetResponse(hStr,, EDP.ThrowException) - If Not r.IsEmptyString Then - rs = New RParams("generatePaginationActionCreators.+?.profilePosts.byUserId.get.+?queryId:.([\d\w\S]+?)""", Nothing, 1) With {.MatchTimeOut = 10} - Dim h$ = RegexReplace(r, rs) - If Not h.IsEmptyString Then - Hash.Value = h - HashUpdateRequired.Value = False - Return True + Dim JsUrls As List(Of String) = RegexReplace(r, rs) + If JsUrls.ListExists Then + rs = New RParams("\{.+?var h=""([\w\d\S]+?)"".+?\)\.generatePaginationActionCreators", Nothing, 1) With {.MatchTimeOut = 10} + For Each url$ In JsUrls + r = Responser.GetResponse(url,, EDP.ReturnValue) + If Not r.IsEmptyString Then + h = RegexReplace(r, rs) + If Not h.IsEmptyString AndAlso h.Length > 30 Then + Hash.Value = h + HashUpdateRequired.Value = False + Return True + End If End If - End If + Next End If End If Return False diff --git a/SCrawler/API/Instagram/UserData.vb b/SCrawler/API/Instagram/UserData.vb index ea3fff5..c4465bc 100644 --- a/SCrawler/API/Instagram/UserData.vb +++ b/SCrawler/API/Instagram/UserData.vb @@ -81,6 +81,7 @@ Namespace API.Instagram If IsSavedPosts Then DownloadPosts(Token) ElseIf MySiteSettings.StoriesAndTaggedReady Then + DownloadedTags = 0 If GetStories Then DownloadData(String.Empty, Sections.Stories, Token) If GetTaggedData Then DownloadData(String.Empty, Sections.Tagged, Token) End If @@ -96,6 +97,8 @@ Namespace API.Instagram Tagged Stories End Enum + Private Const StoriesFolder As String = "Stories" + Private Const TaggedFolder As String = "Tagged" #Region "429 bypass" Friend Property RequestsCount As Integer = 0 Friend Enum WNM As Integer @@ -149,9 +152,77 @@ Namespace API.Instagram End With End Sub #End Region - Private Const StoriesFolder As String = "Stories" - Private Const TaggedFolder As String = "Tagged" +#Region "Tags" Private TaggedChecked As Boolean = False + Friend TaggedCheckSession As Boolean = True + Private DownloadedTags As Integer = 0 + Private DownloadTagsLimit As Integer? = Nothing + Private ReadOnly Property TaggedLimitsNotifications(Optional ByVal v As Integer? = Nothing) As Boolean + Get + Return Not TaggedChecked AndAlso TaggedCheckSession AndAlso + CInt(MySiteSettings.TaggedNotifyLimit.Value) > 0 AndAlso + (Not v.HasValue OrElse v.Value > CInt(MySiteSettings.TaggedNotifyLimit.Value)) + End Get + End Property + Private Function SetTagsLimit(ByVal Max As Integer, ByVal p As ANumbers) As DialogResult + Dim v%? + Dim aStr$ = $"Enter the number of posts from user {ToString()} that you want to download{vbCr}" & + $"(Max: {Max.NumToString(p)}; Requests: {(Max / 12).RoundUp.NumToString(p)})" + Dim tryBtt As New MsgBoxButton("Try again") With {.ToolTip = "You will be asked again about the limit"} + Dim cancelBtt As New MsgBoxButton("Cancel") With {.ToolTip = "Cancel tagged posts download operation"} + Dim selectBtt As New MsgBoxButton("Other options") With {.ToolTip = "The main message with options will be displayed again"} + Dim m As New MMessage("You have not entered a valid posts limit", "Tagged posts download limit", {tryBtt, selectBtt, cancelBtt}) + Dim mh As New MMessage("", "Tagged posts download limit", {"Confirm", tryBtt, selectBtt, cancelBtt}) With {.ButtonsPerRow = 2} + Do + v = AConvert(Of Integer)(InputBoxE(aStr, "Tagged posts download limit", CInt(MySiteSettings.TaggedNotifyLimit.Value)), Nothing) + If v.HasValue Then + mh.Text = $"You have entered a limit of {v.Value.NumToString(p)} posts" + Select Case MsgBoxE(mh).Index + Case 0 : DownloadTagsLimit = v : Return DialogResult.OK + Case 1 : v = Nothing + Case 2 : Return DialogResult.Retry + Case 3 : Return DialogResult.Cancel + End Select + Else + Select Case MsgBoxE(m).Index + Case 1 : Return DialogResult.Retry + Case 2 : Return DialogResult.Cancel + End Select + End If + Loop While Not v.HasValue + Return DialogResult.Retry + End Function + Private Function TaggedContinue(ByVal TaggedCount As Integer) As DialogResult + Dim agi As New ANumbers With {.FormatOptions = ANumbers.Options.GroupIntegral} + Dim msg As New MMessage($"The number of tagged posts by user [{ToString()}] is {TaggedCount.NumToString(agi)}" & vbCr & + $"This is about {(TaggedCount / 12).RoundUp.NumToString(agi)} requests." & vbCr & + "The tagged data download operation can take a long time.", + "Too much tagged data", + { + "Continue", + New MsgBoxButton("Continue unnotified") With { + .ToolTip = "Continue downloading and cancel further notifications in the current downloading session."}, + New MsgBoxButton("Limit") With { + .ToolTip = "Enter the limit of posts you want to download."}, + New MsgBoxButton("Disable and cancel") With { + .ToolTip = "Disable downloading tagged data and cancel downloading tagged data."}, + "Cancel" + }, MsgBoxStyle.Exclamation) With {.DefaultButton = 0, .CancelButton = 4, .ButtonsPerRow = 2} + Do + Select Case MsgBoxE(msg).Index + Case 0 : Return DialogResult.OK + Case 1 : TaggedCheckSession = False : Return DialogResult.OK + Case 2 + Select Case SetTagsLimit(TaggedCount, agi) + Case DialogResult.OK : Return DialogResult.OK + Case DialogResult.Cancel : Return DialogResult.Cancel + End Select + Case 3 : GetTaggedData = False : Return DialogResult.Cancel + Case 4 : Return DialogResult.Cancel + End Select + Loop + End Function +#End Region Private Overloads Sub DownloadData(ByVal Cursor As String, ByVal Section As Sections, ByVal Token As CancellationToken) Dim URL$ = String.Empty Dim StoriesList As List(Of String) = Nothing @@ -258,23 +329,15 @@ Namespace API.Instagram If Not PostID.IsEmptyString And _TempPostsList.Contains(PostID) Then Throw New ExitException(_DownloadComplete) _TempPostsList.Add(PostID) ObtainMedia2(nn, PostID, SpecFolder) + DownloadedTags += 1 + If DownloadTagsLimit.HasValue AndAlso DownloadedTags >= DownloadTagsLimit.Value Then _ + Throw New ExitException(_DownloadComplete) Next - If Not TaggedChecked Then + If TaggedLimitsNotifications Then TaggedCount = j.Value("total_count").FromXML(Of Integer)(0) TaggedChecked = True - If TaggedCount > 200 Then - Dim a% = MsgBoxE({$"The number of tagged posts by user [{ToString()}] is { _ - TaggedCount.NumToString(New ANumbers With {.FormatOptions = ANumbers.Options.GroupIntegral})}" & vbCr & - "The tagged data download operation can take a long time.", "Too much tagged data"}, vbExclamation,,, - {"Continue", - New MsgBoxButton("Disable and cancel") With { - .ToolTip = "Disable downloading tagged data and cancel downloading tagged data."}, - "Cancel"}) - If a > 0 Then - If a = 1 Then GetTaggedData = False - Throw New ExitException(_DownloadComplete) - End If - End If + If TaggedLimitsNotifications(TaggedCount) AndAlso + TaggedContinue(TaggedCount) = DialogResult.Cancel Then Throw New ExitException(_DownloadComplete) End If End Select Else diff --git a/SCrawler/API/Reddit/M3U8.vb b/SCrawler/API/Reddit/M3U8.vb index f9109c6..265b86f 100644 --- a/SCrawler/API/Reddit/M3U8.vb +++ b/SCrawler/API/Reddit/M3U8.vb @@ -14,23 +14,32 @@ Namespace API.Reddit Namespace M3U8_Declarations Friend Module M3U8_Declarations Friend ReadOnly BaseUrlPattern As RParams = RParams.DM("([htps:/]{7,8}.+?/.+?)(?=/)", 0, EDP.ReturnValue) + '''

Video Friend ReadOnly PlayListRegEx_1 As RParams = RParams.DM("(#EXT-X-STREAM-INF)(.+)(RESOLUTION=)(\d+)(.+?[\r\n]{1,2})(.+?)([\r\n]{1,2})", 0, RegexReturn.List, EDP.SendInLog, EDP.ReturnValue) + ''' Audio, Video Friend ReadOnly PlayListRegEx_2 As RParams = RParams.DM("(?<=#EXT-X-BYTERANGE.+?[\r\n]{1,2})(.+)(?=[\r\n]{0,2})", 0, RegexReturn.List, EDP.SendInLog, EDP.ReturnValue) + Friend ReadOnly PlayListAudioRegEx As RParams = RParams.DM("(HLS_AUDIO_(\d+)[^""]+)", 0, RegexReturn.List, EDP.SendInLog, EDP.ReturnValue) Friend ReadOnly DPED As New ErrorsDescriber(EDP.SendInLog + EDP.ReturnValue) End Module End Namespace - Friend NotInheritable Class M3U8 - Private Sub New() - End Sub + Friend NotInheritable Class M3U8 : Implements IDisposable +#Region "Declarations" + Private Enum Types : Video : Audio : End Enum Private Structure Resolution : Implements IRegExCreator, IComparable(Of Resolution) Friend File As String Friend Resolution As Integer + Friend HasError As Boolean Friend Function CreateFromArray(ByVal ParamsArray() As String) As Object Implements IRegExCreator.CreateFromArray If ParamsArray.ArrayExists Then File = ParamsArray(0) - If ParamsArray.Length > 1 Then Resolution = AConvert(Of Integer)(ParamsArray(1), 0) + Try + If ParamsArray.Length > 1 Then Resolution = AConvert(Of Integer)(ParamsArray(1), EDP.ThrowException) + Catch ex As Exception + HasError = True + Resolution = 0 + End Try End If Return Me End Function @@ -38,20 +47,59 @@ Namespace API.Reddit Return Resolution.CompareTo(Other.Resolution) * -1 End Function End Structure - Private Shared Function GetPlaylistUrls(ByVal PlayListURL As String, ByVal BaseUrl As String) As List(Of String) + Private ReadOnly PlayListURL As String + Private ReadOnly BaseURL As String + Private ReadOnly Video As List(Of String) + Private ReadOnly Audio As List(Of String) + Private OutFile As SFile + Private VideoFile As SFile + Private AudioFile As SFile + Private CachePath As SFile +#End Region + Private Sub New(ByVal URL As String, ByVal OutFile As SFile) + PlayListURL = URL + BaseURL = RegexReplace(URL, BaseUrlPattern) + Video = New List(Of String) + Audio = New List(Of String) + Me.OutFile = OutFile + Me.OutFile.Name = "PlayListFile" + Me.OutFile.Extension = "mp4" + CachePath = $"{OutFile.PathWithSeparator}_Cache\{SFile.GetDirectories($"{OutFile.PathWithSeparator}_Cache\",,, EDP.ReturnValue).ListIfNothing.Count + 1}\" + End Sub +#Region "Internal functions" +#Region "GetPlaylistUrls" + Private Overloads Sub GetPlaylistUrls() + Video.ListAddList(GetPlaylistUrls(PlayListURL, Types.Video)) + Audio.ListAddList(GetPlaylistUrls(PlayListURL, Types.Audio)) + End Sub + Private Overloads Function GetPlaylistUrls(ByVal PlayListURL As String, ByVal Type As Types) As List(Of String) Try - If Not BaseUrl.IsEmptyString Then + If Not BaseURL.IsEmptyString Then Using w As New WebClient Dim r$ = w.DownloadString(PlayListURL) If Not r.IsEmptyString Then - Dim l As List(Of Resolution) = FNF.RegexFields(Of Resolution)(r, {PlayListRegEx_1}, {6, 4}) + Dim l As New List(Of Resolution) + If Type = Types.Video Then + l = FNF.RegexFields(Of Resolution)(r, {PlayListRegEx_1}, {6, 4}) + Else + Try + l = FNF.RegexFields(Of Resolution)(r, {PlayListAudioRegEx}, {1, 2}) + Catch anull As FNF.RegexFieldsTextBecameNullException + l.Clear() + End Try + End If If l.ListExists Then + Dim plError As Predicate(Of Resolution) = Function(lr) lr.HasError + If l.Exists(plError) Then + l.RemoveAll(plError) + If l.Count = 0 Then Return New List(Of String) + End If l.Sort() - Dim pls$ = $"{BaseUrl}/{l.First.File}" + Dim pls$ = $"{BaseURL}/{l.First.File}" r = w.DownloadString(pls) If Not r.IsEmptyString Then Dim lp As New ListAddParams(LAP.NotContainsOnly) With { - .Converter = Function(input) $"{BaseUrl}/{input}", + .Converter = Function(input) $"{BaseURL}/{input}", .Error = New ErrorsDescriber(False, False, True, New List(Of String))} Return ListAddList(Of String, List(Of String))(Nothing, DirectCast(RegexReplace(r, PlayListRegEx_2), List(Of String)), lp).ListIfNothing End If @@ -61,47 +109,94 @@ Namespace API.Reddit End If Return New List(Of String) Catch ex As Exception - Return ErrorsDescriber.Execute(DPED, ex, "[M3U8.GetPlaylistUrls]", New List(Of String)) + Return ErrorsDescriber.Execute(DPED, ex, $"[M3U8.GetPlaylistUrls({Type}): {PlayListURL}]", New List(Of String)) End Try End Function - Private Shared Function Save(ByVal URLs As List(Of String), ByVal f As SFile) As SFile - Dim CachePath As SFile = Nothing +#End Region +#Region "ConcatData" + Private Overloads Sub ConcatData() + ConcatData(Video, Types.Video, VideoFile) + ConcatData(Audio, Types.Audio, AudioFile) + MergeFiles() + End Sub + Private Overloads Sub ConcatData(ByVal Urls As List(Of String), ByVal Type As Types, ByRef TFile As SFile) Try - If URLs.ListExists Then - Dim ConcatFile As SFile = f - ConcatFile.Name = "PlayListFile" - ConcatFile.Extension = "mp4" - CachePath = $"{f.PathWithSeparator}_Cache\{SFile.GetDirectories($"{f.PathWithSeparator}_Cache\",,, EDP.ReturnValue).ListIfNothing.Count + 1}\" + If Urls.ListExists Then + Dim ConcatFile As SFile = OutFile + If Type = Types.Audio Then + ConcatFile.Name &= "_AUDIO" + ConcatFile.Extension = "aac" + Else + If Audio.Count > 0 Then ConcatFile.Name &= "_VIDEO" + ConcatFile.Extension = "mp4" + End If If CachePath.Exists(SFO.Path) Then Dim p As New SFileNumbers(ConcatFile.Name,,, New ANumbers With {.Format = ANumbers.Formats.General}) - ConcatFile = SFile.Indexed_IndexFile(ConcatFile,, p, EDP.ReturnValue) + ConcatFile = SFile.Indexed_IndexFile(ConcatFile,, p, EDP.ThrowException) 'EDP.ReturnValue Dim i% Dim eFiles As New List(Of SFile) Dim dFile As SFile = CachePath - dFile.Extension = New SFile(URLs(0)).Extension + dFile.Extension = New SFile(Urls(0)).Extension If dFile.Extension.IsEmptyString Then dFile.Extension = "ts" Using w As New WebClient - For i = 0 To URLs.Count - 1 + For i = 0 To Urls.Count - 1 dFile.Name = $"ConPart_{i}" - w.DownloadFile(URLs(i), dFile) + w.DownloadFile(Urls(i), dFile) eFiles.Add(dFile) Next End Using - f = FFMPEG.ConcatenateFiles(eFiles, Settings.FfmpegFile, ConcatFile, p, DPED) + TFile = FFMPEG.ConcatenateFiles(eFiles, Settings.FfmpegFile, ConcatFile, p, DPED) eFiles.Clear() - Return f End If End If - Return Nothing Catch ex As Exception - Return ErrorsDescriber.Execute(DPED, ex, "[M3U8.Save]", New SFile) - Finally - CachePath.Delete(SFO.Path, SFODelete.None, DPED) + ErrorsDescriber.Execute(DPED, ex, $"[M3U8.Save({Type})]") End Try + End Sub +#End Region + Private Sub MergeFiles() + Try + If Not VideoFile.IsEmptyString And Not AudioFile.IsEmptyString Then + Dim p As New SFileNumbers(OutFile.Name,, RParams.DMS("PlayListFile_(\d*)", 1), New ANumbers With {.Format = ANumbers.Formats.General}) + OutFile = FFMPEG.MergeFiles({VideoFile, AudioFile}, Settings.FfmpegFile, OutFile, p, DPED) + Else + OutFile = VideoFile + End If + Catch ex As Exception + ErrorsDescriber.Execute(DPED, ex, $"[M3U8.MergeFiles]") + End Try + End Sub + Friend Function Download() As SFile + GetPlaylistUrls() + ConcatData() + Return OutFile End Function +#End Region +#Region "Statics" Friend Shared Function Download(ByVal URL As String, ByVal f As SFile) As SFile - Dim BaseUrl$ = RegexReplace(URL, BaseUrlPattern) - Return Save(GetPlaylistUrls(URL, BaseUrl), f) + Using m As New M3U8(URL, f) : Return m.Download() : End Using End Function +#End Region +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Private Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + Video.Clear() + Audio.Clear() + CachePath.Delete(SFO.Path, SFODelete.None, DPED) + End If + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region End Class End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/SiteSettings.vb b/SCrawler/API/Reddit/SiteSettings.vb index d6760d2..dde1512 100644 --- a/SCrawler/API/Reddit/SiteSettings.vb +++ b/SCrawler/API/Reddit/SiteSettings.vb @@ -28,6 +28,8 @@ Namespace API.Reddit End Property Friend ReadOnly Property SavedPostsUserName As PropertyValue + + Friend ReadOnly Property UseM3U8 As PropertyValue Friend Overrides ReadOnly Property Responser As WEB.Response Friend Sub New() MyBase.New(RedditSite) @@ -43,6 +45,7 @@ Namespace API.Reddit End If End With SavedPostsUserName = New PropertyValue(String.Empty, GetType(String)) + UseM3U8 = New PropertyValue(True) UrlPatternUser = "https://www.reddit.com/user/{0}/" UrlPatternChannel = "https://www.reddit.com/r/{0}/" ImageVideoContains = "redgifs" @@ -75,17 +78,21 @@ Namespace API.Reddit Next Return Nothing End Function - Friend Overrides Function Available(ByVal What As Download) As Boolean + Friend Overrides Function Available(ByVal What As Download, ByVal Silent As Boolean) As Boolean Try Dim dl As List(Of DownDetector.Data) = DownDetector.GetData("reddit") If dl.ListExists Then dl = dl.Take(4).ToList Dim avg% = dl.Average(Function(d) d.Value) If avg > 100 Then - Return MsgBoxE({"Over the past hour, Reddit has received an average of " & - avg.NumToString(New ANumbers With {.FormatOptions = ANumbers.Options.GroupIntegral}) & " outage reports:" & vbCr & - dl.ListToString(vbCr) & vbCr & vbCr & - "Do you want to continue parsing Reddit data?", "There are outage reports on Reddit"}, vbYesNo) = vbYes + If Silent Then + Return False + Else + Return MsgBoxE({"Over the past hour, Reddit has received an average of " & + avg.NumToString(New ANumbers With {.FormatOptions = ANumbers.Options.GroupIntegral}) & " outage reports:" & vbCr & + dl.ListToString(vbCr) & vbCr & vbCr & + "Do you want to continue parsing Reddit data?", "There are outage reports on Reddit"}, vbYesNo) = vbYes + End If End If End If Return True diff --git a/SCrawler/API/Reddit/UserData.vb b/SCrawler/API/Reddit/UserData.vb index 4c0cddc..c58b1cc 100644 --- a/SCrawler/API/Reddit/UserData.vb +++ b/SCrawler/API/Reddit/UserData.vb @@ -31,6 +31,11 @@ Namespace API.Reddit Return If(IsChannel, DateProviderChannel, DateProvider) End Get End Property + Private ReadOnly Property UseM3U8 As Boolean + Get + Return Settings.UseM3U8 And CBool(DirectCast(HOST.Source, SiteSettings).UseM3U8.Value) + End Get + End Property #Region "Channels Support" #Region "IChannelLimits Support" Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount @@ -242,9 +247,12 @@ Namespace API.Reddit added = False End If Case "video" - If Settings.UseM3U8 AndAlso s("hlsUrl").XmlIfNothingValue("/").ToLower.Contains("m3u8") Then + If UseM3U8 AndAlso s("hlsUrl").XmlIfNothingValue("/").ToLower.Contains("m3u8") Then _TempMediaList.ListAddValue(MediaFromData(UTypes.m3u8, s.Value("hlsUrl"), _PostID(), PostDate,, IsChannel), LNC) + ElseIf Not UseM3U8 AndAlso s("fallback_url").XmlIfNothingValue("/").ToLower.Contains("mp4") Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.Video, s.Value("fallback_url"), + _PostID(), PostDate,, IsChannel), LNC) Else added = False End If @@ -367,8 +375,12 @@ Namespace API.Reddit _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) _TotalPostsDownloaded += 1 End If + ElseIf UseM3U8 AndAlso Not s.Value({"media", "reddit_video"}, "hls_url").IsEmptyString Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.m3u8, s.Value({"media", "reddit_video"}, "hls_url"), + PostID, PostDate, _UserID, IsChannel), LNC) Else - _TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre + UTypes.m3u8, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) + '_TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre + UTypes.m3u8, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) + _TempMediaList.ListAddValue(MediaFromData(UTypes.Video, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) _TotalPostsDownloaded += 1 End If ElseIf CreateImgurMedia(tmpUrl, PostID, PostDate, _UserID, IsChannel) Then @@ -718,7 +730,7 @@ Namespace API.Reddit ElseIf Responser.StatusCode = HttpStatusCode.BadGateway Or Responser.StatusCode = HttpStatusCode.ServiceUnavailable Or Responser.StatusCode = HttpStatusCode.GatewayTimeout Then - MyMainLOG = "Reddit is currently unavailable" + MyMainLOG = $"Reddit is currently unavailable ({ToString()})" Else If Not FromPE Then LogError(ex, Message) : HasError = True Return 0 diff --git a/SCrawler/API/Twitter/UserData.vb b/SCrawler/API/Twitter/UserData.vb index 7fc9a4a..9cbc39d 100644 --- a/SCrawler/API/Twitter/UserData.vb +++ b/SCrawler/API/Twitter/UserData.vb @@ -266,6 +266,8 @@ Namespace API.Twitter UserSuspended = True ElseIf Responser.StatusCode = HttpStatusCode.BadRequest Then MyMainLOG = "Twitter has invalid credentials" + ElseIf Responser.StatusCode = HttpStatusCode.ServiceUnavailable Then + MyMainLOG = $"Twitter is currently unavailable ({ToString()})" Else If Not FromPE Then LogError(ex, Message) : HasError = True Return 0 diff --git a/SCrawler/Channels/ChannelViewForm.vb b/SCrawler/Channels/ChannelViewForm.vb index f031241..0fa596b 100644 --- a/SCrawler/Channels/ChannelViewForm.vb +++ b/SCrawler/Channels/ChannelViewForm.vb @@ -20,7 +20,7 @@ Imports CmbDefaultButtons = PersonalUtilities.Forms.Controls.Base.ActionButton.D Imports RButton = PersonalUtilities.Tools.RangeSwitcherButton.Types Friend Class ChannelViewForm : Implements IChannelLimits Friend Event OnUsersAdded(ByVal StartIndex As Integer) - Friend Event OnDownloadDone(ByVal Message As String) + Friend Event OnDownloadDone As NotificationEventHandler #Region "Appended user structure" Private Structure PendingUser Friend ID As String @@ -326,7 +326,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits Private Async Sub BTT_DOWNLOAD_Click(sender As Object, e As EventArgs) Handles BTT_DOWNLOAD.Click Try AppendPendingUsers() - If Not TokenSource Is Nothing OrElse Not HOST.Source.Available(Plugin.ISiteSettings.Download.Channel) Then Exit Sub + If Not TokenSource Is Nothing OrElse Not HOST.Source.Available(Plugin.ISiteSettings.Download.Channel, False) Then Exit Sub Dim InvokeToken As Action = Sub() If TokenSource Is Nothing Then CProgress.TotalCount = 0 diff --git a/SCrawler/Download/ActiveDownloadingProgress.vb b/SCrawler/Download/ActiveDownloadingProgress.vb index 67e4890..8bad9bf 100644 --- a/SCrawler/Download/ActiveDownloadingProgress.vb +++ b/SCrawler/Download/ActiveDownloadingProgress.vb @@ -39,37 +39,41 @@ Namespace DownloadObjects End Sub Private Sub Downloader_OnReconfigured() Const RowHeight% = 30 - With TP_MAIN - If .Controls.Count > 0 Then - For Each c As Control In .Controls - If Not c Is Nothing Then c.Dispose() - Next - .Controls.Clear() - End If - .RowStyles.Clear() - .RowCount = 0 - End With - JobsList.ListClearDispose - With Downloader - If .Pool.Count > 0 Then - For Each j As TDownloader.Job In .Pool - With TP_MAIN - .RowStyles.Add(New RowStyle(SizeType.Absolute, RowHeight)) - .RowCount += 1 - JobsList.Add(New DownloadProgress(j)) - AddHandler JobsList.Last.OnTotalCountChange, AddressOf Jobs_OnTotalCountChange - .Controls.Add(JobsList.Last.Get, 0, .RowStyles.Count - 1) - End With - Next - TP_MAIN.RowStyles.Add(New RowStyle(SizeType.Percent, 100)) - TP_MAIN.RowCount += 1 - End If - Dim s As Size = Size - s.Height = TP_MAIN.RowStyles.Count * RowHeight + PaddingE.GetOf({TP_MAIN}).Vertical(TP_MAIN.RowStyles.Count) - TP_MAIN.RowStyles.Count * 2 - MinimumSize = New Size(MinWidth, s.Height) - Size = s - End With - TP_MAIN.Refresh() + Dim a As Action = Sub() + With TP_MAIN + If .Controls.Count > 0 Then + For Each c As Control In .Controls + If Not c Is Nothing Then c.Dispose() + + Next + .Controls.Clear() + End If + .RowStyles.Clear() + .RowCount = 0 + End With + JobsList.ListClearDispose + With Downloader + If .Pool.Count > 0 Then + For Each j As TDownloader.Job In .Pool + With TP_MAIN + .RowStyles.Add(New RowStyle(SizeType.Absolute, RowHeight)) + .RowCount += 1 + JobsList.Add(New DownloadProgress(j)) + AddHandler JobsList.Last.OnTotalCountChange, AddressOf Jobs_OnTotalCountChange + .Controls.Add(JobsList.Last.Get, 0, .RowStyles.Count - 1) + End With + Next + TP_MAIN.RowStyles.Add(New RowStyle(SizeType.Percent, 100)) + TP_MAIN.RowCount += 1 + End If + Dim s As Size = Size + s.Height = TP_MAIN.RowStyles.Count * RowHeight + PaddingE.GetOf({TP_MAIN}).Vertical(TP_MAIN.RowStyles.Count) - TP_MAIN.RowStyles.Count * 2 + MinimumSize = New Size(MinWidth, s.Height) + Size = s + End With + TP_MAIN.Refresh() + End Sub + If TP_MAIN.InvokeRequired Then TP_MAIN.Invoke(a) Else a.Invoke End Sub Private Sub Jobs_OnTotalCountChange() If JobsList.Count > 0 And Not DisableProgressChange Then diff --git a/SCrawler/Download/AutoDownloader.vb b/SCrawler/Download/AutoDownloader.vb new file mode 100644 index 0000000..292db78 --- /dev/null +++ b/SCrawler/Download/AutoDownloader.vb @@ -0,0 +1,325 @@ +' Copyright (C) 2022 Andy +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY +Imports System.Threading +Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Tools.Notifications +Imports SCrawler.DownloadObjects.Groups +Imports SCrawler.API +Imports SCrawler.API.Base +Namespace DownloadObjects + Friend Class AutoDownloader : Inherits GroupParameters + Friend Event UserFind(ByVal Key As String, ByVal Activate As Boolean) + Friend Enum Modes As Integer + None = 0 + [Default] = 1 + All = 2 + Specified = 3 + Groups = 4 + End Enum + Friend Const DefaultTimer As Integer = 60 +#Region "Notifications" + Private Const KeyOpenFolder As String = "_____OPEN_FOLDER_SCRAWLER_AUTOMATION" + Private Const KeyOpenSite As String = "_____OPEN_SITE_SCRAWLER_AUTOMATION" + Private Const KeyBttDismiss As String = "_____DISMISS_SCRAWLER_AUTOMATION" + Private Const KeyBttPhoto As String = "_____PHOTO_SCRAWLER_AUTOMATION" + Private ReadOnly UserKeys As List(Of NotifiedUser) + Private Class NotifiedUser : Implements IDisposable + Private ReadOnly Property User As IUserData + Private ReadOnly Property Key As String + Private ReadOnly Property KeyFolder As String + Private ReadOnly Property KeySite As String + Private ReadOnly Property KeyDismiss As String + Private ReadOnly Property Images As Dictionary(Of String, SFile) + Private Sub New() + Images = New Dictionary(Of String, SFile) + End Sub + Friend Sub New(ByVal _Key As String) + Me.New + Key = _Key + KeyFolder = $"{Key}{KeyOpenFolder}" + KeySite = $"{Key}{KeyOpenSite}" + KeyDismiss = $"{Key}{KeyBttDismiss}" + End Sub + Friend Sub New(ByVal _Key As String, ByRef _User As IUserData) + Me.New(_Key) + User = _User + End Sub + Public Shared Widening Operator CType(ByVal Key As String) As NotifiedUser + Return New NotifiedUser(Key) + End Operator + Friend Sub ShowNotification() + Try + If Not User Is Nothing Then + Dim Text$ = $"{User.Site} - {User.Name}{vbNewLine}" & + $"Downloaded: {User.DownloadedPictures(False)} images, {User.DownloadedVideos(False)} videos" + Dim Title$ + If Not User.CollectionName.IsEmptyString Then + Title = User.CollectionName + Else + Title = User.ToString + End If + Using Notify As New Notification(Text, Title) With {.Key = Key} + Dim uPic As SFile = DirectCast(User, UserDataBase).GetUserPictureAddress + Dim uif As SFile = Nothing + Dim uifKey$ = String.Empty + If uPic.Exists Then Notify.Images = {New ToastImage(uPic)} + If User.DownloadedPictures(False) > 0 Then + uif = DirectCast(User, UserDataBase).GetLastImageAddress + If uif.Exists Then + Notify.Images = {New ToastImage(uif, IImage.Modes.Inline)} + uifKey = $"{Key}_{Images.Keys.Count + 1}_{KeyBttPhoto}" + If Not Images.ContainsKey(uifKey) Then Images.Add(uifKey, uif) + End If + End If + Notify.Buttons = { + New ToastButton(KeyFolder, "Folder"), + New ToastButton(KeySite, "Site") + } + If Not uifKey.IsEmptyString Then Notify.Buttons = {New ToastButton(uifKey, "Photo")} + Notify.Buttons = {New ToastButton(KeyDismiss, "Dismiss")} + Notify.Show() + End Using + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "[AutoDownloader.NotifiedUser.ShowNotification]") + If Not User Is Nothing Then + MainFrameObj.ShowNotification($"Downloaded: {User.DownloadedPictures(False)} images, {User.DownloadedVideos(False)} videos", + User.ToString, IIf(User.HasError, ToolTipIcon.Warning, ToolTipIcon.Info)) + End If + End Try + End Sub + ''' True to activate + Friend Function Open(ByVal _Key As String) As Boolean + If Not User Is Nothing Then + If Key = _Key Then + Return True + ElseIf KeyFolder = _Key Then + User.OpenFolder() + ElseIf KeySite = _Key Then + User.OpenSite() + ElseIf Images.ContainsKey(_Key) Then + Images(_Key).Open(, EDP.None) + End If + End If + Return False + End Function + Public Overrides Function Equals(ByVal Obj As Object) As Boolean + With CType(Obj, NotifiedUser) + Return .Key = Key Or .Key = KeyFolder Or .Key = KeySite Or .Key = KeyDismiss Or Images.ContainsKey(.Key) + End With + End Function +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then Images.Clear() + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class +#End Region +#Region "XML Names" + Private Const Name_Mode As String = "Mode" + Private Const Name_Groups As String = "Groups" + Private Const Name_Labels As String = "Labels" + Private Const Name_Timer As String = "Timer" + Private Const Name_LastDownloadDate As String = "LastDownloadDate" + Private Const Name_ShowNotifications As String = "Notify" +#End Region +#Region "Declarations" + Friend Property Mode As Modes = Modes.None + Friend ReadOnly Property Groups As List(Of String) + Friend Property Timer As Integer = DefaultTimer + Friend Property ShowNotifications As Boolean = True + Friend Property LastDownloadDate As Date = Now.AddYears(-1) + Private ReadOnly DateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Private File As SFile = $"Settings\AutoDownload.xml" + Private AThread As Thread +#End Region +#Region "Initializer" + Friend Sub New() + Groups = New List(Of String) + UserKeys = New List(Of NotifiedUser) + If File.Exists Then + Using x As New XmlFile(File) + Mode = x.Value(Name_Mode).FromXML(Of Integer)(Modes.None) + Groups.ListAddList(x.Value(Name_Groups).StringToList(Of String)("|"), LAP.NotContainsOnly) + Labels.ListAddList(x.Value(Name_Labels).StringToList(Of String)("|"), LAP.NotContainsOnly) + Temporary = x.Value(Name_Temporary).FromXML(Of Integer)(CheckState.Indeterminate) + Favorite = x.Value(Name_Favorite).FromXML(Of Integer)(CheckState.Indeterminate) + ReadyForDownload = x.Value(Name_ReadyForDownload).FromXML(Of Boolean)(True) + ReadyForDownloadIgnore = x.Value(Name_ReadyForDownloadIgnore).FromXML(Of Boolean)(False) + Timer = x.Value(Name_Timer).FromXML(Of Integer)(DefaultTimer) + ShowNotifications = x.Value(Name_ShowNotifications).FromXML(Of Boolean)(True) + LastDownloadDate = AConvert(Of Date)(x.Value(Name_LastDownloadDate), DateProvider, Now.AddYears(-1)) + End Using + End If + End Sub +#End Region +#Region "Groups Support" + Friend Sub GROUPS_Updated(ByVal Sender As DownloadGroup) + If Groups.Count > 0 Then + Dim i% = Groups.IndexOf(Sender.NameBefore) + If i >= 0 Then Groups(i) = Sender.Name : Update() + End If + End Sub + Friend Sub GROUPS_Deleted(ByVal Sender As DownloadGroup) + If Groups.Count > 0 Then + Dim i% = Groups.IndexOf(Sender.Name) + If i >= 0 Then Groups.RemoveAt(i) : Update() + End If + End Sub +#End Region +#Region "Update" + Friend Sub Update() + Try + Using x As New XmlFile With {.Name = "Settings"} + x.Add(Name_Mode, CInt(Mode)) + x.Add(Name_Groups, Groups.ListToString("|")) + x.Add(Name_Labels, Labels.ListToString("|")) + x.Add(Name_Temporary, CInt(Temporary)) + x.Add(Name_Favorite, CInt(Favorite)) + x.Add(Name_ReadyForDownload, ReadyForDownload.BoolToInteger) + x.Add(Name_ReadyForDownloadIgnore, ReadyForDownloadIgnore.BoolToInteger) + x.Add(Name_Timer, Timer) + x.Add(Name_ShowNotifications, ShowNotifications.BoolToInteger) + x.Add(Name_LastDownloadDate, CStr(AConvert(Of String)(LastDownloadDate, DateProvider, String.Empty))) + x.Save(File) + End Using + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "[AutoDownloader.Update]") + End Try + End Sub +#End Region +#Region "Execution" + Friend Sub Start() + If Not If(AThread?.IsAlive, False) And Not Mode = Modes.None Then + AThread = New Thread(New ThreadStart(AddressOf Checker)) + AThread.SetApartmentState(ApartmentState.MTA) + AThread.Start() + End If + End Sub + Private _StopRequested As Boolean = False + Friend Sub [Stop]() + If If(AThread?.IsAlive, False) Then _StopRequested = True + End Sub + Private Sub Checker() + Try + While Not _StopRequested + If LastDownloadDate.AddMinutes(Timer) < Now And Not Downloader.Working Then Download() + Thread.Sleep(500) + End While + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "[AutoDownloader.Checker]") + Finally + _StopRequested = False + End Try + End Sub + Private Sub Download() + Dim Keys As New List(Of String) + Try + Dim users As New List(Of IUserData) + Dim GName$ + Dim i% + Dim l As New ListAddParams(LAP.IgnoreICopier + LAP.NotContainsOnly) + Dim notify As Action = Sub() + With Downloader.Downloaded + If ShowNotifications And .Count > 0 Then .ForEach(Sub(ByVal u As IUserData) + If Keys.Contains(u.Key) Then + ShowNotification(u) + Keys.Remove(u.Key) + End If + End Sub) + End With + End Sub + Select Case Mode + Case Modes.All : users.ListAddList(Settings.Users) + Case Modes.Default + Using g As New GroupParameters : users.ListAddList(DownloadGroup.GetUsers(g, True)) : End Using + Case Modes.Specified : users.ListAddList(DownloadGroup.GetUsers(Me, True)) + Case Modes.Groups + If Groups.Count > 0 And Settings.Groups.Count > 0 Then + For Each GName In Groups + i = Settings.Groups.IndexOf(GName) + If i >= 0 Then users.ListAddList(Settings.Groups(i).GetUsers, l) + Next + End If + End Select + If users.Count > 0 Then + Keys.ListAddList(users.SelectMany(Of String)(Function(ByVal user As IUserData) As IEnumerable(Of String) + If user.IsCollection Then + With DirectCast(user, UserDataBind) + If .Count > 0 Then + Return .Collections.Select(Function(u) u.Key) + Else + Return New String() {} + End If + End With + Else + Return {user.Key} + End If + End Function)) + With Downloader + .AutoDownloaderWorking = True + If .Downloaded.Count > 0 Then .Downloaded.RemoveAll(Function(u) Keys.Contains(u.Key)) : .InvokeDownloadsChangeEvent() + .AddRange(users) + .DisableOpenForms = False + While .Working Or .Count > 0 : notify.Invoke() : Thread.Sleep(200) : End While + .AutoDownloaderWorking = False + notify.Invoke + End With + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "[AutoDownloader.Download]") + Finally + Keys.Clear() + LastDownloadDate = Now + Update() + End Try + End Sub + Private Sub ShowNotification(ByVal u As IUserData) + Dim i% = UserKeys.IndexOf(u.Key) + If i >= 0 Then + UserKeys(i).ShowNotification() + Else + UserKeys.Add(New NotifiedUser(u.Key, TDownloader.GetUserFromMainCollection(u))) + UserKeys.Last.ShowNotification() + End If + End Sub + Friend Function NotificationClicked(ByVal Key As String) As Boolean + Dim i% = UserKeys.IndexOf(Key) + If i >= 0 Then + RaiseEvent UserFind(Key, UserKeys(i).Open(Key)) + Return True + Else + Return False + End If + End Function +#End Region +#Region "IDisposable Support" + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue And disposing Then + [Stop]() + UserKeys.ListClearDispose() + Groups.Clear() + End If + MyBase.Dispose(disposing) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Download/AutoDownloaderEditorForm.Designer.vb b/SCrawler/Download/AutoDownloaderEditorForm.Designer.vb new file mode 100644 index 0000000..24abdef --- /dev/null +++ b/SCrawler/Download/AutoDownloaderEditorForm.Designer.vb @@ -0,0 +1,277 @@ +' Copyright (C) 2022 Andy +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY +Namespace DownloadObjects + + Partial Friend Class AutoDownloaderEditorForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim CONTAINER_MAIN As System.Windows.Forms.ToolStripContainer + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(AutoDownloaderEditorForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim TP_MODE As System.Windows.Forms.TableLayoutPanel + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim TT_MAIN As System.Windows.Forms.ToolTip + Me.DEF_GROUP = New SCrawler.DownloadObjects.Groups.GroupDefaults() + Me.TXT_GROUPS = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.OPT_ALL = New System.Windows.Forms.RadioButton() + Me.OPT_DEFAULT = New System.Windows.Forms.RadioButton() + Me.OPT_SPEC = New System.Windows.Forms.RadioButton() + Me.OPT_DISABLED = New System.Windows.Forms.RadioButton() + Me.OPT_GROUP = New System.Windows.Forms.RadioButton() + Me.CH_NOTIFY = New System.Windows.Forms.CheckBox() + Me.TXT_TIMER = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.LBL_LAST_TIME_UP = New System.Windows.Forms.Label() + CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MODE = New System.Windows.Forms.TableLayoutPanel() + TT_MAIN = New System.Windows.Forms.ToolTip(Me.components) + CONTAINER_MAIN.ContentPanel.SuspendLayout() + CONTAINER_MAIN.SuspendLayout() + Me.DEF_GROUP.SuspendLayout() + CType(Me.TXT_GROUPS, System.ComponentModel.ISupportInitialize).BeginInit() + TP_MODE.SuspendLayout() + CType(Me.TXT_TIMER, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + CONTAINER_MAIN.ContentPanel.Controls.Add(Me.DEF_GROUP) + CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(476, 217) + CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + CONTAINER_MAIN.LeftToolStripPanelVisible = False + CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + CONTAINER_MAIN.Name = "CONTAINER_MAIN" + CONTAINER_MAIN.RightToolStripPanelVisible = False + CONTAINER_MAIN.Size = New System.Drawing.Size(476, 242) + CONTAINER_MAIN.TabIndex = 0 + CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'DEF_GROUP + ' + Me.DEF_GROUP.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + Me.DEF_GROUP.ColumnCount = 1 + Me.DEF_GROUP.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + Me.DEF_GROUP.Controls.Add(Me.TXT_GROUPS, 0, 4) + Me.DEF_GROUP.Controls.Add(TP_MODE, 0, 0) + Me.DEF_GROUP.Controls.Add(Me.CH_NOTIFY, 0, 5) + Me.DEF_GROUP.Controls.Add(Me.TXT_TIMER, 0, 6) + Me.DEF_GROUP.Controls.Add(Me.LBL_LAST_TIME_UP, 0, 7) + Me.DEF_GROUP.Dock = System.Windows.Forms.DockStyle.Fill + Me.DEF_GROUP.Location = New System.Drawing.Point(0, 0) + Me.DEF_GROUP.Name = "DEF_GROUP" + Me.DEF_GROUP.RowCount = 9 + Me.DEF_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + Me.DEF_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + Me.DEF_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + Me.DEF_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + Me.DEF_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + Me.DEF_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + Me.DEF_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + Me.DEF_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + Me.DEF_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + Me.DEF_GROUP.Size = New System.Drawing.Size(476, 217) + Me.DEF_GROUP.TabIndex = 0 + ' + 'TXT_GROUPS + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_EDIT" + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_CLEAR" + Me.TXT_GROUPS.Buttons.Add(ActionButton1) + Me.TXT_GROUPS.Buttons.Add(ActionButton2) + Me.TXT_GROUPS.CaptionText = "Groups" + Me.TXT_GROUPS.CaptionWidth = 50.0R + Me.TXT_GROUPS.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_GROUPS.Location = New System.Drawing.Point(4, 111) + Me.TXT_GROUPS.Name = "TXT_GROUPS" + Me.TXT_GROUPS.Size = New System.Drawing.Size(468, 22) + Me.TXT_GROUPS.TabIndex = 4 + ' + 'TP_MODE + ' + TP_MODE.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_MODE.ColumnCount = 5 + TP_MODE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!)) + TP_MODE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!)) + TP_MODE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!)) + TP_MODE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!)) + TP_MODE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!)) + TP_MODE.Controls.Add(Me.OPT_ALL, 1, 0) + TP_MODE.Controls.Add(Me.OPT_DEFAULT, 2, 0) + TP_MODE.Controls.Add(Me.OPT_SPEC, 3, 0) + TP_MODE.Controls.Add(Me.OPT_DISABLED, 0, 0) + TP_MODE.Controls.Add(Me.OPT_GROUP, 4, 0) + TP_MODE.Dock = System.Windows.Forms.DockStyle.Fill + TP_MODE.Location = New System.Drawing.Point(1, 1) + TP_MODE.Margin = New System.Windows.Forms.Padding(0) + TP_MODE.Name = "TP_MODE" + TP_MODE.RowCount = 1 + TP_MODE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MODE.Size = New System.Drawing.Size(474, 25) + TP_MODE.TabIndex = 8 + ' + 'OPT_ALL + ' + Me.OPT_ALL.AutoSize = True + Me.OPT_ALL.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_ALL.Location = New System.Drawing.Point(98, 4) + Me.OPT_ALL.Name = "OPT_ALL" + Me.OPT_ALL.Size = New System.Drawing.Size(87, 17) + Me.OPT_ALL.TabIndex = 1 + Me.OPT_ALL.TabStop = True + Me.OPT_ALL.Text = "ALL" + TT_MAIN.SetToolTip(Me.OPT_ALL, "Download all users") + Me.OPT_ALL.UseVisualStyleBackColor = True + ' + 'OPT_DEFAULT + ' + Me.OPT_DEFAULT.AutoSize = True + Me.OPT_DEFAULT.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_DEFAULT.Location = New System.Drawing.Point(192, 4) + Me.OPT_DEFAULT.Name = "OPT_DEFAULT" + Me.OPT_DEFAULT.Size = New System.Drawing.Size(87, 17) + Me.OPT_DEFAULT.TabIndex = 2 + Me.OPT_DEFAULT.TabStop = True + Me.OPT_DEFAULT.Text = "Default" + TT_MAIN.SetToolTip(Me.OPT_DEFAULT, "All users marked ""Ready for download""") + Me.OPT_DEFAULT.UseVisualStyleBackColor = True + ' + 'OPT_SPEC + ' + Me.OPT_SPEC.AutoSize = True + Me.OPT_SPEC.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_SPEC.Location = New System.Drawing.Point(286, 4) + Me.OPT_SPEC.Name = "OPT_SPEC" + Me.OPT_SPEC.Size = New System.Drawing.Size(87, 17) + Me.OPT_SPEC.TabIndex = 3 + Me.OPT_SPEC.TabStop = True + Me.OPT_SPEC.Text = "Specified" + TT_MAIN.SetToolTip(Me.OPT_SPEC, "Select parameters") + Me.OPT_SPEC.UseVisualStyleBackColor = True + ' + 'OPT_DISABLED + ' + Me.OPT_DISABLED.AutoSize = True + Me.OPT_DISABLED.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_DISABLED.Location = New System.Drawing.Point(4, 4) + Me.OPT_DISABLED.Name = "OPT_DISABLED" + Me.OPT_DISABLED.Size = New System.Drawing.Size(87, 17) + Me.OPT_DISABLED.TabIndex = 0 + Me.OPT_DISABLED.TabStop = True + Me.OPT_DISABLED.Text = "Disabled" + TT_MAIN.SetToolTip(Me.OPT_DISABLED, "Automation disabled") + Me.OPT_DISABLED.UseVisualStyleBackColor = True + ' + 'OPT_GROUP + ' + Me.OPT_GROUP.AutoSize = True + Me.OPT_GROUP.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_GROUP.Location = New System.Drawing.Point(380, 4) + Me.OPT_GROUP.Name = "OPT_GROUP" + Me.OPT_GROUP.Size = New System.Drawing.Size(90, 17) + Me.OPT_GROUP.TabIndex = 4 + Me.OPT_GROUP.TabStop = True + Me.OPT_GROUP.Text = "Groups" + TT_MAIN.SetToolTip(Me.OPT_GROUP, "Download groups") + Me.OPT_GROUP.UseVisualStyleBackColor = True + ' + 'CH_NOTIFY + ' + Me.CH_NOTIFY.AutoSize = True + Me.CH_NOTIFY.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_NOTIFY.Location = New System.Drawing.Point(4, 140) + Me.CH_NOTIFY.Name = "CH_NOTIFY" + Me.CH_NOTIFY.Size = New System.Drawing.Size(468, 19) + Me.CH_NOTIFY.TabIndex = 12 + Me.CH_NOTIFY.Text = "Show notifications" + Me.CH_NOTIFY.UseVisualStyleBackColor = True + ' + 'TXT_TIMER + ' + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 0 + ActionButton3.Name = "BTT_REFRESH" + Me.TXT_TIMER.Buttons.Add(ActionButton3) + Me.TXT_TIMER.CaptionText = "Timer" + Me.TXT_TIMER.CaptionWidth = 50.0R + Me.TXT_TIMER.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_TIMER.Location = New System.Drawing.Point(4, 166) + Me.TXT_TIMER.Name = "TXT_TIMER" + Me.TXT_TIMER.Size = New System.Drawing.Size(468, 22) + Me.TXT_TIMER.TabIndex = 16 + ' + 'LBL_LAST_TIME_UP + ' + Me.LBL_LAST_TIME_UP.AutoSize = True + Me.LBL_LAST_TIME_UP.Dock = System.Windows.Forms.DockStyle.Fill + Me.LBL_LAST_TIME_UP.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, CType(204, Byte)) + Me.LBL_LAST_TIME_UP.Location = New System.Drawing.Point(4, 192) + Me.LBL_LAST_TIME_UP.Name = "LBL_LAST_TIME_UP" + Me.LBL_LAST_TIME_UP.Size = New System.Drawing.Size(468, 25) + Me.LBL_LAST_TIME_UP.TabIndex = 20 + Me.LBL_LAST_TIME_UP.Text = "Last download date: " + Me.LBL_LAST_TIME_UP.TextAlign = System.Drawing.ContentAlignment.TopCenter + ' + 'AutoDownloaderEditorForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(476, 242) + Me.Controls.Add(CONTAINER_MAIN) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(492, 281) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(492, 281) + Me.Name = "AutoDownloaderEditorForm" + Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.Text = "AutoDownloader settings" + CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + CONTAINER_MAIN.ResumeLayout(False) + CONTAINER_MAIN.PerformLayout() + Me.DEF_GROUP.ResumeLayout(False) + Me.DEF_GROUP.PerformLayout() + CType(Me.TXT_GROUPS, System.ComponentModel.ISupportInitialize).EndInit() + TP_MODE.ResumeLayout(False) + TP_MODE.PerformLayout() + CType(Me.TXT_TIMER, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + + End Sub + Private WithEvents DEF_GROUP As DownloadObjects.Groups.GroupDefaults + Private WithEvents TXT_GROUPS As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents OPT_ALL As RadioButton + Private WithEvents OPT_DEFAULT As RadioButton + Private WithEvents OPT_SPEC As RadioButton + Private WithEvents OPT_DISABLED As RadioButton + Private WithEvents CH_NOTIFY As CheckBox + Friend WithEvents TXT_TIMER As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents OPT_GROUP As RadioButton + Private WithEvents LBL_LAST_TIME_UP As Label + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Download/AutoDownloaderEditorForm.resx b/SCrawler/Download/AutoDownloaderEditorForm.resx new file mode 100644 index 0000000..2a0eae1 --- /dev/null +++ b/SCrawler/Download/AutoDownloaderEditorForm.resx @@ -0,0 +1,718 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + + + 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 + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + False + + + False + + + 17, 17 + + + + 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 + js7n7sjAAAAAAAAAAAAAAAAAAAAAaM6Ozuzuzu5wAAAAAAAAAAAAAAAAAAAAbn7Obn5+jshgAAAAAAAA + AAAAAAAAAAAAbOjn7Ozs7O5wAAAAAAAAAAAAAAAAAAAAfnzn5+bn7n7AAAAAAAAAAAAAAAAAAAAAbOjs + 7OzuzshgAAAAAAAAAAAAAAAAAAAAaOyOfn7I5+5wAAAAAAAAAAAAAAAAAAAAbOfs7Ozm7OfAAAAAAAAA + AAAAAAAAAAAAbnzn5+bs5u5wAAAAAAAAAAAAAAAAAAAAfOfsjOx+zn7AAAAAAAAAAAAAAAAAAAAAbnzn + 5o7OfshgAAAAAAAAAAAAAAAAAAAAx+Z+zs5uzm5gAAAAAAAAAAAAAAAAAAAAbs7H5+fObsjAAAAAAAAA + AAAAAAAAAAAAZ2js585s7O5wAAAAAAAAAAAAAAAAAAAAjOyH5+jn53aAAAAAAAAAAAAAAAAAAAAACGZs + bHxsfGgAAAAAAAAAAAD///////8AAP///////wAA////////AAD///j///8AAP//8H///wAA///gP/// + AAD//+Af//8AAP//wB///wAA//+AD///AAD//wAH//8AAP/+AAP//wAA//4AAf//AAD//AAB//8AAP/4 + AAD//wAA//AAAH//AAD/4AAAP/8AAP/gAAAf/wAA/8AAAB//AAD/gAAAD/8AAP8AAAAH/wAA/gAAAAP/ + AAD+AAAAAf8AAPwAAAAB/wAA+AAAAAD/AADwAAAAAH8AAPAAAAAAPwAA4AAAAAA/AADgAAAAAD8AAP/8 + AAH//wAA//wAAf//AAD//AAB//8AAP/8AAH//wAA//wAAf//AAD//AAB//8AAP/8AAH//wAA//wAAf// + AAD//AAB//8AAP/8AAH//wAA//wAAf//AAD//AAB//8AAP/8AAH//wAA//wAAf//AAD//AAB//8AAP/8 + AAH//wAA//wAAf//AAD//AAB//8AAP/8AAH//wAA//4AA///AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ + AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5+AAAAAAAAAAAAAAAAAA + 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 + JgDTji0A05ImANiRIwDdnScA1JQpANmVKwDXmCoA25stAMGJNQDAhj0A0I84AM2VPwDTmTYA3JwyANKR + OQDSlDgA2Js6AOGeIADknS8A3qAxANyiPwDopCAA7qogAOKiLQDtqykA8asjAPOxJwD6syAA+LMkAPq1 + JwD2tSoA+rYsAPq4LgDiozEA6qUzAOepNQDpqTEA66wyAOmrNwDtqjUA6qw2AO2vNQDjpjoA6aw4AOir + PwDwrDgA67A3AO2xOQDssT8A8rIwAPazMwD2tzEA8bE2APq7NgDytDoA+Lc6APW5PAD5uToA+bw7APi7 + PQD5vD0A/L49APzAPgCxgEMAv4VAALaFSAC5h0sAvJZmALyacgC5mnYAxYlBAMOLRgDHi0QAyY1GAMaO + SgDJj0oAyZBEAMyQSgDPlEkAypFNAM6TTADNlE4A0pVHANebQwDUnUUA0JRNANaaSgDDkVUAzpZWAM2X + WwDOmVsAzZpdANGZVgDUmlcA0ppaANOcWwDQnF4A16BHANqiSADapUkA3adLAN2lTQDbo1QA1KFeANql + WwDgpkMA4KtOAO6sSwDxrUYA8rdAAPGxRQD1uUAA+r1AAPSySADirl0Ax5ljAMOYZgDFmWUAz51gAM+f + ZADBnG4AxJ1uANGeYgDQnmUA0aBjANalYwDVoWQA2KRgAN+sYwDbqWYA3aplAN2sZwDRo2sA1KdrANWl + bADZqmoA3q5qAMWhcgDNpHMAzKV1AMmmeQDUqXAA1Kp5ANuwcADhrWAA569jAOCvaQDismgA5LRoAOGy + bADitGwA+8BDALGchQCxnokAxa2OAMqwkQDPs5MA1LiXAN3AngDjwJYAAAAAAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADc2b4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOy6sLjRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA+7oVbN2+ogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAulgR + DLTFuvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6aCMREQzGvroAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALisLxsUERET4Nm4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA6awxJhsbGxERLuC+0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD6rGArJiYdGxsREV7gvqIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoYz4+NyYm + GxsbERGx3Lr2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKhsREM3PjcpJh8bGxQRw9y6AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtapFSEhGOzc3KSYfGxsbE+DauAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADXpYJIT0hIRkY3NzcmJhsbGS7w2dEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + APqeipBPT01IRkZGPjc3JiYbGxFg8L6iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ5yzZdPT09NSEZG + Ozc3NyYmGxsZbvC49gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGnLzpd5T09PTk1GRkZDNzcmJh0bEcHj + ugAAAAAAAAAAAAAAAAAAAAAAAAAAAACgnsuX9fV5V1dPT05NRkZGNzc3Jh8fGyPu47cAAAAAAAAAAAAA + AAAAAAAAAAAAAKELjs719fV+V09XT05OTkhGRjdDNyYmHxsv8dnRAAAAAAAAAAAAAAAAAAAAAAAA+AmI + l/X1l/WTV1dXV09PTk5IRkY3NzcpJh0bYPG+ogAAAAAAAAAAAAAAAAAAAAAACGrLl8719fWXeVdXT1RX + Tk5NSEZGRjc3KSYdG27tvvcAAAAAAAAAAAAAAAAAAAAIZo7Ll87OzvX1fldXVFRTT1dOTUhGRjs+NyYm + JhvC67YAAAAAAAAAAAAAAAAAAJ0JgZDLy8uczs7Ofld5eVdPVE9PTk1IRkY7NzcpJh8i0Ou4AAAAAAAA + AAAAAAAA1whxjI6Qy5PLl/XOl3l5V3l5eVdPV05NTUZGRjs3KSYfMPHj6QAAAAAAAAAAAAAABGOBjIyU + k8uXnJf1l3l5eXl5V1dXT1dOTU1GRjw7NzYfHzPxvvwAAAAAAAAAAACfWnFwf4CAgoyLy4yXznlPeVR5 + V1dXV05XTneLz8/Pz8/Pz8/J79wAAAAAAAAAAADqAQECAgMDAwQEBAaXznx5VHl5V1dXV1dPV5WkpKam + pqarp6ezs/0AAAAAAAAAAAAAAAAAAAAAAAAAAASXy5NQVXlUeXlXV1dXTpWkAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAASXy5NPVVVUeXlXV1dXV5dnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAASQy8t4UFVVeVR5eVdXV5dnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQjst8TFBV + VVR5eXlXeZeeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMjJCOUFBQT1V5VHl5eZcWAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCjI6MdEhPVU95VXlUeZwKAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAKCgoKOdkh0UE9VVXlUeZwKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAJ/f4KCgkhITExPT1VVeZwJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/f4GMjHNG + SExPVU95VZwJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF1cXF/iHVGRkh0UFBQT5wJAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlZXF/f4FDQ0ZGSExPVZcGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAFlZWVxdX9vLENGRnRQT5cJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAFvY2VlcXFxKT9BRkZMTMsEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFjY2RlZXFx + NSwsRkZGTJMEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgY2NkZWVxYSksPz9GRssEAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgWVlkY2RxcTIoLCxGRowEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAFZWWRZZGRkcTQdLCw/Q4wDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAFYWVljWWRjZGQyHSgogYECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOcBv7+/wcHB + wsjHZXFxdQHnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADnAQEBAQEBAQEBAQEBAecAAAAA + AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///j///8AAP//8H///wAA///gP/// + AAD//+Af//8AAP//wB///wAA//+AD///AAD//wAH//8AAP/+AAP//wAA//4AAf//AAD//AAB//8AAP/4 + AAD//wAA//AAAH//AAD/4AAAP/8AAP/gAAAf/wAA/8AAAB//AAD/gAAAD/8AAP8AAAAH/wAA/gAAAAP/ + AAD+AAAAAf8AAPwAAAAB/wAA+AAAAAD/AADwAAAAAH8AAPAAAAAAPwAA4AAAAAA/AADgAAAAAD8AAP/8 + AAH//wAA//wAAf//AAD//AAB//8AAP/8AAH//wAA//wAAf//AAD//AAB//8AAP/8AAH//wAA//wAAf// + AAD//AAB//8AAP/8AAH//wAA//wAAf//AAD//AAB//8AAP/8AAH//wAA//wAAf//AAD//AAB//8AAP/8 + AAH//wAA//wAAf//AAD//AAB//8AAP/8AAH//wAA//4AA///AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE + AAAAAAAAAAAAAAABAAAAAQAAAAAAAKdIAACpSgAArU0AALBSAACxVQAAtFYAALdYAAC5WwAAuVwAALxe + AAC/YQAAvGgNALllFwC5Zx8AtWUpAMJkAADFaAAAyGsAAMxuAgDOcQYA0nYJANR5DQDFdREAz34aANd8 + EADafxMA0IAGANSDBQDThAYA1YUFANiJBwDThg8A2YoIANqNCQDcjQoA25AKAN2QCgDekQ0A35UNAN2A + FgDXjxAA2Y4UAN6DGQDWjBsA3ZEQAN6UFgDdmBgA4JMKAOCSDQDhlQ4A5ZcPAOSZDgDghhsA44geAOSW + EADjmxEA5ZoQAOScEQDnnxQA6Z0SAOWcGgDpoBIA6aEUAO2iFADtpBYA5qAZAO+oGgDwphcA8acYAPGp + GAD0qxkA86waAPSsGgD1rhwA9rAbAPawHAD4sBoA+LEcAMyAIADXhSMA0IUnAN+NKgDRkScA2pYhAN2b + IwDcmyUA05MoANWWKQDali8A2ZksANucLQDcnS4A3Z0xAN2TOwDblT8A1po7ANKYPADVmj0A154+AOaO + JADjkCoA5ZIuAOqTKgDtkysA7ZQrAOiTLQDulSwA4pIxAOmWMQDrlzUA6J02AOOaOQDgnTwA6pw5APCa + NADynj0A36AvAN6hMADdoDgA2aE/AOSgIQDioSYA7KchAO2oJgDgoCkA6agrAPewIAD5tCIA+bQnAPOx + KAD5tigA+bcvAOOmMgDjpjQA5KU0AOepNQDnrD8A6Ko4AOyvOADprj8A86A/AO+zOgDysjAA8LE3APe4 + NgD7ujEA8rY7APCzPQDytj4A9Lg6APW6PQD7vDoA+b0+AMWARADPkEUA3ZlEANmbTQDPnF8A0phUAOqe + QgDdoEEA2aJGAN2kRADep0kA3aVOANuiUADdplQA4ahGAO2qRwDooEgA4alKAOOtTQDzoUAA869EAPap + TgDsskAA77JGAOewTgDusUoA6rBMAPC1QwD0ukUA9rxGAPm9QQDwskkA8rVNAPe+SAD1uk8A+L5IAPWp + UADyqlQA6rRRAO22UgDuuFQA47BbAPCyUQD0vFAA8r5WAPC2XAD4sV0AyZ5nAMSlfwDfr3MA2K19AOWt + YgDltmcA67NgAOm5YQDsu2oA77ptAPW+awDwvm0A+bhpAOizcQDiu34A7Lt9APS9cAD7wEIA+8FGAPnA + SAD4wk4A+MNZAPnEWgD6w2AA/ctkAMOnhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABta58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbc2/a8oAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAKpvpabIawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADWcqgdHaa/awAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAG2JLR8dIM6tXgAAAAAAAAAAAAAAAAAAAAAAAAAAAABlsT0xIx8dLNJzngAAAAAA + AAAAAAAAAAAAAAAAAAAAUq58PDMxIyMdWdVr4gAAAAAAAAAAAAAAAAAAAAAAAJypj0REMzMxJSMdochr + AAAAAAAAAAAAAAAAAAAAAADLcN9KRURERDMxJSMjw69lAAAAAAAAAAAAAAAAAAAAAFDhuH9KSkQzRDMx + JSMq0o1fAAAAAAAAAAAAAAAAAAAY4Nu4gUdHQ0VEM0QlJSNU2XPJAAAAAAAAAAAAAAAAT8TcuNuSTUpK + R0REMzsxJSNd1WsAAAAAAAAAAAAAAJtw3bi425hNTUpKSkRERDMzMSOryGsAAAAAAAAAAADMUd2Vl7i4 + mIFNTU1KSkRERDMzMSXQr2wAAAAAAAAAABfBsJOXmLi4g01NTU1KSkRERDk5MS3ZdJ0AAAAAAAAMz7S0 + urrFxbiETYFNTU1KSo+xlbq6tMfTa9gAAAAAAJoGBgYGCQkL35FLTU2BTU1KthkZKys1NmSgAAAAAAAA + AAAAAAAAAAnfl0pLTU1NgU29FgAAAAAAAAAAAAAAAAAAAAAAAAAABt2VgkpNgU1NTdwVAAAAAAAAAAAA + AAAAAAAAAAAAAAAGxrGPSkpKTU2B2xQAAAAAAAAAAAAAAAAAAAAAAAAAAAbCi5BDREpLTU3cEwAAAAAA + AAAAAAAAAAAAAAAAAAAABMGIi3xAR0pLTdwTAAAAAAAAAAAAAAAAAAAAAAAAAAADsoWKjzlEQ0pL3BEA + AAAAAAAAAAAAAAAAAAAAAAAAAAOrhYWFOztEREq7EQAAAAAAAAAAAAAAAAAAAAAAAAAAA6tdXIV5OTtE + Q7YLAAAAAAAAAAAAAAAAAAAAAAAAAAABpVxcdn0nMztEtgkAAAAAAAAAAAAAAAAAAAAAAAAAAAGhWFpd + di8nMzu1CQAAAAAAAAAAAAAAAAAAAAAAAAAAAaVTWFxdViUnJ7EGAAAAAAAAAAAAAAAAAAAAAAAAAAAB + YFNYWFhcKSQnsAYAAAAAAAAAAAAAAAAAAAAAAAAAAA/XYWBjoaF3VFZWDQAAAAAAAAAAAAAAAAAAAAAA + AAAAAA8BAQEBAQEEBA4AAAAAAAAAAAAAAAD///////x////4P///8D///+Af///gD///wAf//4AD//8A + A//+AAH//gAA//wAAH/4AAB/8AAAP+AAAB/gAAAPwAAAB8AAAA//gAf//4AH//+AB///gAf//4AH//+A + B///gAf//4AH//+AB///gAf//4AH//+AB///gAf//8AP/ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA + AAAAAAAAAAEAAAABAAAAAAAApWYWAKhpGQCqbBsAqm0dAKxuHgCucCEAsHMjALJ2JgC2eioAuH4uALyC + MgC9gzQAvoU1AN+YEwDklw8A5ZkQAOmdEgDooBIA6aEUAO2hFQDtpRYA8KYXAPGqFwDxpxgA8qoZAPSr + GgD0rRoA86wcAPauHAD3sBoA97AcAPmwGgD4sRwAwIY3AMGJOQDDizwAxIs8AMWNPgDjnSUA5J4nAN6g + MADnoyAA5aAnAOSjKQDgoi8A7awpAPCsIwD6syIA+rcrAOKlMwDqqzIA6Kk3AOSpOgDpqz0A+rozAPq6 + NADytjsA97s+APe8PAD5uzgA36VCAN+sVADgqUQA5axHAOmuQADkrUoA6bNKAO63TgDws0EA9btDAPS6 + RQD6vkEA9LxMAPm+SADhrlUA5LJZAPK7UAD7wEMA+8NOAPbBUAD6xFIA+8VUAPDDaQD0xmwA9shtAPjK + bgD6zW8A8cmCAPPMhAD0zoYA99CHAPDPmQDw0JkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAAAAAAAA + AAAAAAAAAAAAAAAAAAAAACZcJgAAAAAAAAAAAAAAAAAAAAAAAAAAJjYnXSYAAAAAAAAAAAAAAAAAAAAA + AAAiRREPJ10mAAAAAAAAAAAAAAAAAAAAAAtHFhYQECddJgAAAAAAAAAAAAAAAAAACkobGxYRERAnXSYA + AAAAAAAAAAAAAAAJUjAbGxgbFhEQKF0mAAAAAAAAAAAAAAhSTjEgGxsbFhYRECtdJgAAAAAAAAAABjpI + SDggICAbGBgWERAnXSYAAAAAAAAFOVBSUk84IDAgGxtUW1paWlwmAAAAAAAABQUGBgg8IDAgMBtWCwsL + IiIAAAAAAAAAAAAAAAY6HiAgMCBXCgAAAAAAAAAAAAAAAAAAAAVHGx4wICBXCgAAAAAAAAAAAAAAAAAA + AAVJGxseMCBXCQAAAAAAAAAAAAAAAAAAAAVJLxsbHjBXCAAAAAAAAAAAAAAAAAAAAAFELhYcGx5XCAAA + AAAAAAAAAAAAAAAAAAFDMxMVGxtXBgAAAAAAAAAAAAAAAAAAAAFANCsWFhxVBgAAAAAAAAAAAAAAAAAA + AAE/MisOEBZVBQAAAAAAAAAAAAAAAAAAAAE9KS0OEBNUAwAAAAAAAAAAAAAAAAAAAAE+S0xAND9TAwAA + AAAAAAAAAAAAAAAAAAABAQEBAwEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP/v + /wD/x/8A/4P/AP8B/wD+AP8A/AB/APgAPwDwAB8A4AAPAMAABwDgAA8A/gD/AP4A/wD+AP8A/gD/AP4A + /wD+AP8A/gD/AP4A/wD+AP8A/gD/AP8B/wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA + AAAAAQAAAAEAAAAAAAClZhYAsnYmALN4KQC4fi8A1Y0XANWOGADXkBkA2pUbANuVHADclhwA3poeAOCc + HwDgmyAA46EiAOaiIwDmpiMA56cnAOilIwDppiUA66omAO2rJwDuricA46YsAOyrKADurikA7q4sAPCv + KQDvsS4A8LAqAO2vMQDkpjgA5q8+AOqwOADwszIA4qtBAOi0TwDyvEoA7LlSAOSyXADnt18Aw5ljAMui + bQDqumEA5LhoAOa7cADpv3MA78FlAPDFdgDyyXkA88x6APXNegD20IAA6MeQAOnIkQDpyZcAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAzcCAAAAAAAAAAAAAAAAAycFNQIAAAAA + AAAAAAAAAysLCAY1BAAAAAAAAAAAAy8SDg0IBjUEAAAAAAAAAzMaFBIODQgINQQAAAAAAzQlIhQaEg4f + Li01BAAAKQEBAQEbGhQUMAQEBAQqAAAAAAABGxsbFDMEAAAAAAAAAAAAARwbGxszBAAAAAAAAAAAAAEe + FBsbMwQAAAAAAAAAAAABIRQcHDMEAAAAAAAAAAAAASARFBQzBAAAAAAAAAAAAAEjFw4WMwQAAAAAAAAA + AAABLCgkJjMDAAAAAAAAAAAAAAEBAQEBAAAAAAAA/v8AAPx/AAD4PwAA8B8AAOAPAADABwAAgAMAAAAB + AADwHwAA8B8AAPAfAADwHwAA8B8AAPAfAADwHwAA+D8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABgAAAAgAAAAGAAAAAwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAFgAA + ABsAAAAWAAAACwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAA + AAwAAAAfAAAAMwAAADwAAAAyAAAAHQAAAAsAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAACAAAACSccDyHPllLiypFQ4M2UUesdFQtZAAAANQAAABoAAAAJAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEAAAAHAAAAF8aOTb/RlU3z0pVH/82UU/K/iUvcAAAAUAAAADAAAAAWAAAABgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAATs4BGjtOXUfXLfxn/0pE5/9ikYP7Rl1T3pXdBvQAA + AEoAAAAqAAAAEgAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACiaB9ppmsg9dKVL//nqjX/67A3/+6yOP/wtDr/87Y7//W4 + PP/4uz3/+b0+//m9QP/5vUD/+rw7//myHv/5sh3/+bId//myHf/5sh3/+LEd//iwHP/2rhv/9awb//Or + Gv/xqBn/8KYY/+6jFf/roBP/6p4Q/+icDv/llw3/4ZQK/9+QCf/cjQb/2okF/9mRHf/ismj40ZVQ9MGK + SogAAAALAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmaR7PyYgn+uSdL//loDD/56Iy/+qk + M//rpjT/7qk3//CrOP/xrTn/8a05//CxOP/4vD7/+bxA//izJP/4sRz/+bId//myHf/5sh3/+bId//mx + Hf/4sBz/9q4c//WsG//zqxr/8qkY//GrI//xsDr/8bFF//W0Sf/2s0n/9LJI//OwSP/yr0f/8a1G//Cs + R//urEv/5ahV6dGVT+AAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkaR2XpGoe/6Vq + H/+mayD/pmwh/6hsIv+pbSP/qW4k/6twJf+scCf/rXIn/65zKf/6vDz/+LxA//a1Kv/2sBr/+bEd//my + Hf/5sh3/+bId//myHf/5sR3/+LAc//auHP/1rRv/9Ksa//a3Ov/EiED/xYlB/8aKQ//Hi0T/yY1G/8qO + R//Lj0n/zJBK/82RS//Ok0z/0JRN/9GVTpcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1yJ//5uzv/9rs+//a3 + Mf/1rhr/9rAc//iyHf/5sh3/+bId//myHf/5sh3/+bEd//iwHP/2rhz/9a0b//m5Ov/Chj//AAAAKwAA + AA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKtw + Jf/4tzr/9Lg9//W3OP/0rRz/9a4b//awHP/4sh3/+bId//myHf/5sh3/+bId//mxHf/4sBz/9q4c//q8 + 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 + + + \ No newline at end of file diff --git a/SCrawler/Download/AutoDownloaderEditorForm.vb b/SCrawler/Download/AutoDownloaderEditorForm.vb new file mode 100644 index 0000000..7404430 --- /dev/null +++ b/SCrawler/Download/AutoDownloaderEditorForm.vb @@ -0,0 +1,136 @@ +' Copyright (C) 2022 Andy +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Imports DModes = SCrawler.DownloadObjects.AutoDownloader.Modes +Namespace DownloadObjects + Friend Class AutoDownloaderEditorForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps + Private ReadOnly MyGroups As List(Of String) + Friend Property IsControlForm As Boolean = False + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps + MyGroups.ListAddList(Settings.Automation.Groups, LAP.NotContainsOnly) + End Sub + Friend Class AutomationTimerChecker : Implements IFieldsCheckerProvider + Private Property ErrorMessage As String = "The timer value must be greater than 0" Implements IFieldsCheckerProvider.ErrorMessage + Private Property Name As String Implements IFieldsCheckerProvider.Name + Private Property TypeError As Boolean Implements IFieldsCheckerProvider.TypeError + Private Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider, + Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert + If CInt(AConvert(Of Integer)(Value, -10)) > 0 Then + Return Value + Else + Return Nothing + End If + End Function + Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat + Throw New NotImplementedException() + End Function + End Class + Private _Loaded As Boolean = False + Friend Shadows Sub Show() + MyBase.Show() + If Not _Loaded And IsControlForm Then AutoDownloaderEditorForm_Load(Nothing, EventArgs.Empty) + End Sub + Private Sub AutoDownloaderEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load + With MyDefs + If Not IsControlForm Then + .MyViewInitialize(Me, Settings.Design, True) + .AddOkCancelToolbar() + End If + With Settings.Automation + Select Case .Mode + Case DModes.None : OPT_DISABLED.Checked = True + Case DModes.All : OPT_ALL.Checked = True + Case DModes.Default : OPT_DEFAULT.Checked = True + Case DModes.Specified : OPT_SPEC.Checked = True + Case DModes.Groups : OPT_GROUP.Checked = True + End Select + ChangeEnabled() + DEF_GROUP.Set(Settings.Automation) + If MyGroups.Count > 0 Then TXT_GROUPS.Text = MyGroups.ListToString + If Settings.Groups.Count = 0 Then TXT_GROUPS.Clear() : TXT_GROUPS.Enabled = False + CH_NOTIFY.Checked = .ShowNotifications + TXT_TIMER.Text = .Timer + LBL_LAST_TIME_UP.Text &= .LastDownloadDate.ToStringDate(ADateTime.Formats.BaseDateTime) + End With + If Not IsControlForm Then + .MyFieldsChecker = New FieldsChecker + With DirectCast(.MyFieldsChecker, FieldsChecker) + .AddControl(Of Integer)(TXT_TIMER, TXT_TIMER.CaptionText,, New AutomationTimerChecker) + .EndLoaderOperations() + End With + .DelegateClosingChecker() + .AppendDetectors() + .EndLoaderOperations() + End If + End With + _Loaded = True + End Sub + Private Sub AutoDownloaderEditorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + MyGroups.Clear() + End Sub + Friend Sub SaveSetiings() Implements IOkCancelToolbar.ToolbarBttOK + If If(MyDefs.MyFieldsChecker?.AllParamsOK, True) Then + With Settings.Automation + Select Case True + Case OPT_DISABLED.Checked : .Mode = DModes.None + Case OPT_ALL.Checked : .Mode = DModes.All + Case OPT_DEFAULT.Checked : .Mode = DModes.Default + Case OPT_SPEC.Checked : .Mode = DModes.Specified + Case OPT_GROUP.Checked : .Mode = DModes.Groups + End Select + DEF_GROUP.Get(Settings.Automation) + .Groups.Clear() + .Groups.ListAddList(MyGroups) + .Timer = AConvert(Of Integer)(TXT_TIMER.Text, AutoDownloader.DefaultTimer) + .Update() + End With + If Not IsControlForm Then MyDefs.CloseForm() + End If + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.CloseForm(DialogResult.Cancel) + End Sub + Private Sub TXT_GROUPS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_GROUPS.ActionOnButtonClick + Select Case Sender.DefaultButton + Case ActionButton.DefaultButtons.Edit + Using f As New LabelsForm(MyGroups, Settings.Groups.Select(Function(g) g.Name)) With {.Text = "Groups"} + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then MyGroups.ListAddList(f.LabelsList, LAP.ClearBeforeAdd) : TXT_GROUPS.Text = MyGroups.ListToString + End Using + Case ActionButton.DefaultButtons.Clear : MyGroups.Clear() + End Select + End Sub + Private Sub OPT_DISABLED_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_DISABLED.CheckedChanged + ChangeEnabled() + End Sub + Private Sub OPT_ALL_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_ALL.CheckedChanged + ChangeEnabled() + End Sub + Private Sub OPT_DEFAULT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_DEFAULT.CheckedChanged + ChangeEnabled() + End Sub + Private Sub OPT_SPEC_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_SPEC.CheckedChanged + ChangeEnabled() + End Sub + Private Sub OPT_GROUP_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_GROUP.CheckedChanged + ChangeEnabled() + End Sub + Private Sub ChangeEnabled() + DEF_GROUP.Enabled = OPT_SPEC.Checked + TXT_GROUPS.Enabled = OPT_GROUP.Checked + TXT_TIMER.Enabled = Not OPT_DISABLED.Checked + CH_NOTIFY.Enabled = Not OPT_DISABLED.Checked + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Download/DownloadSavedPostsForm.vb b/SCrawler/Download/DownloadSavedPostsForm.vb index 424b82b..b21d7e5 100644 --- a/SCrawler/Download/DownloadSavedPostsForm.vb +++ b/SCrawler/Download/DownloadSavedPostsForm.vb @@ -11,7 +11,7 @@ Imports PersonalUtilities.Forms Imports SCrawler.DownloadObjects Imports SCrawler.Plugin.Hosts Friend Class DownloadSavedPostsForm - Friend Event OnDownloadDone(ByVal Message As String) + Friend Event OnDownloadDone As NotificationEventHandler Private MyView As FormsView Private ReadOnly JobsList As List(Of DownloadProgress) Friend ReadOnly Property Working As Boolean diff --git a/SCrawler/Download/DownloadedInfoForm.vb b/SCrawler/Download/DownloadedInfoForm.vb index f791985..8450451 100644 --- a/SCrawler/Download/DownloadedInfoForm.vb +++ b/SCrawler/Download/DownloadedInfoForm.vb @@ -11,7 +11,7 @@ Imports PersonalUtilities.Forms Imports SCrawler.API.Base Namespace DownloadObjects Friend Class DownloadedInfoForm - Friend Event OnUserLooking(ByVal Key As String) + Friend Event UserFind(ByVal Key As String) Private MyView As FormsView Private ReadOnly LParams As New ListAddParams(LAP.IgnoreICopier) With {.Error = EDP.None} Private Opened As Boolean = False @@ -143,7 +143,7 @@ Namespace DownloadObjects Try If _LatestSelected.ValueBetween(0, LIST_DOWN.Items.Count - 1) AndAlso _LatestSelected.ValueBetween(0, Downloader.Downloaded.Count - 1) Then Dim i% = Settings.Users.IndexOf(_TempUsersList(_LatestSelected)) - If i >= 0 Then RaiseEvent OnUserLooking(Settings.Users(i).Key) + If i >= 0 Then RaiseEvent UserFind(Settings.Users(i).Key) End If Catch ex As Exception End Try diff --git a/SCrawler/Download/Groups/DownloadGroup.vb b/SCrawler/Download/Groups/DownloadGroup.vb index e5194fc..0c0d9d6 100644 --- a/SCrawler/Download/Groups/DownloadGroup.vb +++ b/SCrawler/Download/Groups/DownloadGroup.vb @@ -11,16 +11,12 @@ Imports PersonalUtilities.Functions.XML.Base Imports SCrawler.API Imports SCrawler.API.Base Namespace DownloadObjects.Groups - Friend Class DownloadGroup : Implements IIndexable, IEContainerProvider, IDisposable + Friend Class DownloadGroup : Inherits GroupParameters : Implements IIndexable, IEContainerProvider Friend Delegate Sub GroupEventHandler(ByVal Sender As DownloadGroup) Friend Event Deleted As GroupEventHandler Friend Event Updated As GroupEventHandler #Region "XML Names" Private Const Name_Name As String = "Name" - Private Const Name_Temporary As String = "Temporary" - Private Const Name_Favorite As String = "Favorite" - Private Const Name_ReadyForDownload As String = "RFD" - Private Const Name_ReadyForDownloadIgnore As String = "RFDI" #End Region Private WithEvents BTT_EDIT As ToolStripMenuItem Private WithEvents BTT_DELETE As ToolStripMenuItem @@ -28,10 +24,7 @@ Namespace DownloadObjects.Groups Private WithEvents BTT_DOWNLOAD_FULL As ToolStripMenuItem Private ReadOnly SEP_1 As ToolStripSeparator Private WithEvents BTT_MENU As ToolStripMenuItem - Friend Property Temporary As CheckState = CheckState.Indeterminate - Friend Property Favorite As CheckState = CheckState.Indeterminate - Friend Property ReadyForDownload As Boolean = True - Friend Property ReadyForDownloadIgnore As Boolean = False + Friend Property NameBefore As String = String.Empty Friend Property Name As String Private _Key As String = String.Empty Friend ReadOnly Property Key As String @@ -51,14 +44,7 @@ Namespace DownloadObjects.Groups If b Then RaiseEvent Updated(Me) End Set End Property - Friend ReadOnly Property Labels As List(Of String) - Friend ReadOnly Property Count As Integer - Get - Return Labels.Count - End Get - End Property Friend Sub New() - Labels = New List(Of String) BTT_MENU = New ToolStripMenuItem With { .ToolTipText = "Download users of this group", .AutoToolTip = True, @@ -142,26 +128,42 @@ Namespace DownloadObjects.Groups Private Sub BTT_DOWNLOAD_FULL_Click(sender As Object, e As EventArgs) Handles BTT_DOWNLOAD_FULL.Click DownloadUsers(False) End Sub + Friend Overloads Function GetUsers() As IEnumerable(Of IUserData) + Return GetUsers(Me, True) + End Function + Friend Overloads Shared Function GetUsers(ByVal Instance As IGroup, ByVal UseReadyOption As Boolean) As IEnumerable(Of IUserData) + Try + If Settings.Users.Count > 0 Then + With Instance + Dim CheckParams As Predicate(Of IUserData) = Function(user) _ + (.Temporary = CheckState.Indeterminate Or user.Temporary = CBool(.Temporary)) And + (.Favorite = CheckState.Indeterminate Or (user.Favorite = CBool(.Favorite))) And + (Not UseReadyOption Or .ReadyForDownloadIgnore Or user.ReadyForDownload = .ReadyForDownload) + Dim f As Func(Of IUserData, IEnumerable(Of IUserData)) = Function(ByVal user As IUserData) As IEnumerable(Of IUserData) + If user.IsCollection Then + With DirectCast(user, UserDataBind) + If .Count > 0 Then Return .Collections.SelectMany(f) + End With + Else + If .Labels.Count = 0 OrElse user.Labels.ListContains(.Labels) Then + If CheckParams.Invoke(user) Then Return {user} + End If + End If + Return New IUserData() {} + End Function + Return Settings.Users.SelectMany(f) + End With + Else + Return Nothing + End If + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.SendInLog, ex, "[DownloadGroup.GetUsers]") + End Try + End Function Friend Sub DownloadUsers(ByVal UseReadyOption As Boolean) Try If Settings.Users.Count > 0 Then - Dim CheckParams As Predicate(Of IUserData) = Function(user) _ - (Temporary = CheckState.Indeterminate Or user.Temporary = CBool(Temporary)) And - (Favorite = CheckState.Indeterminate Or (user.Favorite = CBool(Favorite))) And - (Not UseReadyOption Or ReadyForDownloadIgnore Or user.ReadyForDownload = ReadyForDownload) - Dim f As Func(Of IUserData, IEnumerable(Of IUserData)) = Function(ByVal user As IUserData) As IEnumerable(Of IUserData) - If user.IsCollection Then - With DirectCast(user, UserDataBind) - If Count > 0 Then Return .Collections.SelectMany(f) - End With - Else - If Labels.Count = 0 OrElse user.Labels.ListContains(Labels) Then - If CheckParams.Invoke(user) Then Return {user} - End If - End If - Return New IUserData() {} - End Function - Dim u As IEnumerable(Of IUserData) = Settings.Users.SelectMany(f) + Dim u As IEnumerable(Of IUserData) = GetUsers(Me, UseReadyOption) If u.ListExists Then Downloader.AddRange(u) Else @@ -174,7 +176,7 @@ Namespace DownloadObjects.Groups End Sub #End Region #Region "IEContainerProvider Support" - Public Function ToEContainer(Optional ByVal e As ErrorsDescriber = Nothing) As EContainer Implements IEContainerProvider.ToEContainer + Private Function ToEContainer(Optional ByVal e As ErrorsDescriber = Nothing) As EContainer Implements IEContainerProvider.ToEContainer Return New EContainer("Group", Labels.ListToString("|"), {New EAttribute(Name_Name, Name), New EAttribute(Name_Temporary, CInt(Temporary)), New EAttribute(Name_Favorite, CInt(Favorite)), @@ -183,28 +185,16 @@ Namespace DownloadObjects.Groups End Function #End Region #Region "IDisposable Support" - Private disposedValue As Boolean = False - Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) - If Not disposedValue Then - If disposing Then - Labels.Clear() - BTT_DELETE.Dispose() - BTT_EDIT.Dispose() - BTT_MENU.Dispose() - SEP_1.Dispose() - BTT_DOWNLOAD.Dispose() - BTT_DOWNLOAD_FULL.Dispose() - End If - disposedValue = True + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue And disposing Then + BTT_DELETE.Dispose() + BTT_EDIT.Dispose() + BTT_MENU.Dispose() + SEP_1.Dispose() + BTT_DOWNLOAD.Dispose() + BTT_DOWNLOAD_FULL.Dispose() End If - End Sub - Protected Overrides Sub Finalize() - Dispose(False) - MyBase.Finalize() - End Sub - Friend Overloads Sub Dispose() Implements IDisposable.Dispose - Dispose(True) - GC.SuppressFinalize(Me) + MyBase.Dispose(disposing) End Sub #End Region End Class diff --git a/SCrawler/Download/Groups/DownloadGroupCollection.vb b/SCrawler/Download/Groups/DownloadGroupCollection.vb index 02b8c4c..36e9803 100644 --- a/SCrawler/Download/Groups/DownloadGroupCollection.vb +++ b/SCrawler/Download/Groups/DownloadGroupCollection.vb @@ -80,6 +80,13 @@ Namespace DownloadObjects.Groups Friend Function DownloadGroupIfExists(ByVal Index As Integer) As Boolean If Index.ValueBetween(0, Count - 1) Then Item(Index).DownloadUsers(True) : Return True Else Return False End Function + Friend Function IndexOf(ByVal Name As String) As Integer + If Count > 0 Then + Return GroupsList.FindIndex(Function(g) g.Name = Name) + Else + Return -1 + End If + End Function Private Function GetEnumerator() As IEnumerator(Of DownloadGroup) Implements IEnumerable(Of DownloadGroup).GetEnumerator Return New MyEnumerator(Of DownloadGroup)(Me) End Function diff --git a/SCrawler/Download/Groups/GroupDefaults.vb b/SCrawler/Download/Groups/GroupDefaults.vb new file mode 100644 index 0000000..bf61391 --- /dev/null +++ b/SCrawler/Download/Groups/GroupDefaults.vb @@ -0,0 +1,142 @@ +' Copyright (C) 2022 Andy +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports ADB = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons +Namespace DownloadObjects.Groups + Public Class GroupDefaults : Inherits TableLayoutPanel + Private ReadOnly TP_1 As TableLayoutPanel + Private ReadOnly TP_2 As TableLayoutPanel + Private ReadOnly CH_TEMPORARY As CheckBox + Private ReadOnly CH_FAV As CheckBox + Private ReadOnly CH_READY_FOR_DOWN As CheckBox + Private ReadOnly CH_READY_FOR_DOWN_IGNORE As CheckBox + Private WithEvents TXT_LABELS As TextBoxExtended + Private ReadOnly Labels As List(Of String) + Public Sub New() + Labels = New List(Of String) + TXT_LABELS = New TextBoxExtended + With TXT_LABELS + .BeginInit() + .Buttons.AddRange({ADB.Edit, ADB.Clear}) + .CaptionText = "Labels" + .CaptionWidth = 50 + .Dock = DockStyle.Fill + .EndInit() + End With + CH_TEMPORARY = New CheckBox With {.Text = "Temporary", .Name = "CH_TEMPORARY", .ThreeState = True, .CheckState = CheckState.Indeterminate, .Dock = DockStyle.Fill} + CH_FAV = New CheckBox With {.Text = "Favorite", .Name = "CH_FAV", .ThreeState = True, .CheckState = CheckState.Indeterminate, .Dock = DockStyle.Fill} + CH_READY_FOR_DOWN = New CheckBox With {.Text = "Ready for download", .Name = "CH_READY_FOR_DOWN", .Checked = True, .Dock = DockStyle.Fill} + CH_READY_FOR_DOWN_IGNORE = New CheckBox With {.Text = "Ignore ready for download", .Name = "CH_READY_FOR_DOWN_IGNORE", .Checked = False, .Dock = DockStyle.Fill} + TP_1 = New TableLayoutPanel With {.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single, .Margin = New Padding(0), .Dock = DockStyle.Fill} + FillTP(TP_1, CH_TEMPORARY, CH_FAV) + TP_2 = New TableLayoutPanel With {.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single, .Margin = New Padding(0), .Dock = DockStyle.Fill} + FillTP(TP_2, CH_READY_FOR_DOWN, CH_READY_FOR_DOWN_IGNORE) + End Sub + Private Sub FillTP(ByRef TP As TableLayoutPanel, ByVal CNT1 As Control, ByVal CNT2 As Control) + With TP + .ColumnCount = 2 + .ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 50)) + .ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 50)) + .RowCount = 1 + .RowStyles.Add(New RowStyle(SizeType.Percent, 100)) + With .Controls : .Add(CNT1, 0, 0) : .Add(CNT2, 1, 0) : End With + End With + End Sub + Private Sub GroupDefaults_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + Labels.Clear() + CH_TEMPORARY.Dispose() + CH_FAV.Dispose() + CH_READY_FOR_DOWN.Dispose() + CH_READY_FOR_DOWN_IGNORE.Dispose() + TXT_LABELS.Dispose() + With TP_1 + .Controls.Clear() + .RowStyles.Clear() + .ColumnStyles.Clear() + .Dispose() + End With + With TP_2 + .Controls.Clear() + .RowStyles.Clear() + .ColumnStyles.Clear() + .Dispose() + End With + End Sub + Protected Overrides Sub InitLayout() + MyBase.InitLayout() + If ColumnStyles.Count = 2 Or RowStyles.Count = 2 Then + ColumnStyles.Clear() + RowStyles.Clear() + CellBorderStyle = TableLayoutPanelCellBorderStyle.Single + ColumnCount = 1 + ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 100)) + RowCount = 5 + RowStyles.Add(New RowStyle(SizeType.Absolute, 25)) + RowStyles.Add(New RowStyle(SizeType.Absolute, 25)) + RowStyles.Add(New RowStyle(SizeType.Absolute, 25)) + RowStyles.Add(New RowStyle(SizeType.Absolute, 28)) + RowStyles.Add(New RowStyle(SizeType.Percent, 100)) + End If + Controls.Add(TP_1, 0, 1) + Controls.Add(TP_2, 0, 2) + Controls.Add(TXT_LABELS, 0, 3) + End Sub + Private Sub TXT_LABELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_LABELS.ActionOnButtonClick + Select Case Sender.DefaultButton + Case ADB.Edit + Using f As New LabelsForm(Labels) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + Labels.ListAddList(f.LabelsList, LAP.NotContainsOnly, LAP.ClearBeforeAdd) + TXT_LABELS.Clear() + TXT_LABELS.Text = Labels.ListToString + End If + End Using + Case ADB.Clear : Labels.Clear() + End Select + End Sub + Friend Sub [Get](ByRef Instance As IGroup) + If Not Instance Is Nothing Then + With Instance + .Temporary = CH_TEMPORARY.CheckState + .Favorite = CH_FAV.CheckState + .ReadyForDownload = CH_READY_FOR_DOWN.Checked + .ReadyForDownloadIgnore = CH_READY_FOR_DOWN_IGNORE.Checked + .Labels.Clear() + .Labels.ListAddList(Labels) + End With + End If + End Sub + Friend Sub [Set](ByVal Instance As IGroup) + If Not Instance Is Nothing Then + With Instance + CH_TEMPORARY.CheckState = .Temporary + CH_FAV.CheckState = .Favorite + CH_READY_FOR_DOWN.Checked = .ReadyForDownload + CH_READY_FOR_DOWN_IGNORE.Checked = .ReadyForDownloadIgnore + Labels.ListAddList(.Labels) + TXT_LABELS.Text = Labels.ListToString + End With + End If + End Sub + Private _Enabled As Boolean = True + Friend Shadows Property Enabled As Boolean + Get + Return _Enabled + End Get + Set(ByVal e As Boolean) + _Enabled = e + TP_1.Enabled = e + TP_2.Enabled = e + TXT_LABELS.Enabled = e + End Set + End Property + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Download/Groups/GroupEditorForm.Designer.vb b/SCrawler/Download/Groups/GroupEditorForm.Designer.vb index 9100646..a468937 100644 --- a/SCrawler/Download/Groups/GroupEditorForm.Designer.vb +++ b/SCrawler/Download/Groups/GroupEditorForm.Designer.vb @@ -23,30 +23,15 @@ Namespace DownloadObjects.Groups Private Sub InitializeComponent() Dim CONTAINER_MAIN As System.Windows.Forms.ToolStripContainer - Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel - Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(GroupEditorForm)) - Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim TP_TEMP_FAV As System.Windows.Forms.TableLayoutPanel - Dim TP_READY_FOR_DOWN As System.Windows.Forms.TableLayoutPanel + Me.DEFS_GROUP = New SCrawler.DownloadObjects.Groups.GroupDefaults() Me.TXT_NAME = New PersonalUtilities.Forms.Controls.TextBoxExtended() - Me.TXT_LABELS = New PersonalUtilities.Forms.Controls.TextBoxExtended() - Me.CH_TEMPORARY = New System.Windows.Forms.CheckBox() - Me.CH_FAV = New System.Windows.Forms.CheckBox() - Me.CH_READY_FOR_DOWN = New System.Windows.Forms.CheckBox() - Me.CH_READY_FOR_DOWN_IGNORE = New System.Windows.Forms.CheckBox() CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() - TP_MAIN = New System.Windows.Forms.TableLayoutPanel() - TP_TEMP_FAV = New System.Windows.Forms.TableLayoutPanel() - TP_READY_FOR_DOWN = New System.Windows.Forms.TableLayoutPanel() CONTAINER_MAIN.ContentPanel.SuspendLayout() CONTAINER_MAIN.SuspendLayout() - TP_MAIN.SuspendLayout() + Me.DEFS_GROUP.SuspendLayout() CType(Me.TXT_NAME, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).BeginInit() - TP_TEMP_FAV.SuspendLayout() - TP_READY_FOR_DOWN.SuspendLayout() Me.SuspendLayout() ' 'CONTAINER_MAIN @@ -54,46 +39,41 @@ Namespace DownloadObjects.Groups ' 'CONTAINER_MAIN.ContentPanel ' - CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) - CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(476, 111) + CONTAINER_MAIN.ContentPanel.Controls.Add(Me.DEFS_GROUP) + CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(476, 134) CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill CONTAINER_MAIN.LeftToolStripPanelVisible = False CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) CONTAINER_MAIN.Name = "CONTAINER_MAIN" CONTAINER_MAIN.RightToolStripPanelVisible = False - CONTAINER_MAIN.Size = New System.Drawing.Size(476, 136) + CONTAINER_MAIN.Size = New System.Drawing.Size(476, 134) CONTAINER_MAIN.TabIndex = 0 CONTAINER_MAIN.TopToolStripPanelVisible = False ' - 'TP_MAIN + 'DEFS_GROUP ' - TP_MAIN.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] - TP_MAIN.ColumnCount = 1 - TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_MAIN.Controls.Add(TP_READY_FOR_DOWN, 0, 2) - TP_MAIN.Controls.Add(Me.TXT_NAME, 0, 0) - TP_MAIN.Controls.Add(Me.TXT_LABELS, 0, 3) - TP_MAIN.Controls.Add(TP_TEMP_FAV, 0, 1) - TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill - TP_MAIN.Location = New System.Drawing.Point(0, 0) - TP_MAIN.Name = "TP_MAIN" - TP_MAIN.RowCount = 5 - TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) - TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) - TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) - TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) - TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) - TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) - TP_MAIN.Size = New System.Drawing.Size(476, 111) - TP_MAIN.TabIndex = 0 + Me.DEFS_GROUP.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + Me.DEFS_GROUP.ColumnCount = 1 + Me.DEFS_GROUP.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + Me.DEFS_GROUP.Controls.Add(Me.TXT_NAME, 0, 0) + Me.DEFS_GROUP.Dock = System.Windows.Forms.DockStyle.Fill + Me.DEFS_GROUP.Location = New System.Drawing.Point(0, 0) + Me.DEFS_GROUP.Name = "DEFS_GROUP" + Me.DEFS_GROUP.RowCount = 5 + Me.DEFS_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + Me.DEFS_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + Me.DEFS_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + Me.DEFS_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + Me.DEFS_GROUP.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + Me.DEFS_GROUP.Size = New System.Drawing.Size(476, 134) + Me.DEFS_GROUP.TabIndex = 1 ' 'TXT_NAME ' - ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image) - ActionButton7.Index = 0 - ActionButton7.Name = "BTT_CLEAR" - Me.TXT_NAME.Buttons.Add(ActionButton7) + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_CLEAR" + Me.TXT_NAME.Buttons.Add(ActionButton1) Me.TXT_NAME.CaptionText = "Name" Me.TXT_NAME.CaptionToolTipEnabled = True Me.TXT_NAME.CaptionToolTipText = "Group name" @@ -104,127 +84,18 @@ Namespace DownloadObjects.Groups Me.TXT_NAME.Size = New System.Drawing.Size(468, 22) Me.TXT_NAME.TabIndex = 0 ' - 'TXT_LABELS - ' - ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image) - ActionButton8.Index = 0 - ActionButton8.Name = "BTT_EDIT" - ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image) - ActionButton9.Index = 1 - ActionButton9.Name = "BTT_CLEAR" - Me.TXT_LABELS.Buttons.Add(ActionButton8) - Me.TXT_LABELS.Buttons.Add(ActionButton9) - Me.TXT_LABELS.CaptionText = "Labels" - Me.TXT_LABELS.CaptionToolTipEnabled = True - Me.TXT_LABELS.CaptionToolTipText = "Group labels" - Me.TXT_LABELS.CaptionWidth = 50.0R - Me.TXT_LABELS.ClearTextByButtonClear = False - Me.TXT_LABELS.Dock = System.Windows.Forms.DockStyle.Fill - Me.TXT_LABELS.Location = New System.Drawing.Point(4, 85) - Me.TXT_LABELS.Name = "TXT_LABELS" - Me.TXT_LABELS.Size = New System.Drawing.Size(468, 22) - Me.TXT_LABELS.TabIndex = 1 - ' - 'TP_TEMP_FAV - ' - TP_TEMP_FAV.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] - TP_TEMP_FAV.ColumnCount = 2 - TP_TEMP_FAV.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) - TP_TEMP_FAV.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) - TP_TEMP_FAV.Controls.Add(Me.CH_TEMPORARY, 0, 0) - TP_TEMP_FAV.Controls.Add(Me.CH_FAV, 1, 0) - TP_TEMP_FAV.Dock = System.Windows.Forms.DockStyle.Fill - TP_TEMP_FAV.Location = New System.Drawing.Point(1, 30) - TP_TEMP_FAV.Margin = New System.Windows.Forms.Padding(0) - TP_TEMP_FAV.Name = "TP_TEMP_FAV" - TP_TEMP_FAV.RowCount = 1 - TP_TEMP_FAV.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_TEMP_FAV.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) - TP_TEMP_FAV.Size = New System.Drawing.Size(474, 25) - TP_TEMP_FAV.TabIndex = 2 - ' - 'TP_READY_FOR_DOWN - ' - TP_READY_FOR_DOWN.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] - TP_READY_FOR_DOWN.ColumnCount = 2 - TP_READY_FOR_DOWN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) - TP_READY_FOR_DOWN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) - TP_READY_FOR_DOWN.Controls.Add(Me.CH_READY_FOR_DOWN, 0, 0) - TP_READY_FOR_DOWN.Controls.Add(Me.CH_READY_FOR_DOWN_IGNORE, 1, 0) - TP_READY_FOR_DOWN.Dock = System.Windows.Forms.DockStyle.Fill - TP_READY_FOR_DOWN.Location = New System.Drawing.Point(1, 56) - TP_READY_FOR_DOWN.Margin = New System.Windows.Forms.Padding(0) - TP_READY_FOR_DOWN.Name = "TP_READY_FOR_DOWN" - TP_READY_FOR_DOWN.RowCount = 1 - TP_READY_FOR_DOWN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_READY_FOR_DOWN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) - TP_READY_FOR_DOWN.Size = New System.Drawing.Size(474, 25) - TP_READY_FOR_DOWN.TabIndex = 3 - ' - 'CH_TEMPORARY - ' - Me.CH_TEMPORARY.AutoSize = True - Me.CH_TEMPORARY.Checked = True - Me.CH_TEMPORARY.CheckState = System.Windows.Forms.CheckState.Indeterminate - Me.CH_TEMPORARY.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_TEMPORARY.Location = New System.Drawing.Point(4, 4) - Me.CH_TEMPORARY.Name = "CH_TEMPORARY" - Me.CH_TEMPORARY.Size = New System.Drawing.Size(229, 17) - Me.CH_TEMPORARY.TabIndex = 0 - Me.CH_TEMPORARY.Text = "Temporary" - Me.CH_TEMPORARY.ThreeState = True - Me.CH_TEMPORARY.UseVisualStyleBackColor = True - ' - 'CH_FAV - ' - Me.CH_FAV.AutoSize = True - Me.CH_FAV.Checked = True - Me.CH_FAV.CheckState = System.Windows.Forms.CheckState.Indeterminate - Me.CH_FAV.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_FAV.Location = New System.Drawing.Point(240, 4) - Me.CH_FAV.Name = "CH_FAV" - Me.CH_FAV.Size = New System.Drawing.Size(230, 17) - Me.CH_FAV.TabIndex = 1 - Me.CH_FAV.Text = "Favorite" - Me.CH_FAV.ThreeState = True - Me.CH_FAV.UseVisualStyleBackColor = True - ' - 'CH_READY_FOR_DOWN - ' - Me.CH_READY_FOR_DOWN.AutoSize = True - Me.CH_READY_FOR_DOWN.Checked = True - Me.CH_READY_FOR_DOWN.CheckState = System.Windows.Forms.CheckState.Checked - Me.CH_READY_FOR_DOWN.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_READY_FOR_DOWN.Location = New System.Drawing.Point(4, 4) - Me.CH_READY_FOR_DOWN.Name = "CH_READY_FOR_DOWN" - Me.CH_READY_FOR_DOWN.Size = New System.Drawing.Size(229, 17) - Me.CH_READY_FOR_DOWN.TabIndex = 0 - Me.CH_READY_FOR_DOWN.Text = "Ready for download" - Me.CH_READY_FOR_DOWN.UseVisualStyleBackColor = True - ' - 'CH_READY_FOR_DOWN_IGNORE - ' - Me.CH_READY_FOR_DOWN_IGNORE.AutoSize = True - Me.CH_READY_FOR_DOWN_IGNORE.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_READY_FOR_DOWN_IGNORE.Location = New System.Drawing.Point(240, 4) - Me.CH_READY_FOR_DOWN_IGNORE.Name = "CH_READY_FOR_DOWN_IGNORE" - Me.CH_READY_FOR_DOWN_IGNORE.Size = New System.Drawing.Size(230, 17) - Me.CH_READY_FOR_DOWN_IGNORE.TabIndex = 1 - Me.CH_READY_FOR_DOWN_IGNORE.Text = "Ignore ready for download" - Me.CH_READY_FOR_DOWN_IGNORE.UseVisualStyleBackColor = True - ' 'GroupEditorForm ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(476, 136) + Me.ClientSize = New System.Drawing.Size(476, 134) Me.Controls.Add(CONTAINER_MAIN) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle Me.KeyPreview = True Me.MaximizeBox = False - Me.MaximumSize = New System.Drawing.Size(492, 175) + Me.MaximumSize = New System.Drawing.Size(492, 173) Me.MinimizeBox = False - Me.MinimumSize = New System.Drawing.Size(492, 175) + Me.MinimumSize = New System.Drawing.Size(492, 173) Me.Name = "GroupEditorForm" Me.ShowIcon = False Me.ShowInTaskbar = False @@ -233,21 +104,12 @@ Namespace DownloadObjects.Groups CONTAINER_MAIN.ContentPanel.ResumeLayout(False) CONTAINER_MAIN.ResumeLayout(False) CONTAINER_MAIN.PerformLayout() - TP_MAIN.ResumeLayout(False) + Me.DEFS_GROUP.ResumeLayout(False) CType(Me.TXT_NAME, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).EndInit() - TP_TEMP_FAV.ResumeLayout(False) - TP_TEMP_FAV.PerformLayout() - TP_READY_FOR_DOWN.ResumeLayout(False) - TP_READY_FOR_DOWN.PerformLayout() Me.ResumeLayout(False) End Sub Private WithEvents TXT_NAME As PersonalUtilities.Forms.Controls.TextBoxExtended - Private WithEvents TXT_LABELS As PersonalUtilities.Forms.Controls.TextBoxExtended - Private WithEvents CH_READY_FOR_DOWN As CheckBox - Private WithEvents CH_READY_FOR_DOWN_IGNORE As CheckBox - Private WithEvents CH_TEMPORARY As CheckBox - Private WithEvents CH_FAV As CheckBox + Private WithEvents DEFS_GROUP As GroupDefaults End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Download/Groups/GroupEditorForm.resx b/SCrawler/Download/Groups/GroupEditorForm.resx index 8feac98..7e5ab0d 100644 --- a/SCrawler/Download/Groups/GroupEditorForm.resx +++ b/SCrawler/Download/Groups/GroupEditorForm.resx @@ -120,14 +120,8 @@ False - - False - - - False - - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -135,73 +129,4 @@ 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 - AAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go - tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX - AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - - - False - \ No newline at end of file diff --git a/SCrawler/Download/Groups/GroupEditorForm.vb b/SCrawler/Download/Groups/GroupEditorForm.vb index b5b4e3b..f52478f 100644 --- a/SCrawler/Download/Groups/GroupEditorForm.vb +++ b/SCrawler/Download/Groups/GroupEditorForm.vb @@ -7,18 +7,14 @@ ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY Imports PersonalUtilities.Forms -Imports PersonalUtilities.Forms.Controls.Base Imports PersonalUtilities.Forms.Toolbars Namespace DownloadObjects.Groups Friend Class GroupEditorForm : Implements IOkCancelToolbar Private ReadOnly MyDefs As DefaultFormProps Friend Property MyGroup As DownloadGroup - Private ReadOnly MyLabels As List(Of String) Friend Sub New(ByRef g As DownloadGroup) InitializeComponent() MyGroup = g - MyLabels = New List(Of String) - If Not MyGroup Is Nothing Then MyLabels.ListAddList(MyGroup.Labels) MyDefs = New DefaultFormProps End Sub Private Class NameChecker : Implements IFieldsCheckerProvider @@ -54,11 +50,7 @@ Namespace DownloadObjects.Groups If Not MyGroup Is Nothing Then With MyGroup TXT_NAME.Text = .Name - CH_TEMPORARY.CheckState = .Temporary - CH_FAV.CheckState = .Favorite - CH_READY_FOR_DOWN.Checked = .ReadyForDownload - CH_READY_FOR_DOWN_IGNORE.Checked = .ReadyForDownloadIgnore - TXT_LABELS.Text = MyLabels.ListToString + DEFS_GROUP.Set(MyGroup) Text &= $" { .Name}" End With Else @@ -71,19 +63,13 @@ Namespace DownloadObjects.Groups .EndLoaderOperations() End With End Sub - Private Sub GroupEditorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed - MyLabels.Clear() - End Sub Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK If MyDefs.MyFieldsChecker.AllParamsOK Then If MyGroup Is Nothing Then MyGroup = New DownloadGroup With MyGroup + .NameBefore = .Name .Name = TXT_NAME.Text - .Temporary = CH_TEMPORARY.CheckState - .Favorite = CH_FAV.CheckState - .ReadyForDownload = CH_READY_FOR_DOWN.Checked - .ReadyForDownloadIgnore = CH_READY_FOR_DOWN_IGNORE.Checked - .Labels.ListAddList(MyLabels, LAP.ClearBeforeAdd, LAP.NotContainsOnly) + DEFS_GROUP.Get(MyGroup) End With MyDefs.CloseForm() End If @@ -91,21 +77,5 @@ Namespace DownloadObjects.Groups Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel MyDefs.CloseForm(DialogResult.Cancel) End Sub - Private Sub TXT_LABELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_LABELS.ActionOnButtonClick - Select Case Sender.DefaultButton - Case ActionButton.DefaultButtons.Edit - Using f As New LabelsForm(MyLabels) - f.ShowDialog() - If f.DialogResult = DialogResult.OK Then - MyLabels.ListAddList(f.LabelsList, LAP.NotContainsOnly, LAP.ClearBeforeAdd) - TXT_LABELS.Clear() - TXT_LABELS.Text = MyLabels.ListToString - End If - End Using - Case ActionButton.DefaultButtons.Clear - MyLabels.Clear() - TXT_LABELS.Clear() - End Select - End Sub End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Download/Groups/GroupParameters.vb b/SCrawler/Download/Groups/GroupParameters.vb new file mode 100644 index 0000000..71a62eb --- /dev/null +++ b/SCrawler/Download/Groups/GroupParameters.vb @@ -0,0 +1,48 @@ +' Copyright (C) 2022 Andy +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY +Namespace DownloadObjects.Groups + Friend Interface IGroup + ReadOnly Property Labels As List(Of String) + Property Temporary As CheckState + Property Favorite As CheckState + Property ReadyForDownload As Boolean + Property ReadyForDownloadIgnore As Boolean + End Interface + Friend Class GroupParameters : Implements IGroup, IDisposable + Protected Const Name_Temporary As String = "Temporary" + Protected Const Name_Favorite As String = "Favorite" + Protected Const Name_ReadyForDownload As String = "RFD" + Protected Const Name_ReadyForDownloadIgnore As String = "RFDI" + Friend ReadOnly Property Labels As List(Of String) Implements IGroup.Labels + Friend Property Temporary As CheckState = CheckState.Indeterminate Implements IGroup.Temporary + Friend Property Favorite As CheckState = CheckState.Indeterminate Implements IGroup.Favorite + Friend Property ReadyForDownload As Boolean = True Implements IGroup.ReadyForDownload + Friend Property ReadyForDownloadIgnore As Boolean = False Implements IGroup.ReadyForDownloadIgnore + Friend Sub New() + Labels = New List(Of String) + End Sub +#Region "IDisposable Support" + Protected disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then Labels.Clear() + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Download/TDownloader.vb b/SCrawler/Download/TDownloader.vb index 09b94f2..038a54f 100644 --- a/SCrawler/Download/TDownloader.vb +++ b/SCrawler/Download/TDownloader.vb @@ -15,18 +15,44 @@ Imports SCrawler.Plugin.Hosts Imports Download = SCrawler.Plugin.ISiteSettings.Download Namespace DownloadObjects Friend Class TDownloader : Implements IDisposable +#Region "Events" Friend Event OnJobsChange(ByVal JobsCount As Integer) Friend Event OnDownloadCountChange() Friend Event OnDownloading(ByVal Value As Boolean) - Friend Event SendNotification(ByVal Message As String) + Friend Event SendNotification As NotificationEventHandler Friend Event OnReconfigured() +#End Region +#Region "Declarations" Friend ReadOnly Property Downloaded As List(Of IUserData) Private ReadOnly NProv As IFormatProvider +#End Region +#Region "Working, Count" Friend ReadOnly Property Working As Boolean Get Return Pool.Count > 0 AndAlso Pool.Exists(Function(j) j.Working) End Get End Property + Friend ReadOnly Property Count As Integer + Get + If Pool.Count = 0 Then Return 0 Else Return Pool.Sum(Function(j) j.Count) + End Get + End Property +#End Region +#Region "Automation Support" + Friend Property DisableOpenForms As Boolean = False + Private _DisableCompleteNotification As Boolean = False + Private _AutoDownloaderWorking As Boolean = False + Friend WriteOnly Property AutoDownloaderWorking As Boolean + Set(ByVal adw As Boolean) + _AutoDownloaderWorking = adw + DisableOpenForms = adw + _DisableCompleteNotification = adw + End Set + End Property + Friend Sub InvokeDownloadsChangeEvent() + RaiseEvent OnDownloadCountChange() + End Sub +#End Region #Region "Jobs" Friend Class Job : Implements IDisposable Friend Event OnItemsCountChange(ByVal Sender As Job, ByVal Count As Integer) @@ -105,11 +131,11 @@ Namespace DownloadObjects Dim i% = Keys.IndexOf(DirectCast(User, UserDataBase).User.Plugin) If i >= 0 Then Return Hosts(i) Else Throw New KeyNotFoundException($"Plugin key [{DirectCast(User, UserDataBase).User.Plugin}] not found") End Function - Friend Function Available() As Boolean + Friend Function Available(ByVal Silent As Boolean) As Boolean If Hosts.Count > 0 Then Dim k$ For i% = Hosts.Count - 1 To 0 Step -1 - If Not Hosts(i).Available(Type) Then + If Not Hosts(i).Available(Type, Silent) Then k = Hosts(i).Key If Not RemovingKeys.Contains(k) Then RemovingKeys.Add(k) Hosts(i).DownloadDone(Type) @@ -182,11 +208,14 @@ Namespace DownloadObjects End Class Friend ReadOnly Pool As List(Of Job) #End Region +#Region "Initializer" Friend Sub New() Downloaded = New List(Of IUserData) NProv = New ANumbers With {.FormatOptions = ANumbers.Options.GroupIntegral} Pool = New List(Of Job) End Sub +#End Region +#Region "Pool" Friend Sub ReconfPool() If Pool.Count = 0 OrElse Not Pool.Exists(Function(j) j.Working Or j.Count > 0) Then Pool.ListClearDispose @@ -204,12 +233,14 @@ Namespace DownloadObjects RaiseEvent OnReconfigured() End If End Sub +#End Region +#Region "Thread" Private CheckerThread As Thread Private Sub [Start]() - If MyProgressForm.ReadyToOpen AndAlso Pool.LongCount(Function(p) p.Count > 0) > 1 Then MyProgressForm.Show() : MainFrameObj.Focus() + If Not DisableOpenForms AndAlso MyProgressForm.ReadyToOpen AndAlso Pool.LongCount(Function(p) p.Count > 0) > 1 Then MyProgressForm.Show() : MainFrameObj.Focus() If Not If(CheckerThread?.IsAlive, False) Then MainProgress.Enabled = True - If InfoForm.ReadyToOpen Then InfoForm.Show() : MainFrameObj.Focus() + If Not DisableOpenForms AndAlso InfoForm.ReadyToOpen Then InfoForm.Show() : MainFrameObj.Focus() CheckerThread = New Thread(New ThreadStart(AddressOf JobsChecker)) CheckerThread.SetApartmentState(ApartmentState.MTA) CheckerThread.Start() @@ -245,7 +276,7 @@ Namespace DownloadObjects Dim n$ = _Job.Name Dim pt As Func(Of String, String) = Function(ByVal t As String) As String Dim _t$ = If(isSeparated, $"{n} {Left(t, 1).ToLower}{Right(t, t.Length - 1)}", t) - RaiseEvent SendNotification(_t) + If Not _DisableCompleteNotification Then RaiseEvent SendNotification(_t) Return _t End Function Try @@ -256,7 +287,7 @@ Namespace DownloadObjects Dim SiteChecked As Boolean = False Do While _Job.Count > 0 _Job.ThrowIfCancellationRequested() - If Not SiteChecked Then _Job.Available() : SiteChecked = True : Continue Do + If Not SiteChecked Then _Job.Available(_AutoDownloaderWorking) : SiteChecked = True : Continue Do UpdateJobsLabel() DownloadData(_Job, _Job.Token) _Job.ThrowIfCancellationRequested() @@ -282,7 +313,7 @@ Namespace DownloadObjects End If End Sub Private Sub UpdateJobsLabel() - RaiseEvent OnJobsChange(Pool.Sum(Function(j) j.Count)) + RaiseEvent OnJobsChange(Count) End Sub Private Sub DownloadData(ByRef _Job As Job, ByVal Token As CancellationToken) Try @@ -351,7 +382,7 @@ Namespace DownloadObjects End Sub)) End Try End Sub - Private Function GetUserFromMainCollection(ByVal User As IUserData) As IUserData + Friend Shared Function GetUserFromMainCollection(ByVal User As IUserData) As IUserData Dim uSimple As Predicate(Of IUserData) = Function(u) u.Equals(DirectCast(User, UserDataBase)) Dim uCol As Predicate(Of IUserData) = Function(ByVal u As IUserData) As Boolean If u.IsCollection Then @@ -375,6 +406,8 @@ Namespace DownloadObjects End If Return Nothing End Function +#End Region +#Region "Add" Private Sub AddItem(ByVal Item As IUserData, ByVal _UpdateJobsLabel As Boolean) ReconfPool() If Item.IsCollection Then @@ -401,6 +434,8 @@ Namespace DownloadObjects End If Start() End Sub +#End Region +#Region "Contains, Remove" Private Function Contains(ByVal _Item As IUserData) If Pool.Count > 0 Then For Each j As Job In Pool @@ -412,6 +447,7 @@ Namespace DownloadObjects Friend Sub UserRemove(ByVal _Item As IUserData) If Downloaded.Count > 0 AndAlso Downloaded.Contains(_Item) Then Downloaded.Remove(_Item) : RaiseEvent OnDownloadCountChange() End Sub +#End Region #Region "IDisposable Support" Private disposedValue As Boolean = False Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) diff --git a/SCrawler/Editors/GlobalSettingsForm.Designer.vb b/SCrawler/Editors/GlobalSettingsForm.Designer.vb index 24f9080..db59fad 100644 --- a/SCrawler/Editors/GlobalSettingsForm.Designer.vb +++ b/SCrawler/Editors/GlobalSettingsForm.Designer.vb @@ -37,12 +37,12 @@ Dim TAB_BEHAVIOR As System.Windows.Forms.TabPage Dim TP_BEHAVIOR As System.Windows.Forms.TableLayoutPanel Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim TP_OPEN_INFO As System.Windows.Forms.TableLayoutPanel + Dim TP_OPEN_PROGRESS As System.Windows.Forms.TableLayoutPanel Dim TAB_DOWN As System.Windows.Forms.TabPage Dim TP_DOWNLOADING As System.Windows.Forms.TableLayoutPanel Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim TP_OPEN_INFO As System.Windows.Forms.TableLayoutPanel - Dim TP_OPEN_PROGRESS As System.Windows.Forms.TableLayoutPanel Me.TXT_GLOBAL_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_IMAGE_LARGE = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_IMAGE_SMALL = New PersonalUtilities.Forms.Controls.TextBoxExtended() @@ -69,6 +69,8 @@ Me.CH_CHANNELS_USERS_TEMP = New System.Windows.Forms.CheckBox() Me.CH_COPY_CHANNEL_USER_IMAGE_ALL = New System.Windows.Forms.CheckBox() Me.CH_UDESCR_UP = New System.Windows.Forms.CheckBox() + Me.CH_DOWN_OPEN_INFO_SUSPEND = New System.Windows.Forms.CheckBox() + Me.CH_DOWN_OPEN_PROGRESS_SUSPEND = New System.Windows.Forms.CheckBox() Me.TXT_CHANNELS_ROWS = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_CHANNELS_COLUMNS = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_CHANNEL_USER_POST_LIMIT = New PersonalUtilities.Forms.Controls.TextBoxExtended() @@ -76,16 +78,16 @@ Me.CH_EXIT_CONFIRM = New System.Windows.Forms.CheckBox() Me.CH_CLOSE_TO_TRAY = New System.Windows.Forms.CheckBox() Me.CH_SHOW_NOTIFY = New System.Windows.Forms.CheckBox() - Me.CH_RECYCLE_DEL = New System.Windows.Forms.CheckBox() - Me.CH_DOWN_OPEN_INFO = New System.Windows.Forms.CheckBox() - Me.CH_DOWN_OPEN_PROGRESS = New System.Windows.Forms.CheckBox() Me.TXT_CLOSE_SCRIPT = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CH_DOWN_OPEN_INFO = New System.Windows.Forms.CheckBox() + Me.CH_RECYCLE_DEL = New System.Windows.Forms.CheckBox() + Me.CH_DOWN_OPEN_PROGRESS = New System.Windows.Forms.CheckBox() Me.TXT_SCRIPT = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_DOWN_COMPLETE_SCRIPT = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TAB_MAIN = New System.Windows.Forms.TabControl() + Me.TAB_AUTO = New System.Windows.Forms.TabPage() + Me.PANEL_AUTO = New System.Windows.Forms.Panel() Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() - Me.CH_DOWN_OPEN_INFO_SUSPEND = New System.Windows.Forms.CheckBox() - Me.CH_DOWN_OPEN_PROGRESS_SUSPEND = New System.Windows.Forms.CheckBox() TP_BASIS = New System.Windows.Forms.TableLayoutPanel() TP_IMAGES = New System.Windows.Forms.TableLayoutPanel() TP_FILE_NAME = New System.Windows.Forms.TableLayoutPanel() @@ -100,10 +102,10 @@ TP_CHANNELS = New System.Windows.Forms.TableLayoutPanel() TAB_BEHAVIOR = New System.Windows.Forms.TabPage() TP_BEHAVIOR = New System.Windows.Forms.TableLayoutPanel() - TAB_DOWN = New System.Windows.Forms.TabPage() - TP_DOWNLOADING = New System.Windows.Forms.TableLayoutPanel() TP_OPEN_INFO = New System.Windows.Forms.TableLayoutPanel() TP_OPEN_PROGRESS = New System.Windows.Forms.TableLayoutPanel() + TAB_DOWN = New System.Windows.Forms.TabPage() + TP_DOWNLOADING = New System.Windows.Forms.TableLayoutPanel() TP_BASIS.SuspendLayout() CType(Me.TXT_GLOBAL_PATH, System.ComponentModel.ISupportInitialize).BeginInit() TP_IMAGES.SuspendLayout() @@ -128,15 +130,16 @@ TP_BEHAVIOR.SuspendLayout() CType(Me.TXT_FOLDER_CMD, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.TXT_CLOSE_SCRIPT, System.ComponentModel.ISupportInitialize).BeginInit() + TP_OPEN_INFO.SuspendLayout() + TP_OPEN_PROGRESS.SuspendLayout() TAB_DOWN.SuspendLayout() TP_DOWNLOADING.SuspendLayout() CType(Me.TXT_SCRIPT, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.TXT_DOWN_COMPLETE_SCRIPT, System.ComponentModel.ISupportInitialize).BeginInit() Me.TAB_MAIN.SuspendLayout() + Me.TAB_AUTO.SuspendLayout() Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() Me.CONTAINER_MAIN.SuspendLayout() - TP_OPEN_INFO.SuspendLayout() - TP_OPEN_PROGRESS.SuspendLayout() Me.SuspendLayout() ' 'TP_BASIS @@ -167,7 +170,7 @@ TP_BASIS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_BASIS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_BASIS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_BASIS.Size = New System.Drawing.Size(570, 253) + TP_BASIS.Size = New System.Drawing.Size(570, 278) TP_BASIS.TabIndex = 0 ' 'TXT_GLOBAL_PATH @@ -586,6 +589,30 @@ " will be added via a new line") Me.CH_UDESCR_UP.UseVisualStyleBackColor = True ' + 'CH_DOWN_OPEN_INFO_SUSPEND + ' + Me.CH_DOWN_OPEN_INFO_SUSPEND.AutoSize = True + Me.CH_DOWN_OPEN_INFO_SUSPEND.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_DOWN_OPEN_INFO_SUSPEND.Location = New System.Drawing.Point(290, 4) + Me.CH_DOWN_OPEN_INFO_SUSPEND.Name = "CH_DOWN_OPEN_INFO_SUSPEND" + Me.CH_DOWN_OPEN_INFO_SUSPEND.Size = New System.Drawing.Size(280, 17) + Me.CH_DOWN_OPEN_INFO_SUSPEND.TabIndex = 1 + Me.CH_DOWN_OPEN_INFO_SUSPEND.Text = "Don't open again" + TT_MAIN.SetToolTip(Me.CH_DOWN_OPEN_INFO_SUSPEND, "Do not open the form automatically if it was once closed") + Me.CH_DOWN_OPEN_INFO_SUSPEND.UseVisualStyleBackColor = True + ' + 'CH_DOWN_OPEN_PROGRESS_SUSPEND + ' + Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.AutoSize = True + Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Location = New System.Drawing.Point(290, 4) + Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Name = "CH_DOWN_OPEN_PROGRESS_SUSPEND" + Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Size = New System.Drawing.Size(280, 17) + Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.TabIndex = 1 + Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Text = "Don't open again" + TT_MAIN.SetToolTip(Me.CH_DOWN_OPEN_PROGRESS_SUSPEND, "Do not open the form automatically if it was once closed") + Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.UseVisualStyleBackColor = True + ' 'TP_CHANNELS_IMGS ' TP_CHANNELS_IMGS.ColumnCount = 2 @@ -637,7 +664,7 @@ TAB_BASIS.Location = New System.Drawing.Point(4, 22) TAB_BASIS.Name = "TAB_BASIS" TAB_BASIS.Padding = New System.Windows.Forms.Padding(3) - TAB_BASIS.Size = New System.Drawing.Size(576, 259) + TAB_BASIS.Size = New System.Drawing.Size(576, 284) TAB_BASIS.TabIndex = 0 TAB_BASIS.Text = "Basis" ' @@ -822,39 +849,6 @@ Me.CH_SHOW_NOTIFY.Text = "Show notifications" Me.CH_SHOW_NOTIFY.UseVisualStyleBackColor = True ' - 'CH_RECYCLE_DEL - ' - Me.CH_RECYCLE_DEL.AutoSize = True - Me.CH_RECYCLE_DEL.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_RECYCLE_DEL.Location = New System.Drawing.Point(4, 108) - Me.CH_RECYCLE_DEL.Name = "CH_RECYCLE_DEL" - Me.CH_RECYCLE_DEL.Size = New System.Drawing.Size(568, 19) - Me.CH_RECYCLE_DEL.TabIndex = 4 - Me.CH_RECYCLE_DEL.Text = "Delete data to recycle bin" - Me.CH_RECYCLE_DEL.UseVisualStyleBackColor = True - ' - 'CH_DOWN_OPEN_INFO - ' - Me.CH_DOWN_OPEN_INFO.AutoSize = True - Me.CH_DOWN_OPEN_INFO.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_DOWN_OPEN_INFO.Location = New System.Drawing.Point(4, 4) - Me.CH_DOWN_OPEN_INFO.Name = "CH_DOWN_OPEN_INFO" - Me.CH_DOWN_OPEN_INFO.Size = New System.Drawing.Size(279, 17) - Me.CH_DOWN_OPEN_INFO.TabIndex = 0 - Me.CH_DOWN_OPEN_INFO.Text = "Open the 'Info' form when the download starts" - Me.CH_DOWN_OPEN_INFO.UseVisualStyleBackColor = True - ' - 'CH_DOWN_OPEN_PROGRESS - ' - Me.CH_DOWN_OPEN_PROGRESS.AutoSize = True - Me.CH_DOWN_OPEN_PROGRESS.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_DOWN_OPEN_PROGRESS.Location = New System.Drawing.Point(4, 4) - Me.CH_DOWN_OPEN_PROGRESS.Name = "CH_DOWN_OPEN_PROGRESS" - Me.CH_DOWN_OPEN_PROGRESS.Size = New System.Drawing.Size(279, 17) - Me.CH_DOWN_OPEN_PROGRESS.TabIndex = 0 - Me.CH_DOWN_OPEN_PROGRESS.Text = "Open the 'Progress' form when the download starts" - Me.CH_DOWN_OPEN_PROGRESS.UseVisualStyleBackColor = True - ' 'TXT_CLOSE_SCRIPT ' Me.TXT_CLOSE_SCRIPT.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox @@ -869,6 +863,75 @@ Me.TXT_CLOSE_SCRIPT.Size = New System.Drawing.Size(568, 22) Me.TXT_CLOSE_SCRIPT.TabIndex = 8 ' + 'TP_OPEN_INFO + ' + TP_OPEN_INFO.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_OPEN_INFO.ColumnCount = 2 + TP_OPEN_INFO.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_OPEN_INFO.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_OPEN_INFO.Controls.Add(Me.CH_DOWN_OPEN_INFO, 0, 0) + TP_OPEN_INFO.Controls.Add(Me.CH_DOWN_OPEN_INFO_SUSPEND, 1, 0) + TP_OPEN_INFO.Dock = System.Windows.Forms.DockStyle.Fill + TP_OPEN_INFO.Location = New System.Drawing.Point(1, 131) + TP_OPEN_INFO.Margin = New System.Windows.Forms.Padding(0) + TP_OPEN_INFO.Name = "TP_OPEN_INFO" + TP_OPEN_INFO.RowCount = 1 + TP_OPEN_INFO.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_OPEN_INFO.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24.0!)) + TP_OPEN_INFO.Size = New System.Drawing.Size(574, 25) + TP_OPEN_INFO.TabIndex = 5 + ' + 'CH_DOWN_OPEN_INFO + ' + Me.CH_DOWN_OPEN_INFO.AutoSize = True + Me.CH_DOWN_OPEN_INFO.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_DOWN_OPEN_INFO.Location = New System.Drawing.Point(4, 4) + Me.CH_DOWN_OPEN_INFO.Name = "CH_DOWN_OPEN_INFO" + Me.CH_DOWN_OPEN_INFO.Size = New System.Drawing.Size(279, 17) + Me.CH_DOWN_OPEN_INFO.TabIndex = 0 + Me.CH_DOWN_OPEN_INFO.Text = "Open the 'Info' form when the download starts" + Me.CH_DOWN_OPEN_INFO.UseVisualStyleBackColor = True + ' + 'CH_RECYCLE_DEL + ' + Me.CH_RECYCLE_DEL.AutoSize = True + Me.CH_RECYCLE_DEL.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_RECYCLE_DEL.Location = New System.Drawing.Point(4, 108) + Me.CH_RECYCLE_DEL.Name = "CH_RECYCLE_DEL" + Me.CH_RECYCLE_DEL.Size = New System.Drawing.Size(568, 19) + Me.CH_RECYCLE_DEL.TabIndex = 4 + Me.CH_RECYCLE_DEL.Text = "Delete data to recycle bin" + Me.CH_RECYCLE_DEL.UseVisualStyleBackColor = True + ' + 'TP_OPEN_PROGRESS + ' + TP_OPEN_PROGRESS.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_OPEN_PROGRESS.ColumnCount = 2 + TP_OPEN_PROGRESS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_OPEN_PROGRESS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_OPEN_PROGRESS.Controls.Add(Me.CH_DOWN_OPEN_PROGRESS, 0, 0) + TP_OPEN_PROGRESS.Controls.Add(Me.CH_DOWN_OPEN_PROGRESS_SUSPEND, 1, 0) + TP_OPEN_PROGRESS.Dock = System.Windows.Forms.DockStyle.Fill + TP_OPEN_PROGRESS.Location = New System.Drawing.Point(1, 157) + TP_OPEN_PROGRESS.Margin = New System.Windows.Forms.Padding(0) + TP_OPEN_PROGRESS.Name = "TP_OPEN_PROGRESS" + TP_OPEN_PROGRESS.RowCount = 1 + TP_OPEN_PROGRESS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_OPEN_PROGRESS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24.0!)) + TP_OPEN_PROGRESS.Size = New System.Drawing.Size(574, 25) + TP_OPEN_PROGRESS.TabIndex = 6 + ' + 'CH_DOWN_OPEN_PROGRESS + ' + Me.CH_DOWN_OPEN_PROGRESS.AutoSize = True + Me.CH_DOWN_OPEN_PROGRESS.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_DOWN_OPEN_PROGRESS.Location = New System.Drawing.Point(4, 4) + Me.CH_DOWN_OPEN_PROGRESS.Name = "CH_DOWN_OPEN_PROGRESS" + Me.CH_DOWN_OPEN_PROGRESS.Size = New System.Drawing.Size(279, 17) + Me.CH_DOWN_OPEN_PROGRESS.TabIndex = 0 + Me.CH_DOWN_OPEN_PROGRESS.Text = "Open the 'Progress' form when the download starts" + Me.CH_DOWN_OPEN_PROGRESS.UseVisualStyleBackColor = True + ' 'TAB_DOWN ' TAB_DOWN.Controls.Add(TP_DOWNLOADING) @@ -946,6 +1009,7 @@ Me.TAB_MAIN.Controls.Add(TAB_BEHAVIOR) Me.TAB_MAIN.Controls.Add(TAB_DEFAULTS) Me.TAB_MAIN.Controls.Add(TAB_DOWN) + Me.TAB_MAIN.Controls.Add(Me.TAB_AUTO) Me.TAB_MAIN.Controls.Add(TAB_DEFS_CHANNELS) Me.TAB_MAIN.Dock = System.Windows.Forms.DockStyle.Fill Me.TAB_MAIN.Location = New System.Drawing.Point(0, 0) @@ -954,6 +1018,24 @@ Me.TAB_MAIN.Size = New System.Drawing.Size(584, 310) Me.TAB_MAIN.TabIndex = 1 ' + 'TAB_AUTO + ' + Me.TAB_AUTO.Controls.Add(Me.PANEL_AUTO) + Me.TAB_AUTO.Location = New System.Drawing.Point(4, 22) + Me.TAB_AUTO.Name = "TAB_AUTO" + Me.TAB_AUTO.Size = New System.Drawing.Size(576, 284) + Me.TAB_AUTO.TabIndex = 7 + Me.TAB_AUTO.Text = "Automation" + ' + 'PANEL_AUTO + ' + Me.PANEL_AUTO.AutoSize = True + Me.PANEL_AUTO.Dock = System.Windows.Forms.DockStyle.Fill + Me.PANEL_AUTO.Location = New System.Drawing.Point(0, 0) + Me.PANEL_AUTO.Name = "PANEL_AUTO" + Me.PANEL_AUTO.Size = New System.Drawing.Size(576, 284) + Me.PANEL_AUTO.TabIndex = 0 + ' 'CONTAINER_MAIN ' ' @@ -970,66 +1052,6 @@ Me.CONTAINER_MAIN.TabIndex = 0 Me.CONTAINER_MAIN.TopToolStripPanelVisible = False ' - 'TP_OPEN_INFO - ' - TP_OPEN_INFO.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] - TP_OPEN_INFO.ColumnCount = 2 - TP_OPEN_INFO.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) - TP_OPEN_INFO.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) - TP_OPEN_INFO.Controls.Add(Me.CH_DOWN_OPEN_INFO, 0, 0) - TP_OPEN_INFO.Controls.Add(Me.CH_DOWN_OPEN_INFO_SUSPEND, 1, 0) - TP_OPEN_INFO.Dock = System.Windows.Forms.DockStyle.Fill - TP_OPEN_INFO.Location = New System.Drawing.Point(1, 131) - TP_OPEN_INFO.Margin = New System.Windows.Forms.Padding(0) - TP_OPEN_INFO.Name = "TP_OPEN_INFO" - TP_OPEN_INFO.RowCount = 1 - TP_OPEN_INFO.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_OPEN_INFO.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) - TP_OPEN_INFO.Size = New System.Drawing.Size(574, 25) - TP_OPEN_INFO.TabIndex = 5 - ' - 'TP_OPEN_PROGRESS - ' - TP_OPEN_PROGRESS.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] - TP_OPEN_PROGRESS.ColumnCount = 2 - TP_OPEN_PROGRESS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) - TP_OPEN_PROGRESS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) - TP_OPEN_PROGRESS.Controls.Add(Me.CH_DOWN_OPEN_PROGRESS, 0, 0) - TP_OPEN_PROGRESS.Controls.Add(Me.CH_DOWN_OPEN_PROGRESS_SUSPEND, 1, 0) - TP_OPEN_PROGRESS.Dock = System.Windows.Forms.DockStyle.Fill - TP_OPEN_PROGRESS.Location = New System.Drawing.Point(1, 157) - TP_OPEN_PROGRESS.Margin = New System.Windows.Forms.Padding(0) - TP_OPEN_PROGRESS.Name = "TP_OPEN_PROGRESS" - TP_OPEN_PROGRESS.RowCount = 1 - TP_OPEN_PROGRESS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_OPEN_PROGRESS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) - TP_OPEN_PROGRESS.Size = New System.Drawing.Size(574, 25) - TP_OPEN_PROGRESS.TabIndex = 6 - ' - 'CH_DOWN_OPEN_INFO_SUSPEND - ' - Me.CH_DOWN_OPEN_INFO_SUSPEND.AutoSize = True - Me.CH_DOWN_OPEN_INFO_SUSPEND.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_DOWN_OPEN_INFO_SUSPEND.Location = New System.Drawing.Point(290, 4) - Me.CH_DOWN_OPEN_INFO_SUSPEND.Name = "CH_DOWN_OPEN_INFO_SUSPEND" - Me.CH_DOWN_OPEN_INFO_SUSPEND.Size = New System.Drawing.Size(280, 17) - Me.CH_DOWN_OPEN_INFO_SUSPEND.TabIndex = 1 - Me.CH_DOWN_OPEN_INFO_SUSPEND.Text = "Don't open again" - TT_MAIN.SetToolTip(Me.CH_DOWN_OPEN_INFO_SUSPEND, "Do not open the form automatically if it was once closed") - Me.CH_DOWN_OPEN_INFO_SUSPEND.UseVisualStyleBackColor = True - ' - 'CH_DOWN_OPEN_PROGRESS_SUSPEND - ' - Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.AutoSize = True - Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Location = New System.Drawing.Point(290, 4) - Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Name = "CH_DOWN_OPEN_PROGRESS_SUSPEND" - Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Size = New System.Drawing.Size(280, 17) - Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.TabIndex = 1 - Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.Text = "Don't open again" - TT_MAIN.SetToolTip(Me.CH_DOWN_OPEN_PROGRESS_SUSPEND, "Do not open the form automatically if it was once closed") - Me.CH_DOWN_OPEN_PROGRESS_SUSPEND.UseVisualStyleBackColor = True - ' 'GlobalSettingsForm ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -1077,19 +1099,21 @@ TP_BEHAVIOR.PerformLayout() CType(Me.TXT_FOLDER_CMD, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.TXT_CLOSE_SCRIPT, System.ComponentModel.ISupportInitialize).EndInit() + TP_OPEN_INFO.ResumeLayout(False) + TP_OPEN_INFO.PerformLayout() + TP_OPEN_PROGRESS.ResumeLayout(False) + TP_OPEN_PROGRESS.PerformLayout() TAB_DOWN.ResumeLayout(False) TP_DOWNLOADING.ResumeLayout(False) TP_DOWNLOADING.PerformLayout() CType(Me.TXT_SCRIPT, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.TXT_DOWN_COMPLETE_SCRIPT, System.ComponentModel.ISupportInitialize).EndInit() Me.TAB_MAIN.ResumeLayout(False) + Me.TAB_AUTO.ResumeLayout(False) + Me.TAB_AUTO.PerformLayout() Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) Me.CONTAINER_MAIN.ResumeLayout(False) Me.CONTAINER_MAIN.PerformLayout() - TP_OPEN_INFO.ResumeLayout(False) - TP_OPEN_INFO.PerformLayout() - TP_OPEN_PROGRESS.ResumeLayout(False) - TP_OPEN_PROGRESS.PerformLayout() Me.ResumeLayout(False) End Sub @@ -1137,5 +1161,7 @@ Private WithEvents TXT_DOWN_COMPLETE_SCRIPT As PersonalUtilities.Forms.Controls.TextBoxExtended Private WithEvents CH_DOWN_OPEN_INFO_SUSPEND As CheckBox Private WithEvents CH_DOWN_OPEN_PROGRESS_SUSPEND As CheckBox + Private WithEvents TAB_AUTO As TabPage + Private WithEvents PANEL_AUTO As Panel End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.vb b/SCrawler/Editors/GlobalSettingsForm.vb index b2b2727..8c5c159 100644 --- a/SCrawler/Editors/GlobalSettingsForm.vb +++ b/SCrawler/Editors/GlobalSettingsForm.vb @@ -12,9 +12,18 @@ Imports PersonalUtilities.Forms.Toolbars Namespace Editors Friend Class GlobalSettingsForm : Implements IOkCancelToolbar Private ReadOnly MyDefs As DefaultFormProps + Private ReadOnly Automation As DownloadObjects.AutoDownloaderEditorForm Friend Sub New() InitializeComponent() MyDefs = New DefaultFormProps + Automation = New DownloadObjects.AutoDownloaderEditorForm With { + .MaximumSize = New Size(0, 0), + .MinimumSize = New Size(0, 0), + .Dock = DockStyle.Fill, + .FormBorderStyle = FormBorderStyle.None, + .TopLevel = False, + .IsControlForm = True + } End Sub Private Sub GlobalSettingsForm_Load(sender As Object, e As EventArgs) Handles Me.Load Try @@ -77,10 +86,14 @@ Namespace Editors CH_COPY_CHANNEL_USER_IMAGE_ALL.Enabled = CH_COPY_CHANNEL_USER_IMAGE.Checked CH_CHANNELS_USERS_TEMP.Checked = .ChannelsDefaultTemporary End With + PANEL_AUTO.Controls.Add(Automation) + Automation.Show() .MyFieldsChecker = New FieldsChecker With DirectCast(.MyFieldsChecker, FieldsChecker) .AddControl(Of String)(TXT_GLOBAL_PATH, TXT_GLOBAL_PATH.CaptionText) .AddControl(Of String)(TXT_COLLECTIONS_PATH, TXT_COLLECTIONS_PATH.CaptionText) + .AddControl(Of Integer)(Automation.TXT_TIMER, Automation.TXT_TIMER.CaptionText,, + New DownloadObjects.AutoDownloaderEditorForm.AutomationTimerChecker) .EndLoaderOperations() End With .AppendDetectors() @@ -91,6 +104,9 @@ Namespace Editors MyDefs.InvokeLoaderError(ex) End Try End Sub + Private Sub GlobalSettingsForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + Automation.Dispose() + End Sub Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK If MyDefs.MyFieldsChecker.AllParamsOK Then With Settings @@ -179,6 +195,8 @@ Namespace Editors .ChannelsAddUserImagesFromAllChannels.Value = CH_COPY_CHANNEL_USER_IMAGE_ALL.Checked .ChannelsDefaultTemporary.Value = CH_CHANNELS_USERS_TEMP.Checked + Automation.SaveSetiings() + .EndUpdate() End With MyDefs.CloseForm() diff --git a/SCrawler/Editors/LabelsForm.vb b/SCrawler/Editors/LabelsForm.vb index a097b76..05bb29d 100644 --- a/SCrawler/Editors/LabelsForm.vb +++ b/SCrawler/Editors/LabelsForm.vb @@ -14,6 +14,16 @@ Imports PersonalUtilities.Functions.Messaging Friend Class LabelsForm : Implements IOkCancelDeleteToolbar Private ReadOnly MyDefs As DefaultFormProps Friend ReadOnly Property LabelsList As List(Of String) + Private ReadOnly _Source As IEnumerable(Of String) = Nothing + Private ReadOnly Property Source As IEnumerable(Of String) + Get + If Not _Source Is Nothing Then + Return _Source + Else + Return Settings.Labels + End If + End Get + End Property Private _AnyLabelAdd As Boolean = False Friend Property MultiUser As Boolean = False Friend Property MultiUserClearExists As Boolean = False @@ -24,19 +34,24 @@ Friend Class LabelsForm : Implements IOkCancelDeleteToolbar LabelsList.ListAddList(LabelsArr) MyDefs = New DefaultFormProps End Sub + Friend Sub New(ByVal Current As IEnumerable(Of String), ByVal Source As IEnumerable(Of String)) + Me.New(Current) + _Source = Source + End Sub Private Sub LabelsForm_Load(sender As Object, e As EventArgs) Handles Me.Load Try With MyDefs .MyViewInitialize(Me, Settings.Design) .AddOkCancelToolbar(, WithDeleteButton) .DelegateClosingChecker() - If Settings.Labels.Count > 0 Then + If Source.Count > 0 Then Dim items As New List(Of Integer) CMB_LABELS.BeginUpdate() - For i% = 0 To Settings.Labels.Count - 1 - If LabelsList.Contains(Settings.Labels(i)) Then items.Add(i) - CMB_LABELS.Items.Add(Settings.Labels(i)) + For i% = 0 To Source.Count - 1 + If LabelsList.Contains(Source(i)) Then items.Add(i) + CMB_LABELS.Items.Add(Source(i)) Next + If Not _Source Is Nothing Then CMB_LABELS.Buttons.Clear() CMB_LABELS.EndUpdate() CMB_LABELS.ListCheckedIndexes = items End If @@ -48,7 +63,7 @@ Friend Class LabelsForm : Implements IOkCancelDeleteToolbar End Try End Sub Private Sub LabelsForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown - If e.KeyCode = Keys.Insert Then AddNewLabel() : e.Handled = True + If e.KeyCode = Keys.Insert And _Source Is Nothing Then AddNewLabel() : e.Handled = True End Sub Private Sub LabelsForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed LabelsList.Clear() @@ -69,7 +84,7 @@ Friend Class LabelsForm : Implements IOkCancelDeleteToolbar End Select End If LabelsList.ListAddList(CMB_LABELS.Items.CheckedItems.Select(Function(l) CStr(l.Value(0))), LAP.ClearBeforeAdd, LAP.NotContainsOnly) - If _AnyLabelAdd Then Settings.Labels.Update() + If _AnyLabelAdd And _Source Is Nothing Then Settings.Labels.Update() MyDefs.CloseForm() Catch ex As Exception ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Choosing labels") diff --git a/SCrawler/Editors/SiteEditorForm.Designer.vb b/SCrawler/Editors/SiteEditorForm.Designer.vb index b7ef02b..411dbdb 100644 --- a/SCrawler/Editors/SiteEditorForm.Designer.vb +++ b/SCrawler/Editors/SiteEditorForm.Designer.vb @@ -14,13 +14,14 @@ Private components As System.ComponentModel.IContainer Private Sub InitializeComponent() - Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Me.components = New System.ComponentModel.Container() + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(SiteEditorForm)) - Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton10 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton11 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton12 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton5 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Me.TP_MAIN = New System.Windows.Forms.TableLayoutPanel() Me.TXT_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_COOKIES = New PersonalUtilities.Forms.Controls.TextBoxExtended() @@ -28,6 +29,7 @@ Me.TXT_PATH_SAVED_POSTS = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.CH_GET_USER_MEDIA_ONLY = New System.Windows.Forms.CheckBox() Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + Me.TT_MAIN = New System.Windows.Forms.ToolTip(Me.components) Me.TP_MAIN.SuspendLayout() CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).BeginInit() @@ -59,14 +61,14 @@ ' 'TXT_PATH ' - ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image) - ActionButton7.Index = 0 - ActionButton7.Name = "BTT_OPEN" - ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image) - ActionButton8.Index = 1 - ActionButton8.Name = "BTT_CLEAR" - Me.TXT_PATH.Buttons.Add(ActionButton7) - Me.TXT_PATH.Buttons.Add(ActionButton8) + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_OPEN" + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_CLEAR" + Me.TXT_PATH.Buttons.Add(ActionButton1) + Me.TXT_PATH.Buttons.Add(ActionButton2) Me.TXT_PATH.CaptionText = "Path" Me.TXT_PATH.CaptionToolTipEnabled = True Me.TXT_PATH.CaptionToolTipText = "Specific path to store Twitter files" @@ -78,14 +80,14 @@ ' 'TXT_COOKIES ' - ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image) - ActionButton9.Index = 0 - ActionButton9.Name = "BTT_EDIT" - ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image) - ActionButton10.Index = 1 - ActionButton10.Name = "BTT_CLEAR" - Me.TXT_COOKIES.Buttons.Add(ActionButton9) - Me.TXT_COOKIES.Buttons.Add(ActionButton10) + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 0 + ActionButton3.Name = "BTT_EDIT" + ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) + ActionButton4.Index = 1 + ActionButton4.Name = "BTT_CLEAR" + Me.TXT_COOKIES.Buttons.Add(ActionButton3) + Me.TXT_COOKIES.Buttons.Add(ActionButton4) Me.TXT_COOKIES.CaptionText = "Cookies" Me.TXT_COOKIES.ClearTextByButtonClear = False Me.TXT_COOKIES.Dock = System.Windows.Forms.DockStyle.Fill @@ -114,14 +116,14 @@ ' 'TXT_PATH_SAVED_POSTS ' - ActionButton11.BackgroundImage = CType(resources.GetObject("ActionButton11.BackgroundImage"), System.Drawing.Image) - ActionButton11.Index = 0 - ActionButton11.Name = "BTT_OPEN" - ActionButton12.BackgroundImage = CType(resources.GetObject("ActionButton12.BackgroundImage"), System.Drawing.Image) - ActionButton12.Index = 1 - ActionButton12.Name = "BTT_CLEAR" - Me.TXT_PATH_SAVED_POSTS.Buttons.Add(ActionButton11) - Me.TXT_PATH_SAVED_POSTS.Buttons.Add(ActionButton12) + ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image) + ActionButton5.Index = 0 + ActionButton5.Name = "BTT_OPEN" + ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image) + ActionButton6.Index = 1 + ActionButton6.Name = "BTT_CLEAR" + Me.TXT_PATH_SAVED_POSTS.Buttons.Add(ActionButton5) + Me.TXT_PATH_SAVED_POSTS.Buttons.Add(ActionButton6) Me.TXT_PATH_SAVED_POSTS.CaptionText = "Saved posts path" Me.TXT_PATH_SAVED_POSTS.Dock = System.Windows.Forms.DockStyle.Fill Me.TXT_PATH_SAVED_POSTS.Location = New System.Drawing.Point(3, 31) @@ -192,5 +194,6 @@ Private WithEvents TXT_PATH_SAVED_POSTS As PersonalUtilities.Forms.Controls.TextBoxExtended Private WithEvents TP_SITE_PROPS As SiteDefaults Private WithEvents CH_GET_USER_MEDIA_ONLY As CheckBox + Private WithEvents TT_MAIN As ToolTip End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/SiteEditorForm.resx b/SCrawler/Editors/SiteEditorForm.resx index 9b002d8..0f3ab90 100644 --- a/SCrawler/Editors/SiteEditorForm.resx +++ b/SCrawler/Editors/SiteEditorForm.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -129,7 +129,7 @@ cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -137,7 +137,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp @@ -195,7 +195,7 @@ AAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -203,7 +203,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -214,7 +214,7 @@ cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -222,4 +222,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + 17, 17 + \ No newline at end of file diff --git a/SCrawler/Editors/SiteEditorForm.vb b/SCrawler/Editors/SiteEditorForm.vb index 1e9a16a..5079671 100644 --- a/SCrawler/Editors/SiteEditorForm.vb +++ b/SCrawler/Editors/SiteEditorForm.vb @@ -113,7 +113,7 @@ Namespace Editors End Select End If - .CreateControl() + .CreateControl(TT_MAIN) AddTpControl(.Control, .ControlHeight) If .LeftOffset > offset Then offset = .LeftOffset If Not .Options.AllowNull Or Not .ProviderFieldsChecker Is Nothing Then diff --git a/SCrawler/MainFrame.Designer.vb b/SCrawler/MainFrame.Designer.vb index 5d38f22..abaca85 100644 --- a/SCrawler/MainFrame.Designer.vb +++ b/SCrawler/MainFrame.Designer.vb @@ -30,6 +30,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Dim TRAY_SEP_1 As System.Windows.Forms.ToolStripSeparator Dim MENU_DOWN_ALL_SEP_1 As System.Windows.Forms.ToolStripSeparator Dim MENU_DOWN_ALL_SEP_2 As System.Windows.Forms.ToolStripSeparator + Dim MENU_DOWN_ALL_SEP_3 As System.Windows.Forms.ToolStripSeparator Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainFrame)) Me.MENU_SETTINGS = New System.Windows.Forms.ToolStripDropDownButton() Me.BTT_SETTINGS = New System.Windows.Forms.ToolStripMenuItem() @@ -48,6 +49,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.BTT_DOWN_ALL_FULL = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_DOWN_SITE_FULL = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_ADD_NEW_GROUP = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_DOWN_AUTOMATION = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_DOWN_VIDEO = New System.Windows.Forms.ToolStripButton() Me.BTT_DOWN_STOP = New System.Windows.Forms.ToolStripButton() Me.MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton() @@ -118,6 +120,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form TRAY_SEP_1 = New System.Windows.Forms.ToolStripSeparator() MENU_DOWN_ALL_SEP_1 = New System.Windows.Forms.ToolStripSeparator() MENU_DOWN_ALL_SEP_2 = New System.Windows.Forms.ToolStripSeparator() + MENU_DOWN_ALL_SEP_3 = New System.Windows.Forms.ToolStripSeparator() Me.Toolbar_TOP.SuspendLayout() Me.Toolbar_BOTTOM.SuspendLayout() Me.USER_CONTEXT.SuspendLayout() @@ -192,7 +195,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form 'TRAY_SEP_1 ' TRAY_SEP_1.Name = "TRAY_SEP_1" - TRAY_SEP_1.Size = New System.Drawing.Size(177, 6) + TRAY_SEP_1.Size = New System.Drawing.Size(157, 6) ' 'MENU_DOWN_ALL_SEP_1 ' @@ -204,6 +207,11 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form MENU_DOWN_ALL_SEP_2.Name = "MENU_DOWN_ALL_SEP_2" MENU_DOWN_ALL_SEP_2.Size = New System.Drawing.Size(228, 6) ' + 'MENU_DOWN_ALL_SEP_3 + ' + MENU_DOWN_ALL_SEP_3.Name = "MENU_DOWN_ALL_SEP_3" + MENU_DOWN_ALL_SEP_3.Size = New System.Drawing.Size(228, 6) + ' 'MENU_SETTINGS ' Me.MENU_SETTINGS.AutoToolTip = False @@ -304,7 +312,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form 'MENU_DOWN_ALL ' Me.MENU_DOWN_ALL.AutoToolTip = False - Me.MENU_DOWN_ALL.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_DOWN_ALL, Me.BTT_DOWN_SITE, MENU_DOWN_ALL_SEP_1, Me.BTT_DOWN_ALL_FULL, Me.BTT_DOWN_SITE_FULL, MENU_DOWN_ALL_SEP_2, Me.BTT_ADD_NEW_GROUP}) + Me.MENU_DOWN_ALL.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_DOWN_ALL, Me.BTT_DOWN_SITE, MENU_DOWN_ALL_SEP_1, Me.BTT_DOWN_ALL_FULL, Me.BTT_DOWN_SITE_FULL, MENU_DOWN_ALL_SEP_2, Me.BTT_ADD_NEW_GROUP, MENU_DOWN_ALL_SEP_3, Me.BTT_DOWN_AUTOMATION}) Me.MENU_DOWN_ALL.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 Me.MENU_DOWN_ALL.ImageTransparentColor = System.Drawing.Color.Magenta Me.MENU_DOWN_ALL.Name = "MENU_DOWN_ALL" @@ -356,6 +364,13 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.BTT_ADD_NEW_GROUP.Size = New System.Drawing.Size(231, 22) Me.BTT_ADD_NEW_GROUP.Text = "Add a new download group" ' + 'BTT_DOWN_AUTOMATION + ' + Me.BTT_DOWN_AUTOMATION.Image = Global.SCrawler.My.Resources.Resources.ScriptPic32 + Me.BTT_DOWN_AUTOMATION.Name = "BTT_DOWN_AUTOMATION" + Me.BTT_DOWN_AUTOMATION.Size = New System.Drawing.Size(231, 22) + Me.BTT_DOWN_AUTOMATION.Text = "Automation" + ' 'BTT_DOWN_VIDEO ' Me.BTT_DOWN_VIDEO.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text @@ -721,12 +736,12 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form ' Me.TRAY_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_TRAY_SHOW_HIDE, TRAY_SEP_1, Me.BTT_TRAY_CLOSE, Me.BTT_TRAY_CLOSE_NO_SCRIPT}) Me.TRAY_CONTEXT.Name = "TRAY_CONTEXT" - Me.TRAY_CONTEXT.Size = New System.Drawing.Size(181, 98) + Me.TRAY_CONTEXT.Size = New System.Drawing.Size(161, 76) ' 'BTT_TRAY_SHOW_HIDE ' Me.BTT_TRAY_SHOW_HIDE.Name = "BTT_TRAY_SHOW_HIDE" - Me.BTT_TRAY_SHOW_HIDE.Size = New System.Drawing.Size(180, 22) + Me.BTT_TRAY_SHOW_HIDE.Size = New System.Drawing.Size(160, 22) Me.BTT_TRAY_SHOW_HIDE.Text = "Show/Hide" ' 'BTT_TRAY_CLOSE @@ -735,17 +750,19 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.BTT_TRAY_CLOSE.ForeColor = System.Drawing.Color.Maroon Me.BTT_TRAY_CLOSE.Image = CType(resources.GetObject("BTT_TRAY_CLOSE.Image"), System.Drawing.Image) Me.BTT_TRAY_CLOSE.Name = "BTT_TRAY_CLOSE" - Me.BTT_TRAY_CLOSE.Size = New System.Drawing.Size(180, 22) + Me.BTT_TRAY_CLOSE.Size = New System.Drawing.Size(160, 22) Me.BTT_TRAY_CLOSE.Text = "Close" ' 'BTT_TRAY_CLOSE_NO_SCRIPT ' + Me.BTT_TRAY_CLOSE_NO_SCRIPT.AutoToolTip = True Me.BTT_TRAY_CLOSE_NO_SCRIPT.BackColor = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer)) Me.BTT_TRAY_CLOSE_NO_SCRIPT.ForeColor = System.Drawing.Color.Maroon Me.BTT_TRAY_CLOSE_NO_SCRIPT.Image = Global.SCrawler.My.Resources.Resources.Delete Me.BTT_TRAY_CLOSE_NO_SCRIPT.Name = "BTT_TRAY_CLOSE_NO_SCRIPT" Me.BTT_TRAY_CLOSE_NO_SCRIPT.Size = New System.Drawing.Size(160, 22) Me.BTT_TRAY_CLOSE_NO_SCRIPT.Text = "Close (no script)" + Me.BTT_TRAY_CLOSE_NO_SCRIPT.ToolTipText = "Close the program without executing the script" Me.BTT_TRAY_CLOSE_NO_SCRIPT.Visible = False ' 'MainFrame @@ -819,7 +836,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Private WithEvents BTT_SITE_SPECIFIC As ToolStripMenuItem Private WithEvents BTT_CONTEXT_CHANGE_FOLDER As ToolStripMenuItem Private WithEvents BTT_DOWN_SAVED As ToolStripButton - Private WithEvents TrayIcon As NotifyIcon + Friend WithEvents TrayIcon As NotifyIcon Private WithEvents BTT_TRAY_SHOW_HIDE As ToolStripMenuItem Private WithEvents BTT_TRAY_CLOSE As ToolStripMenuItem Private WithEvents BTT_DONATE As ToolStripButton @@ -842,4 +859,5 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Private WithEvents BTT_ADD_NEW_GROUP As ToolStripMenuItem Friend WithEvents BTT_TRAY_CLOSE_NO_SCRIPT As ToolStripMenuItem Friend WithEvents TRAY_CONTEXT As ContextMenuStrip + Private WithEvents BTT_DOWN_AUTOMATION As ToolStripMenuItem End Class \ No newline at end of file diff --git a/SCrawler/MainFrame.resx b/SCrawler/MainFrame.resx index 01d77b8..a12484e 100644 --- a/SCrawler/MainFrame.resx +++ b/SCrawler/MainFrame.resx @@ -165,6 +165,9 @@ False + + False + 132, 17 diff --git a/SCrawler/MainFrame.vb b/SCrawler/MainFrame.vb index f98bad4..1544e69 100644 --- a/SCrawler/MainFrame.vb +++ b/SCrawler/MainFrame.vb @@ -15,6 +15,7 @@ Imports SCrawler.API.Base Imports SCrawler.Editors Imports SCrawler.DownloadObjects Imports SCrawler.Plugin.Hosts +Imports PersonalUtilities.Functions.Messaging Public Class MainFrame Private MyView As FormsView Private ReadOnly _VideoDownloadingMode As Boolean = False @@ -56,7 +57,7 @@ Public Class MainFrame AddHandler Downloader.OnDownloading, AddressOf Downloader_OnDownloading AddHandler Downloader.OnDownloadCountChange, AddressOf InfoForm.Downloader_OnDownloadCountChange AddHandler Downloader.SendNotification, AddressOf NotificationMessage - AddHandler InfoForm.OnUserLooking, AddressOf Info_OnUserLooking + AddHandler InfoForm.UserFind, AddressOf FocusUser Settings.LoadUsers() MyView = New FormsView(Me) MyView.ImportFromXML(Settings.Design) @@ -93,7 +94,12 @@ Public Class MainFrame For Each ugroup As Groups.DownloadGroup In Settings.Groups : GROUPS_Added(ugroup) : Next End If End With + Settings.Automation = New AutoDownloader + AddHandler Settings.Groups.Updated, AddressOf Settings.Automation.GROUPS_Updated + AddHandler Settings.Groups.Deleted, AddressOf Settings.Automation.GROUPS_Deleted + AddHandler Settings.Automation.UserFind, AddressOf FocusUser _UFinit = False + Settings.Automation.Start() GoTo EndFunction FormClosingInvoker: Close() @@ -122,6 +128,7 @@ EndFunction: If Downloader.Working Then _CloseInvoked = True : Downloader.Stop() If ChannelsWorking.Invoke Then _CloseInvoked = True : MyChannels.Stop(False) If SP_Working.Invoke Then _CloseInvoked = True : MySavedPosts.Stop() + Settings.Automation.Stop() If _CloseInvoked Then e.Cancel = True Await Task.Run(Sub() @@ -131,6 +138,7 @@ EndFunction: Downloader.Dispose() MyProgressForm.Dispose() InfoForm.Dispose() + MainFrameObj.CLearNotifications() If Not MyChannels Is Nothing Then MyChannels.Dispose() If Not VideoDownloader Is Nothing Then VideoDownloader.Dispose() If Not MySavedPosts Is Nothing Then MySavedPosts.Dispose() @@ -264,6 +272,7 @@ CloseResume: (Not sg = Settings.ShowGroups And .UseGrouping) Then RefillList() TrayIcon.Visible = .CloseToTray LIST_PROFILES.ShowGroups = .UseGrouping + If Not Settings.Automation.Mode = AutoDownloader.Modes.None Then Settings.Automation.Start() End If End Using End With @@ -415,6 +424,12 @@ CloseResume: MENU_DOWN_ALL.DropDownItems.Remove(Sender.GetControl) End Sub #End Region + Private Sub BTT_DOWN_AUTOMATION_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_AUTOMATION.Click + Using f As New AutoDownloaderEditorForm + f.ShowDialog() + If f.DialogResult = DialogResult.OK AndAlso Not Settings.Automation.Mode = AutoDownloader.Modes.None Then Settings.Automation.Start() + End Using + End Sub Private Sub BTT_DOWN_VIDEO_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_VIDEO.Click DownloadVideoByURL() End Sub @@ -1135,27 +1150,30 @@ ResumeDownloadingOperation: If Not user Is Nothing Then user.OpenFolder() End Sub #End Region - Private Sub Info_OnUserLooking(ByVal Key As String) + Private Overloads Sub FocusUser(ByVal Key As String) FocusUser(Key, True) End Sub - Private Sub FocusUser(ByVal Key As String, Optional ByVal ActivateMe As Boolean = False) - Dim i% = LIST_PROFILES.Items.IndexOfKey(Key) - If i < 0 Then - i = Settings.Users.FindIndex(Function(u) u.Key = Key) - If i >= 0 Then - UserListUpdate(Settings.Users(i), True) - i = LIST_PROFILES.Items.IndexOfKey(Key) - End If - End If - If i >= 0 Then - LIST_PROFILES.Select() - LIST_PROFILES.SelectedIndices.Clear() - With LIST_PROFILES.Items(i) : .Selected = True : .Focused = True : End With - LIST_PROFILES.EnsureVisible(i) - If ActivateMe Then - If Visible Then BringToFront() Else Visible = True - End If - End If + Private Overloads Sub FocusUser(ByVal Key As String, Optional ByVal ActivateMe As Boolean = False) + Dim a As Action = Sub() + Dim i% = LIST_PROFILES.Items.IndexOfKey(Key) + If i < 0 Then + i = Settings.Users.FindIndex(Function(u) u.Key = Key) + If i >= 0 Then + UserListUpdate(Settings.Users(i), True) + i = LIST_PROFILES.Items.IndexOfKey(Key) + End If + End If + If i >= 0 Then + LIST_PROFILES.Select() + LIST_PROFILES.SelectedIndices.Clear() + With LIST_PROFILES.Items(i) : .Selected = True : .Focused = True : End With + LIST_PROFILES.EnsureVisible(i) + If ActivateMe Then + If Visible Then BringToFront() Else Visible = True + End If + End If + End Sub + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke End Sub Friend Sub User_OnUserUpdated(ByVal User As IUserData) UserListUpdate(User, False) @@ -1179,7 +1197,7 @@ ResumeDownloadingOperation: If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke End Sub Private Sub NotificationMessage(ByVal Message As String) - If Settings.ShowNotifications Then TrayIcon.ShowBalloonTip(2000, TrayIcon.BalloonTipTitle, Message, ToolTipIcon.Info) + If Settings.ShowNotifications Then MainFrameObj.ShowNotification(Message) End Sub Private Sub BTT_PR_INFO_Click(sender As Object, e As EventArgs) Handles BTT_PR_INFO.Click If MyProgressForm.Visible Then MyProgressForm.BringToFront() Else MyProgressForm.Show() diff --git a/SCrawler/MainFrameObjects.vb b/SCrawler/MainFrameObjects.vb index 6d216df..73182ed 100644 --- a/SCrawler/MainFrameObjects.vb +++ b/SCrawler/MainFrameObjects.vb @@ -8,10 +8,13 @@ ' but WITHOUT ANY WARRANTY Imports SCrawler.API Imports SCrawler.API.Base +Imports PersonalUtilities.Tools.Notifications Friend Class MainFrameObjects Private ReadOnly Property MF As MainFrame + Private WithEvents Notificator As NotificationsManager Friend Sub New(ByRef f As MainFrame) MF = f + Notificator = New NotificationsManager End Sub Friend Sub ImageHandler(ByVal User As IUserData) ImageHandler(User, False) @@ -34,11 +37,30 @@ Friend Class MainFrameObjects Catch ex As Exception End Try End Sub - Friend Sub Focus() + Friend Sub Focus(Optional ByVal Show As Boolean = False) + If Not MF.Visible And Show Then MF.Show() If MF.Visible Then MF.BringToFront() : MF.Activate() End Sub Friend Sub ChangeCloseVisible() Dim a As Action = Sub() MF.BTT_TRAY_CLOSE_NO_SCRIPT.Visible = Settings.ClosingCommand.Attribute And Not Settings.ClosingCommand.IsEmptyString If MF.TRAY_CONTEXT.InvokeRequired Then MF.TRAY_CONTEXT.Invoke(a) Else a.Invoke End Sub + Friend Overloads Sub ShowNotification(ByVal Message As String) + MF.TrayIcon.ShowBalloonTip(2000, MF.TrayIcon.BalloonTipTitle, Message, ToolTipIcon.Info) + End Sub + Friend Overloads Sub ShowNotification(ByVal Message As String, ByVal Title As String) + MF.TrayIcon.ShowBalloonTip(2000, Title, Message, ToolTipIcon.Info) + End Sub + Friend Overloads Sub ShowNotification(ByVal Message As String, ByVal Title As String, ByVal Icon As ToolTipIcon) + MF.TrayIcon.ShowBalloonTip(2000, Title, Message, Icon) + End Sub + Friend Sub CLearNotifications() + Notificator.Clear() + End Sub + Private Sub Notificator_OnClicked(ByVal Key As String) Handles Notificator.OnClicked + If Settings.Automation Is Nothing OrElse Not Settings.Automation.NotificationClicked(Key) Then + If Not MF.Visible Then MF.Show() + Focus() + End If + End Sub End Class \ No newline at end of file diff --git a/SCrawler/MainMod.vb b/SCrawler/MainMod.vb index 0c5f8dc..e7d117d 100644 --- a/SCrawler/MainMod.vb +++ b/SCrawler/MainMod.vb @@ -22,6 +22,7 @@ Friend Module MainMod Friend Const SettingsFolderName As String = "Settings" Friend ReadOnly LinkPattern As RParams = RParams.DMS("[htps:]{0,6}[/]{0,2}(.+)", 1) Friend ReadOnly FilesPattern As RParams = RParams.DM("[^\./]+?\.\w+", 1, EDP.ReturnValue) + Friend Delegate Sub NotificationEventHandler(ByVal Message As String) Friend Const LVI_TempOption As String = "Temp" Friend Const LVI_FavOption As String = "Favorite" Friend Const CannelsLabelName As String = "Channels" diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb index 0c86b2e..80df32c 100644 --- a/SCrawler/My Project/AssemblyInfo.vb +++ b/SCrawler/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb b/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb index 022ad31..597eae9 100644 --- a/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb +++ b/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb @@ -310,9 +310,9 @@ Namespace Plugin.Hosts Private _AvailableValue As Boolean = True Private _AvailableAsked As Boolean = False Private _ActiveTaskCount As Integer = 0 - Friend Function Available(ByVal What As Download) As Boolean + Friend Function Available(ByVal What As Download, ByVal Silent As Boolean) As Boolean If Not _AvailableAsked Then - _AvailableValue = Source.Available(What) + _AvailableValue = Source.Available(What, Silent) _AvailableAsked = True End If Return _AvailableValue diff --git a/SCrawler/SCrawler.vbproj b/SCrawler/SCrawler.vbproj index e99b93f..652e263 100644 --- a/SCrawler/SCrawler.vbproj +++ b/SCrawler/SCrawler.vbproj @@ -160,15 +160,26 @@ Form + + + AutoDownloaderEditorForm.vb + + + Form + + + Component + GroupEditorForm.vb Form + @@ -313,6 +324,9 @@ ChannelViewForm.vb + + AutoDownloaderEditorForm.vb + DownloadedInfoForm.vb @@ -374,6 +388,10 @@ + + {fc532253-1ab3-4def-a28a-dfdd9a481eb2} + PersonalUtilities.Notifications + {8405896b-2685-4916-bc93-1fb514c323a9} PersonalUtilities diff --git a/SCrawler/SettingsCLS.vb b/SCrawler/SettingsCLS.vb index 752990d..0a53473 100644 --- a/SCrawler/SettingsCLS.vb +++ b/SCrawler/SettingsCLS.vb @@ -34,6 +34,7 @@ Friend Class SettingsCLS : Implements IDisposable Friend Property Channels As Reddit.ChannelsCollection Friend ReadOnly Property Labels As LabelsKeeper Friend ReadOnly Property Groups As Groups.DownloadGroupCollection + Friend Property Automation As AutoDownloader Friend ReadOnly Property BlackList As List(Of UserBan) Private ReadOnly BlackListFile As SFile = $"{SettingsFolderName}\BlackList.txt" Private ReadOnly UsersSettingsFile As SFile = $"{SettingsFolderName}\Users.xml" @@ -477,6 +478,7 @@ Friend Class SettingsCLS : Implements IDisposable Channels.Dispose() DeleteCachePath() End If + If Not Automation Is Nothing Then Automation.Dispose() Plugins.Clear() Users.ListClearDispose UsersList.Clear()