Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b64e5563b | ||
|
|
1bc048578d | ||
|
|
5d5ce29f36 | ||
|
|
2a2fc45a91 | ||
|
|
b17e6ac40a | ||
|
|
301f2a6b03 | ||
|
|
fd72ba0e2a | ||
|
|
9146b16cfa | ||
|
|
523794d210 | ||
|
|
f1ba2ecd77 | ||
|
|
7da1ccf1ae | ||
|
|
751005284d | ||
|
|
aa824138e2 | ||
|
|
0cacba4144 | ||
|
|
69ded7b400 | ||
|
|
4db7a74e1a | ||
|
|
5f2c4476ad | ||
|
|
adc563eb6b | ||
|
|
1c67d18cd2 | ||
|
|
67c4b25d22 | ||
|
|
70e73c7d97 | ||
|
|
4acef31c99 | ||
|
|
55a28a7d89 |
13
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
|
patreon: # Replace with a single Patreon username
|
||||||
|
open_collective: # Replace with a single Open Collective username
|
||||||
|
ko_fi: andyprogram
|
||||||
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
|
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||||
|
liberapay: # Replace with a single Liberapay username
|
||||||
|
issuehunt: # Replace with a single IssueHunt username
|
||||||
|
otechie: # Replace with a single Otechie username
|
||||||
|
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||||
|
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||||
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: "[BUG]"
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Do something
|
||||||
|
2. See error
|
||||||
|
|
||||||
|
**Log data**
|
||||||
|
If the program log contains any data.
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Release information (please complete the following information):**
|
||||||
|
- Architecture [e.g. x86, x64]
|
||||||
|
- Version [e.g. 2.0.0.0]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
10
.github/ISSUE_TEMPLATE/custom.md
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
name: Custom issue template
|
||||||
|
about: Describe this issue template's purpose here.
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: "[REQUEST]"
|
||||||
|
labels: enhancement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
41
CONTRIBUTING.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Contributor's Guide
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
**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.** [](https://ko-fi.com/andyprogram)
|
||||||
|
|
||||||
|
|
||||||
|
# Sites I will never develop
|
||||||
|
|
||||||
|
- Facebook
|
||||||
|
|
||||||
|
# Sites requested by users
|
||||||
|
|
||||||
|
- TikTok
|
||||||
|
- API for receiving data without authorization was not found. Therefore, I don't have time to start developing this site parsing algorithm. If anyone knows of requests that may collect data without OAuth authentication, please let me know.
|
||||||
|
|
||||||
|
# Contact me
|
||||||
|
|
||||||
|
[](https://matrix.to/#/@andyprogram:matrix.org)
|
||||||
119
Changelog.md
@@ -1,3 +1,122 @@
|
|||||||
|
# 2.0.0.4
|
||||||
|
|
||||||
|
**Removed compatibility of program settings with version 1.0.0.4 and lower.**
|
||||||
|
|
||||||
|
**If your program version is 1.0.0.4 and lower, it is strongly recommended that you upgrade to release 2.0.0.1 to update the program settings (and run the program). Then update to this release. Otherwise, you will have to configure the program settings again**
|
||||||
|
|
||||||
|
**If your program version is 1.0.1.0 or higher, you should not pay attention to this message.**
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- Ability to specify the path to store saved posts
|
||||||
|
- Fixed
|
||||||
|
- **Error when specifying network paths**
|
||||||
|
- Minor bugs
|
||||||
|
|
||||||
|
# 2.0.0.3
|
||||||
|
|
||||||
|
**Removed compatibility of program settings with version 1.0.0.4 and lower.**
|
||||||
|
|
||||||
|
**If your program version is 1.0.0.4 and lower, it is strongly recommended that you upgrade to release 2.0.0.1 to update the program settings (and run the program). Then update to this release. Otherwise, you will have to configure the program settings again**
|
||||||
|
|
||||||
|
**If your program version is 1.0.1.0 or higher, you should not pay attention to this message.**
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- The "Get User Media Only" setting is now available for Reddit. If checked then "CrossPosts" will be skipped, otherwise "CrossPosts" will be included.
|
||||||
|
- Fixed
|
||||||
|
- In some cases, the program did not parse all Reddit posts.
|
||||||
|
- Collection ignored when validated when creating a new user
|
||||||
|
- Incorrect number of Instagram profiles downloads per session
|
||||||
|
|
||||||
|
# 2.0.0.2
|
||||||
|
|
||||||
|
**This is the last release that supports program settings of version 1.0.0.4 and lower. Compatibility of program settings with version 1.0.0.4 and lower will be removed in future releases. It is strongly recommended that you upgrade to this release before future releases. Otherwise, you will have to configure the program settings again. If your program version is 1.0.1.0 or higher, you should not pay attention to this message.**
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- Tray icon
|
||||||
|
- Close program to tray
|
||||||
|
- Close confirmation dialog
|
||||||
|
- **Separated thread for downloading Instagram profiles**
|
||||||
|
- **Wait timers to bypass Instagram error "Too Many Requests" (429)**
|
||||||
|
- **Downloading saved Instagram posts** *(requires a second InstaHash)*
|
||||||
|
- Downloading saved posts (from Reddit and Instagram) form
|
||||||
|
- Tray notification when download is complete (Instagram notification separate from other)
|
||||||
|
- Downloading not downloaded Instagram posts when a 429 error is encountered and/or the user stops downloading
|
||||||
|
- Separate progress bar for downloading Instagram profiles
|
||||||
|
- Clear information about downloaded profiles of the current session in the "Download info form"
|
||||||
|
- Increased the number of Instagram posts (from 12 to 50) received per request
|
||||||
|
- Channels' statistics
|
||||||
|
- **RedGifs profiles support**
|
||||||
|
- Fixed
|
||||||
|
- The program was showing incorrect information about the total numbers of images and videos downloaded when a Reddit user was created from a channel
|
||||||
|
|
||||||
|
# 2.0.0.1
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- Download individual Imgur media files (use the "Download video" form).
|
||||||
|
- Fixed
|
||||||
|
- Incorrect filling of user parameters in the user creation form
|
||||||
|
- In some cases, the global settings cannot be saved.
|
||||||
|
|
||||||
|
# 2.0.0.0
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- **Instagram**
|
||||||
|
- Filter by site
|
||||||
|
- Group for regular channels in the main window
|
||||||
|
- Ability to change user/collection path
|
||||||
|
- Imgur albums downloading
|
||||||
|
- NSFW Imgur content bypass (requires 'ClientID')
|
||||||
|
- Special user folder
|
||||||
|
- Remove user while keeping data
|
||||||
|
- Disabled overriding user preferences when creating a new user if it already exists in the destination (in case of deleting a user with saving data).
|
||||||
|
- **Saved Reddit posts downloading**
|
||||||
|
- Fixed
|
||||||
|
- Suspended profiles do not change status if the profile is no longer suspended
|
||||||
|
- Limited download for Twitter not implemented
|
||||||
|
|
||||||
|
# 1.0.1.0
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- Extended site settings
|
||||||
|
- Non-existend users will be marked in red
|
||||||
|
- Suspended users' profiles will be marked in yellow
|
||||||
|
- Automatically disable 'Ready for download' if user does not exist.
|
||||||
|
- Ability to disable MD5 check when downloading regular (added to the main window) channels
|
||||||
|
- Ability to create a user from a channel with the default option 'Ready to download' (setting in the 'Settings')
|
||||||
|
- Ability to change default 'Temporary' parameter on create a user from a channel (setting in the 'Settings')
|
||||||
|
- Advanced defaults for each site (download images, download videos and temporary)
|
||||||
|
- By checking the 'Temporary' checkbox in the user creation form, the 'Ready for download' checkbox became unchecked
|
||||||
|
- Automatically disable 'Ready for download' if profile does not exists or has been deleted
|
||||||
|
- Change
|
||||||
|
- Removed extended twitter invalid credentials error and replaced with a simple line in the log
|
||||||
|
- Redesigned settings form
|
||||||
|
- Fixed
|
||||||
|
- In some cases, the image of the channel post is not copied to the user's folder
|
||||||
|
- Users in the main window are not refreshed if new users are added by a list that includes banned and/or unrecognized users.
|
||||||
|
- Minor bugs
|
||||||
|
|
||||||
|
# 1.0.0.4
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- Full channels support (you can now add channel (subreddit) for standard download)
|
||||||
|
- ```Ready for download``` now available for collections and can be changed for multiple user
|
||||||
|
- Fixed
|
||||||
|
- Images hosted on Imgur won't download
|
||||||
|
|
||||||
|
# 1.0.0.3
|
||||||
|
|
||||||
|
- Fixed
|
||||||
|
- Custom "Download videos" option is not saved
|
||||||
|
- The "Download all" button is not activated after changing modes
|
||||||
|
|
||||||
|
# 1.0.0.2
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- Ability to choose what types of media you want to download (images only, videos only, both)
|
||||||
|
- Ability to name files by date
|
||||||
|
- Fixed
|
||||||
|
- In some cases, the "Stop" button is not activated after download start
|
||||||
|
|
||||||
# 1.0.0.1
|
# 1.0.0.1
|
||||||
|
|
||||||
- Added
|
- Added
|
||||||
|
|||||||
674
LICENSE
Normal file
@@ -0,0 +1,674 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
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; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||||
79
README.md
@@ -1,60 +1,103 @@
|
|||||||
# Social networks crawler
|
# Social networks crawler
|
||||||
|
|
||||||
Program for downloading photo and video from Reddit and Twitter
|
[](https://github.com/AAndyProgram/SCrawler/releases/latest)
|
||||||
|
[](https://github.com/AAndyProgram/SCrawler/)
|
||||||
|
|
||||||
Enjoying the tool? Considering adding to my coffee fund :)
|
A program to download photo and video from Reddit, Twitter, Instagram, [etc](#supported-sites).
|
||||||
|
|
||||||
|
Do you like this program? Consider adding to my coffee fund by making a donation to show your support. :)
|
||||||
|
|
||||||
[](https://ko-fi.com/andyprogram)
|
[](https://ko-fi.com/andyprogram)
|
||||||
|
|
||||||
# What can program do:
|
# What can program do:
|
||||||
- Download pictures and videos from users' profiles:
|
- Download pictures and videos from users' profiles and subreddits:
|
||||||
- Reddit images;
|
- Reddit images;
|
||||||
- Reddit galleries of images;
|
- Reddit galleries of images;
|
||||||
- Redgifs hosted videos (https://www.redgifs.com/);
|
- Redgifs hosted videos (https://www.redgifs.com/);
|
||||||
- Reddit hosted videos (downloading Reddit hosted video is going through ffmpeg);
|
- Reddit hosted videos (downloading Reddit hosted video is going through ffmpeg (**ffmpeg only works with the x64 program**));
|
||||||
- Twitter images;
|
- Twitter images and videos;
|
||||||
- Twitter videos.
|
- Instagram images and videos.
|
||||||
- Parse channel and view data.
|
- Parse [channel and view data](https://github.com/AAndyProgram/SCrawler/wiki/Channels).
|
||||||
|
- Download [saved Reddit and Instagram posts](https://github.com/AAndyProgram/SCrawler/wiki/Home#saved-posts).
|
||||||
- Add users from parsed channel.
|
- Add users from parsed channel.
|
||||||
- Labeling users.
|
- Labeling users.
|
||||||
- Filter exists users by label or group.
|
- Filter exists users by label or group.
|
||||||
|
- Selection of media types you want to download (images only, videos only, both)
|
||||||
|
|
||||||
|
# Supported sites
|
||||||
|
|
||||||
|
- Reddit
|
||||||
|
- Twitter
|
||||||
|
- Instagram
|
||||||
|
- RedGifs
|
||||||
|
- Imgur
|
||||||
|
|
||||||
# How does it works:
|
# How does it works:
|
||||||
|
|
||||||
## Reddit
|
## Reddit
|
||||||
|
|
||||||
The program parsing all user's posts, gathering pictures' MD5 hash and compare with existing for remove duplicates. Then media will be downloaded.
|
The program parses all user posts, obtain MD5 images hash and compares them with existing ones to remove duplicates. Then the media will be downloaded.
|
||||||
|
|
||||||
## Twitter
|
## Other sites
|
||||||
|
|
||||||
The program parsing all user's posts and compare file names with existing for remove duplicates. Then media will be downloaded.
|
The program parses all user posts and compares file names with existing ones to remove duplicates. Then the media will be downloaded.
|
||||||
|
|
||||||
|
You can read about Instagram restrictions [here](https://github.com/AAndyProgram/SCrawler/wiki/Settings#instagram-limits)
|
||||||
|
|
||||||
|
## How to request a new site
|
||||||
|
|
||||||
|
Read [here](https://github.com/AAndyProgram/SCrawler/blob/main/CONTRIBUTING.md#how-to-request-a-new-site) about
|
||||||
|
|
||||||
# Requirements:
|
# Requirements:
|
||||||
|
|
||||||
- Windows 7, 8, 9, 10, 11 with NET Framework 4.6.1 or higher
|
- Windows 7, 8, 9, 10, 11 with NET Framework 4.6.1 or higher
|
||||||
- Authorization cookies and tokens for Twitter (if you want to download data from Twitter)
|
- Authorization cookies and tokens for Twitter (if you want to download data from Twitter)
|
||||||
- ffmpeg library for download Reddit hosted videos (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))
|
- Authorization cookies Instagram (if you want to download data from Instagram)
|
||||||
- Don't put program in the ```Program Files``` system folder (this is portable program and program settings are stored in the program folder)
|
- 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.**
|
||||||
- Just unpack program archive in any folder you want, copy ```ffmpeg.exe``` into and enjoy. :-)
|
- **Don't put program in the ```Program Files``` system folder (this is portable program and program settings are stored in the program folder)**
|
||||||
|
- **Just unzip the program archive to any folder, copy the file ```ffmpeg.exe``` into it and enjoy. :)**
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Updating
|
||||||
|
|
||||||
|
Just download [latest](https://github.com/AAndyProgram/SCrawler/releases/latest) version and unpack it into the program folder. Before starting a new version, I recommend making a backup copy of the program settings folder.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Settings and usage
|
# Settings and usage
|
||||||
|
|
||||||
The program has an intuitive interface.
|
The program has an intuitive interface.
|
||||||
|
|
||||||
Just add user profile and press ```Start downloading``` button.
|
Just add a user profile and click the ```Start downloading``` button.
|
||||||
|
|
||||||
Users can be added by patterns:
|
You can add users by patterns:
|
||||||
|
- https://www.instagram.com/SomeUserName
|
||||||
- https://twitter.com/SomeUserName
|
- https://twitter.com/SomeUserName
|
||||||
- https://reddit.com/user/SomeUserName
|
- https://reddit.com/user/SomeUserName
|
||||||
|
- https://reddit.com/r/SomeSubredditName
|
||||||
|
- https://www.redgifs.com/users/SomeUserName
|
||||||
- u/SomeUserName
|
- u/SomeUserName
|
||||||
- SomeUserName (in this case you must to choose user site)
|
- r/SomeSubredditName
|
||||||
|
- SomeUserName (in this case, you need to select the user's site)
|
||||||
|
- SomeSubredditName
|
||||||
|
|
||||||
More about users adding [here](https://github.com/AAndyProgram/SCrawler/wiki/Users)
|
Read more about adding users and subreddits [here](https://github.com/AAndyProgram/SCrawler/wiki/Users)
|
||||||
|
|
||||||
|
# Guide
|
||||||
|
|
||||||
**Full guide you can find [here](https://github.com/AAndyProgram/SCrawler/wiki)**
|
**Full guide you can find [here](https://github.com/AAndyProgram/SCrawler/wiki)**
|
||||||
|
|
||||||
## Using program as just video downloader
|
## Using program as just video downloader
|
||||||
|
|
||||||
Create a shortcut for the program. Open shortcut properties. On the ```Shortcut``` tab in ```Target``` field just add ```v``` at the end through the space.
|
Create a shortcut for the program. Open shortcut properties. In the ```Shortcut``` tab, in the ```Target``` field, just add the letter ```v``` at the end across the space.
|
||||||
|
|
||||||
Example: ```D:\Programs\SCrawler\SCrawler.exe v```
|
Example: ```D:\Programs\SCrawler\SCrawler.exe v```
|
||||||
|
|
||||||
|
# Contact me
|
||||||
|
|
||||||
|
[](https://matrix.to/#/@andyprogram:matrix.org)
|
||||||
|
|||||||
@@ -12,10 +12,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
|||||||
.gitignore = .gitignore
|
.gitignore = .gitignore
|
||||||
Changelog.md = Changelog.md
|
Changelog.md = Changelog.md
|
||||||
README.md = README.md
|
README.md = README.md
|
||||||
Info\RedditUrlsInfo.txt = Info\RedditUrlsInfo.txt
|
|
||||||
ToDo.txt = ToDo.txt
|
ToDo.txt = ToDo.txt
|
||||||
Info\TwitterNewAlgo.txt = Info\TwitterNewAlgo.txt
|
|
||||||
Info\TwitterUrlsInfo.txt = Info\TwitterUrlsInfo.txt
|
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
|
|||||||
126
SCrawler/.editorconfig
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
# To learn more about .editorconfig see https://aka.ms/editorconfigdocs
|
||||||
|
###############################
|
||||||
|
# Core EditorConfig Options #
|
||||||
|
###############################
|
||||||
|
root = true
|
||||||
|
# All files
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
# Code files
|
||||||
|
[*.{cs,csx,vb,vbx}]
|
||||||
|
indent_size = 4
|
||||||
|
insert_final_newline = false
|
||||||
|
charset = utf-8-bom
|
||||||
|
###############################
|
||||||
|
# .NET Coding Conventions #
|
||||||
|
###############################
|
||||||
|
[*.{cs,vb}]
|
||||||
|
# Organize usings
|
||||||
|
dotnet_sort_system_directives_first = true
|
||||||
|
# this. preferences
|
||||||
|
dotnet_style_qualification_for_field = false:silent
|
||||||
|
dotnet_style_qualification_for_property = false:silent
|
||||||
|
dotnet_style_qualification_for_method = false:silent
|
||||||
|
dotnet_style_qualification_for_event = false:silent
|
||||||
|
# Language keywords vs BCL types preferences
|
||||||
|
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
|
||||||
|
dotnet_style_predefined_type_for_member_access = true:silent
|
||||||
|
# Parentheses preferences
|
||||||
|
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
|
||||||
|
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
|
||||||
|
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
|
||||||
|
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
|
||||||
|
# Modifier preferences
|
||||||
|
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
|
||||||
|
dotnet_style_readonly_field = true:suggestion
|
||||||
|
# Expression-level preferences
|
||||||
|
dotnet_style_object_initializer = true:suggestion
|
||||||
|
dotnet_style_collection_initializer = true:suggestion
|
||||||
|
dotnet_style_explicit_tuple_names = true:suggestion
|
||||||
|
dotnet_style_null_propagation = true:suggestion
|
||||||
|
dotnet_style_coalesce_expression = true:suggestion
|
||||||
|
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent
|
||||||
|
dotnet_style_prefer_inferred_tuple_names = true:suggestion
|
||||||
|
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
|
||||||
|
dotnet_style_prefer_auto_properties = true:silent
|
||||||
|
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
|
||||||
|
dotnet_style_prefer_conditional_expression_over_return = true:silent
|
||||||
|
###############################
|
||||||
|
# Naming Conventions #
|
||||||
|
###############################
|
||||||
|
# Style Definitions
|
||||||
|
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
|
||||||
|
# Use PascalCase for constant fields
|
||||||
|
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
|
||||||
|
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
|
||||||
|
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
|
||||||
|
dotnet_naming_symbols.constant_fields.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
|
||||||
|
dotnet_naming_symbols.constant_fields.required_modifiers = const
|
||||||
|
###############################
|
||||||
|
# C# Coding Conventions #
|
||||||
|
###############################
|
||||||
|
[*.cs]
|
||||||
|
# var preferences
|
||||||
|
csharp_style_var_for_built_in_types = true:silent
|
||||||
|
csharp_style_var_when_type_is_apparent = true:silent
|
||||||
|
csharp_style_var_elsewhere = true:silent
|
||||||
|
# Expression-bodied members
|
||||||
|
csharp_style_expression_bodied_methods = false:silent
|
||||||
|
csharp_style_expression_bodied_constructors = false:silent
|
||||||
|
csharp_style_expression_bodied_operators = false:silent
|
||||||
|
csharp_style_expression_bodied_properties = true:silent
|
||||||
|
csharp_style_expression_bodied_indexers = true:silent
|
||||||
|
csharp_style_expression_bodied_accessors = true:silent
|
||||||
|
# Pattern matching preferences
|
||||||
|
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
|
||||||
|
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
|
||||||
|
# Null-checking preferences
|
||||||
|
csharp_style_throw_expression = true:suggestion
|
||||||
|
csharp_style_conditional_delegate_call = true:suggestion
|
||||||
|
# Modifier preferences
|
||||||
|
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
|
||||||
|
# Expression-level preferences
|
||||||
|
csharp_prefer_braces = true:silent
|
||||||
|
csharp_style_deconstructed_variable_declaration = true:suggestion
|
||||||
|
csharp_prefer_simple_default_expression = true:suggestion
|
||||||
|
csharp_style_pattern_local_over_anonymous_function = true:suggestion
|
||||||
|
csharp_style_inlined_variable_declaration = true:suggestion
|
||||||
|
###############################
|
||||||
|
# C# Formatting Rules #
|
||||||
|
###############################
|
||||||
|
# New line preferences
|
||||||
|
csharp_new_line_before_open_brace = all
|
||||||
|
csharp_new_line_before_else = true
|
||||||
|
csharp_new_line_before_catch = true
|
||||||
|
csharp_new_line_before_finally = false
|
||||||
|
csharp_new_line_before_members_in_object_initializers = true
|
||||||
|
csharp_new_line_before_members_in_anonymous_types = true
|
||||||
|
csharp_new_line_between_query_expression_clauses = true
|
||||||
|
# Indentation preferences
|
||||||
|
csharp_indent_case_contents = true
|
||||||
|
csharp_indent_switch_labels = true
|
||||||
|
csharp_indent_labels = flush_left
|
||||||
|
# Space preferences
|
||||||
|
csharp_space_after_cast = false
|
||||||
|
csharp_space_after_keywords_in_control_flow_statements = true
|
||||||
|
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_parentheses = false
|
||||||
|
csharp_space_before_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_after_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_around_binary_operators = before_and_after
|
||||||
|
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||||
|
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||||
|
# Wrapping preferences
|
||||||
|
csharp_preserve_single_line_statements = true
|
||||||
|
csharp_preserve_single_line_blocks = true
|
||||||
|
insert_final_newline=false
|
||||||
|
###############################
|
||||||
|
# VB Coding Conventions #
|
||||||
|
###############################
|
||||||
|
[*.vb]
|
||||||
|
# Modifier preferences
|
||||||
|
visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
|
||||||
|
file_header_template = Copyright (C) 2022 Andy\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see <https://www.gnu.org/licenses/>
|
||||||
13
SCrawler/API/Base/Declarations.vb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
' 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 API.Base
|
||||||
|
Friend Module Declarations
|
||||||
|
Friend ReadOnly LNC As New ListAddParams(LAP.NotContainsOnly)
|
||||||
|
End Module
|
||||||
|
End Namespace
|
||||||
@@ -1,6 +1,15 @@
|
|||||||
Imports PersonalUtilities.Tools
|
' 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.Tools
|
||||||
Imports PersonalUtilities.Functions.XML
|
Imports PersonalUtilities.Functions.XML
|
||||||
Imports PersonalUtilities.Functions.XML.Base
|
Imports PersonalUtilities.Functions.XML.Base
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Namespace API.Base
|
Namespace API.Base
|
||||||
Friend Class SiteSettings : Implements IDisposable
|
Friend Class SiteSettings : Implements IDisposable
|
||||||
Friend Const Header_Twitter_Authorization As String = "authorization"
|
Friend Const Header_Twitter_Authorization As String = "authorization"
|
||||||
@@ -8,17 +17,94 @@ Namespace API.Base
|
|||||||
Friend ReadOnly Site As Sites
|
Friend ReadOnly Site As Sites
|
||||||
Friend ReadOnly Responser As WEB.Response
|
Friend ReadOnly Responser As WEB.Response
|
||||||
Private ReadOnly _Path As XMLValue(Of SFile)
|
Private ReadOnly _Path As XMLValue(Of SFile)
|
||||||
Friend Property Path As SFile
|
Friend Property Path(Optional ByVal SetProp As Boolean = True) As SFile
|
||||||
Get
|
Get
|
||||||
If _Path.IsEmptyString Then _Path.Value = SFile.GetPath($"{Settings.GlobalPath.Value.PathWithSeparator}{Site}")
|
If _Path.IsEmptyString Then
|
||||||
|
Dim tmpPath As SFile = SFile.GetPath($"{Settings.GlobalPath.Value.PathWithSeparator}{Site}")
|
||||||
|
If SetProp Then _Path.Value = tmpPath Else Return tmpPath
|
||||||
|
End If
|
||||||
Return _Path.Value
|
Return _Path.Value
|
||||||
End Get
|
End Get
|
||||||
Set(ByVal NewFile As SFile)
|
Set(ByVal NewPath As SFile)
|
||||||
_Path.Value = NewFile
|
_Path.Value = NewPath
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
|
Private ReadOnly _SavedPostsPath As XMLValue(Of SFile)
|
||||||
|
Friend Property SavedPostsPath(Optional ByVal GetAny As Boolean = True) As SFile
|
||||||
|
Get
|
||||||
|
If Not _SavedPostsPath.Value.IsEmptyString Then
|
||||||
|
Return _SavedPostsPath.Value
|
||||||
|
Else
|
||||||
|
If GetAny Then
|
||||||
|
Return $"{Path.PathNoSeparator}\!Saved\"
|
||||||
|
Else
|
||||||
|
Return Nothing
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End Get
|
||||||
|
Set(ByVal NewPath As SFile)
|
||||||
|
_SavedPostsPath.Value = NewPath
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
#Region "Instagram"
|
||||||
|
Friend ReadOnly Property InstaHash As XMLValue(Of String)
|
||||||
|
Friend ReadOnly Property InstaHash_SP As XMLValue(Of String)
|
||||||
|
Friend ReadOnly Property InstaHashUpdateRequired As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property InstagramDownloadingErrorDate As XMLValue(Of Date)
|
||||||
|
Friend Property InstagramLastApplyingValue As Integer? = Nothing
|
||||||
|
Friend ReadOnly Property InstagramReadyForDownload As Boolean
|
||||||
|
Get
|
||||||
|
With InstagramDownloadingErrorDate
|
||||||
|
If .ValueF.Exists Then
|
||||||
|
Return .ValueF.Value.AddMinutes(If(InstagramLastApplyingValue, 10)) < Now
|
||||||
|
Else
|
||||||
|
Return True
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Friend ReadOnly Property InstagramLastDownloadDate As XMLValue(Of Date)
|
||||||
|
Friend ReadOnly Property InstagramLastRequestsCount As XMLValue(Of Integer)
|
||||||
|
Private InstagramTooManyRequestsReadyForCatch As Boolean = True
|
||||||
|
Friend Function GetInstaWaitDate() As Date
|
||||||
|
With InstagramDownloadingErrorDate
|
||||||
|
If .ValueF.Exists Then
|
||||||
|
Return .ValueF.Value.AddMinutes(If(InstagramLastApplyingValue, 10))
|
||||||
|
Else
|
||||||
|
Return Now
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End Function
|
||||||
|
Friend Sub InstagramTooManyRequests(ByVal Catched As Boolean)
|
||||||
|
With InstagramDownloadingErrorDate
|
||||||
|
If Catched Then
|
||||||
|
If Not .ValueF.Exists Then
|
||||||
|
.Value = Now
|
||||||
|
If InstagramTooManyRequestsReadyForCatch Then
|
||||||
|
InstagramLastApplyingValue = If(InstagramLastApplyingValue, 0) + 10
|
||||||
|
InstagramTooManyRequestsReadyForCatch = False
|
||||||
|
MyMainLOG = $"Instagram downloading error: too many requests. Try again after {If(InstagramLastApplyingValue, 10)} minutes..."
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
.ValueF = Nothing
|
||||||
|
InstagramLastApplyingValue = Nothing
|
||||||
|
InstagramTooManyRequestsReadyForCatch = True
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End Sub
|
||||||
|
Friend ReadOnly Property RequestsWaitTimer As XMLValue(Of Integer)
|
||||||
|
Friend ReadOnly Property RequestsWaitTimerTaskCount As XMLValue(Of Integer)
|
||||||
|
Friend ReadOnly Property SleepTimerOnPostsLimit As XMLValue(Of Integer)
|
||||||
|
#End Region
|
||||||
|
Friend ReadOnly Property Temporary As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property DownloadImages As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property DownloadVideos As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property GetUserMediaOnly As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property SavedPostsUserName As XMLValue(Of String)
|
||||||
Private ReadOnly SettingsFile As SFile
|
Private ReadOnly SettingsFile As SFile
|
||||||
Friend Sub New(ByVal s As Sites, ByRef _XML As XmlFile, ByVal GlobalPath As SFile)
|
Friend Sub New(ByVal s As Sites, ByRef _XML As XmlFile, ByVal GlobalPath As SFile,
|
||||||
|
ByRef _Temp As XMLValue(Of Boolean), ByRef _Imgs As XMLValue(Of Boolean), ByRef _Vids As XMLValue(Of Boolean))
|
||||||
Site = s
|
Site = s
|
||||||
SettingsFile = $"{SettingsFolderName}\Responser_{s}.xml"
|
SettingsFile = $"{SettingsFolderName}\Responser_{s}.xml"
|
||||||
Responser = New WEB.Response(SettingsFile)
|
Responser = New WEB.Response(SettingsFile)
|
||||||
@@ -26,37 +112,112 @@ Namespace API.Base
|
|||||||
If SettingsFile.Exists Then
|
If SettingsFile.Exists Then
|
||||||
Responser.LoadSettings()
|
Responser.LoadSettings()
|
||||||
Else
|
Else
|
||||||
If Site = Sites.Twitter Then
|
Select Case Site
|
||||||
With Responser
|
Case Sites.Twitter
|
||||||
.ContentType = "application/json"
|
With Responser
|
||||||
.Accept = "*/*"
|
.ContentType = "application/json"
|
||||||
.CookiesDomain = "twitter.com"
|
.Accept = "*/*"
|
||||||
.Decoders.Add(SymbolsConverter.Converters.Unicode)
|
.CookiesDomain = "twitter.com"
|
||||||
With .Headers
|
.Decoders.Add(SymbolsConverter.Converters.Unicode)
|
||||||
.Add("sec-ch-ua", " Not;A Brand" & Chr(34) & ";v=" & Chr(34) & "99" & Chr(34) & ", " & Chr(34) &
|
With .Headers
|
||||||
"Google Chrome" & Chr(34) & ";v=" & Chr(34) & "91" & Chr(34) & ", " & Chr(34) & "Chromium" &
|
.Add("sec-ch-ua", " Not;A Brand" & Chr(34) & ";v=" & Chr(34) & "99" & Chr(34) & ", " & Chr(34) &
|
||||||
Chr(34) & ";v=" & Chr(34) & "91" & Chr(34))
|
"Google Chrome" & Chr(34) & ";v=" & Chr(34) & "91" & Chr(34) & ", " & Chr(34) & "Chromium" &
|
||||||
.Add("sec-ch-ua-mobile", "?0")
|
Chr(34) & ";v=" & Chr(34) & "91" & Chr(34))
|
||||||
.Add("sec-fetch-dest", "empty")
|
.Add("sec-ch-ua-mobile", "?0")
|
||||||
.Add("sec-fetch-mode", "cors")
|
.Add("sec-fetch-dest", "empty")
|
||||||
.Add("sec-fetch-site", "same-origin")
|
.Add("sec-fetch-mode", "cors")
|
||||||
.Add(Header_Twitter_Token, String.Empty)
|
.Add("sec-fetch-site", "same-origin")
|
||||||
.Add("x-twitter-active-user", "yes")
|
.Add(Header_Twitter_Token, String.Empty)
|
||||||
.Add("x-twitter-auth-type", "OAuth2Session")
|
.Add("x-twitter-active-user", "yes")
|
||||||
.Add(Header_Twitter_Authorization, String.Empty)
|
.Add("x-twitter-auth-type", "OAuth2Session")
|
||||||
|
.Add(Header_Twitter_Authorization, String.Empty)
|
||||||
|
End With
|
||||||
End With
|
End With
|
||||||
End With
|
Case Sites.Reddit
|
||||||
ElseIf Site = Sites.Reddit Then
|
Responser.CookiesDomain = "reddit.com"
|
||||||
Responser.CookiesDomain = "reddit.com"
|
Responser.Decoders.Add(SymbolsConverter.Converters.Unicode)
|
||||||
Responser.Decoders.Add(SymbolsConverter.Converters.Unicode)
|
Case Sites.Instagram : Responser.CookiesDomain = "instagram.com"
|
||||||
End If
|
Case Sites.RedGifs : Responser.CookiesDomain = "redgifs.com"
|
||||||
|
End Select
|
||||||
Responser.SaveSettings()
|
Responser.SaveSettings()
|
||||||
End If
|
End If
|
||||||
_Path = New XMLValue(Of SFile)("Path", SFile.GetPath($"{GlobalPath.PathWithSeparator}{Site}"), _XML, {Site.ToString}, XMLValue(Of SFile).ToFilePath)
|
|
||||||
|
Dim n() As String = {SettingsCLS.Name_Node_Sites, Site.ToString}
|
||||||
|
_Path = New XMLValue(Of SFile)("Path",, _XML, n, XMLValue(Of SFile).ToFilePath)
|
||||||
|
_XML.Remove(Site.ToString)
|
||||||
|
|
||||||
|
Temporary = New XMLValue(Of Boolean)
|
||||||
|
Temporary.SetExtended("Temporary", False, _XML, n)
|
||||||
|
Temporary.SetDefault(_Temp)
|
||||||
|
|
||||||
|
DownloadImages = New XMLValue(Of Boolean)
|
||||||
|
DownloadImages.SetExtended("DownloadImages", True, _XML, n)
|
||||||
|
DownloadImages.SetDefault(_Imgs)
|
||||||
|
|
||||||
|
DownloadVideos = New XMLValue(Of Boolean)
|
||||||
|
DownloadVideos.SetExtended("DownloadVideos", True, _XML, n)
|
||||||
|
DownloadVideos.SetDefault(_Vids)
|
||||||
|
|
||||||
|
GetUserMediaOnly = New XMLValue(Of Boolean)("GetUserMediaOnly", True, _XML, n)
|
||||||
|
_SavedPostsPath = New XMLValue(Of SFile)("SavedPostsPath",, _XML, n, XMLValue(Of SFile).ToFilePath)
|
||||||
|
|
||||||
|
CreateProp(InstaHashUpdateRequired, Sites.Instagram, "InstaHashUpdateRequired", True, _XML, n)
|
||||||
|
CreateProp(InstaHash, Sites.Instagram, "InstaHash", String.Empty, _XML, n)
|
||||||
|
If Site = Sites.Instagram AndAlso (InstaHash.IsEmptyString Or InstaHashUpdateRequired) AndAlso Responser.Cookies.ListExists Then GatherInstaHash()
|
||||||
|
CreateProp(InstaHash_SP, Sites.Instagram, "InstaHashSavedPosts", String.Empty, _XML, n)
|
||||||
|
CreateProp(InstagramLastDownloadDate, Sites.Instagram, "LastDownloadDate", Now.AddDays(-1), _XML, n)
|
||||||
|
CreateProp(InstagramLastRequestsCount, Sites.Instagram, "LastRequestsCount", 0, _XML, n)
|
||||||
|
CreateProp(RequestsWaitTimer, Sites.Instagram, "RequestsWaitTimer", 1000, _XML, n)
|
||||||
|
CreateProp(RequestsWaitTimerTaskCount, Sites.Instagram, "RequestsWaitTimerTaskCount", 1, _XML, n)
|
||||||
|
CreateProp(SleepTimerOnPostsLimit, Sites.Instagram, "SleepTimerOnPostsLimit", 60000, _XML, n)
|
||||||
|
If Site = Sites.Instagram Then
|
||||||
|
InstagramDownloadingErrorDate = New XMLValue(Of Date) With {.ToStringFunction = Function(ss, vv) AConvert(Of String)(vv, AModes.Var, Nothing)}
|
||||||
|
InstagramDownloadingErrorDate.SetExtended("InstagramDownloadingErrorDate", Now.AddYears(-10), _XML, n)
|
||||||
|
Else
|
||||||
|
InstagramDownloadingErrorDate = New XMLValue(Of Date)
|
||||||
|
End If
|
||||||
|
|
||||||
|
SavedPostsUserName = New XMLValue(Of String)("SavedPostsUserName", String.Empty, _XML, n)
|
||||||
|
End Sub
|
||||||
|
Private Sub CreateProp(Of T)(ByRef p As XMLValue(Of T), ByVal s As Sites,
|
||||||
|
ByVal p_Name As String, ByVal p_Value As T, ByRef x As XmlFile, ByVal n() As String)
|
||||||
|
If Site = s Then
|
||||||
|
p = New XMLValue(Of T)(p_Name, p_Value, x, n)
|
||||||
|
Else
|
||||||
|
p = New XMLValue(Of T)
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub Update()
|
Friend Sub Update()
|
||||||
Responser.SaveSettings()
|
Responser.SaveSettings()
|
||||||
End Sub
|
End Sub
|
||||||
|
Friend Function GatherInstaHash() As Boolean
|
||||||
|
Try
|
||||||
|
Dim rs As New RParams("=""([^""]+?ConsumerLibCommons[^""]+?.js)""", Nothing, 1) With {.MatchTimeOut = 10}
|
||||||
|
Dim r$ = Responser.GetResponse("https://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
|
||||||
|
InstaHash.Value = h
|
||||||
|
InstaHashUpdateRequired.Value = False
|
||||||
|
Return True
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Return False
|
||||||
|
Catch ex As Exception
|
||||||
|
InstaHashUpdateRequired.Value = True
|
||||||
|
InstaHash.Value = String.Empty
|
||||||
|
Return ErrorsDescriber.Execute(EDP.SendInLog + EDP.ReturnValue, ex, "[SiteSettings.GaterInstaHash]", False)
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
#Region "IDisposable Support"
|
#Region "IDisposable Support"
|
||||||
Private disposedValue As Boolean = False
|
Private disposedValue As Boolean = False
|
||||||
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
|
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
Namespace API.Base
|
' 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 API.Base
|
||||||
Friend Module Structures
|
Friend Module Structures
|
||||||
Friend Structure UserMedia : Implements IEquatable(Of UserMedia)
|
Friend Structure UserMedia : Implements IEquatable(Of UserMedia)
|
||||||
Friend Enum Types As Integer
|
Friend Enum Types As Integer
|
||||||
@@ -77,5 +85,21 @@
|
|||||||
Return v
|
Return v
|
||||||
End Function
|
End Function
|
||||||
End Structure
|
End Structure
|
||||||
|
Friend Structure Sizes : Implements IComparable(Of Sizes)
|
||||||
|
Friend Value As Integer
|
||||||
|
Friend Data As String
|
||||||
|
Friend ReadOnly HasError As Boolean
|
||||||
|
Friend Sub New(ByVal _Value As String, ByVal _Data As String)
|
||||||
|
Try
|
||||||
|
Value = _Value
|
||||||
|
Data = _Data
|
||||||
|
Catch ex As Exception
|
||||||
|
HasError = True
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Friend Function CompareTo(ByVal Other As Sizes) As Integer Implements IComparable(Of Sizes).CompareTo
|
||||||
|
Return Value.CompareTo(Other.Value) * -1
|
||||||
|
End Function
|
||||||
|
End Structure
|
||||||
End Module
|
End Module
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -1,13 +1,25 @@
|
|||||||
Imports PersonalUtilities.Functions.XML
|
' 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.Functions.XML
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
Imports System.IO
|
Imports System.IO
|
||||||
|
Imports System.Net
|
||||||
Imports System.Threading
|
Imports System.Threading
|
||||||
Imports UState = SCrawler.API.Base.UserMedia.States
|
Imports UStates = SCrawler.API.Base.UserMedia.States
|
||||||
|
Imports UTypes = SCrawler.API.Base.UserMedia.Types
|
||||||
Namespace API.Base
|
Namespace API.Base
|
||||||
Friend MustInherit Class UserDataBase : Implements IUserData
|
Friend MustInherit Class UserDataBase : Implements IUserData
|
||||||
Friend Const UserFileAppender As String = "User"
|
Friend Const UserFileAppender As String = "User"
|
||||||
Friend Event OnPictureUpdated As IUserData.OnPictureUpdatedEventHandler Implements IUserData.OnPictureUpdated
|
Friend Event OnUserUpdated As IUserData.OnUserUpdatedEventHandler Implements IUserData.OnUserUpdated
|
||||||
Protected Sub Raise_OnPictureUpdated()
|
Protected Sub Raise_OnUserUpdated()
|
||||||
RaiseEvent OnPictureUpdated(Me)
|
RaiseEvent OnUserUpdated(Me)
|
||||||
End Sub
|
End Sub
|
||||||
#Region "Collection buttons"
|
#Region "Collection buttons"
|
||||||
Friend WithEvents BTT_CONTEXT_DOWN As ToolStripMenuItem
|
Friend WithEvents BTT_CONTEXT_DOWN As ToolStripMenuItem
|
||||||
@@ -33,7 +45,10 @@ Namespace API.Base
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "XML Declarations"
|
#Region "XML Declarations"
|
||||||
Private Const Name_Site As String = "Site"
|
Private Const Name_Site As String = "Site"
|
||||||
|
Private Const Name_IsChannel As String = "IsChannel"
|
||||||
Private Const Name_UserName As String = "UserName"
|
Private Const Name_UserName As String = "UserName"
|
||||||
|
Private Const Name_UserExists As String = "UserExists"
|
||||||
|
Private Const Name_UserSuspended As String = "UserSuspended"
|
||||||
Private Const Name_FriendlyName As String = "FriendlyName"
|
Private Const Name_FriendlyName As String = "FriendlyName"
|
||||||
Private Const Name_UserID As String = "UserID"
|
Private Const Name_UserID As String = "UserID"
|
||||||
Private Const Name_Description As String = "Description"
|
Private Const Name_Description As String = "Description"
|
||||||
@@ -47,6 +62,8 @@ Namespace API.Base
|
|||||||
Private Const Name_LabelsName As String = "Labels"
|
Private Const Name_LabelsName As String = "Labels"
|
||||||
|
|
||||||
Private Const Name_ReadyForDownload As String = "ReadyForDownload"
|
Private Const Name_ReadyForDownload As String = "ReadyForDownload"
|
||||||
|
Private Const Name_DownloadImages As String = "DownloadImages"
|
||||||
|
Private Const Name_DownloadVideos As String = "DownloadVideos"
|
||||||
|
|
||||||
Private Const Name_VideoCount As String = "VideoCount"
|
Private Const Name_VideoCount As String = "VideoCount"
|
||||||
Private Const Name_PicturesCount As String = "PicturesCount"
|
Private Const Name_PicturesCount As String = "PicturesCount"
|
||||||
@@ -64,7 +81,19 @@ Namespace API.Base
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
Friend MustOverride Property Site As Sites Implements IContentProvider.Site
|
Friend MustOverride Property Site As Sites Implements IContentProvider.Site
|
||||||
|
Protected _Progress As MyProgress
|
||||||
|
Friend Overridable Property Progress As MyProgress
|
||||||
|
Get
|
||||||
|
If _Progress Is Nothing Then Return MainProgress Else Return _Progress
|
||||||
|
End Get
|
||||||
|
Set(ByVal p As MyProgress)
|
||||||
|
_Progress = p
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
Friend User As UserInfo
|
Friend User As UserInfo
|
||||||
|
Friend Property IsSavedPosts As Boolean
|
||||||
|
Friend Overridable Property UserExists As Boolean = True Implements IUserData.Exists
|
||||||
|
Friend Overridable Property UserSuspended As Boolean = False Implements IUserData.Suspended
|
||||||
Friend Overridable Property Name As String Implements IContentProvider.Name
|
Friend Overridable Property Name As String Implements IContentProvider.Name
|
||||||
Get
|
Get
|
||||||
Return User.Name
|
Return User.Name
|
||||||
@@ -129,7 +158,7 @@ Namespace API.Base
|
|||||||
Protected Function GetNullPicture(ByVal MaxHeigh As XML.Base.XMLValue(Of Integer)) As Bitmap
|
Protected Function GetNullPicture(ByVal MaxHeigh As XML.Base.XMLValue(Of Integer)) As Bitmap
|
||||||
Return New Bitmap(CInt(DivideWithZeroChecking(MaxHeigh.Value, 100) * 75), MaxHeigh.Value)
|
Return New Bitmap(CInt(DivideWithZeroChecking(MaxHeigh.Value, 100) * 75), MaxHeigh.Value)
|
||||||
End Function
|
End Function
|
||||||
Private Function GetPicture(Optional ByVal ReturnNullImageOnNothing As Boolean = True) As Image
|
Protected Function GetPicture(Optional ByVal ReturnNullImageOnNothing As Boolean = True) As Image
|
||||||
Dim f As SFile = Nothing
|
Dim f As SFile = Nothing
|
||||||
Dim p As UserImage = Nothing
|
Dim p As UserImage = Nothing
|
||||||
Dim DelPath As Boolean = True
|
Dim DelPath As Boolean = True
|
||||||
@@ -232,7 +261,9 @@ BlockNullPicture:
|
|||||||
#Region "Downloading params"
|
#Region "Downloading params"
|
||||||
Protected _DataLoaded As Boolean = False
|
Protected _DataLoaded As Boolean = False
|
||||||
Protected _DataParsed As Boolean = False
|
Protected _DataParsed As Boolean = False
|
||||||
Friend Property ReadyForDownload As Boolean = True Implements IUserData.ReadyForDownload
|
Friend Overridable Property ReadyForDownload As Boolean = True Implements IUserData.ReadyForDownload
|
||||||
|
Friend Property DownloadImages As Boolean = True Implements IUserData.DownloadImages
|
||||||
|
Friend Property DownloadVideos As Boolean = True Implements IUserData.DownloadVideos
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Content"
|
#Region "Content"
|
||||||
Protected ReadOnly _ContentList As List(Of UserMedia)
|
Protected ReadOnly _ContentList As List(Of UserMedia)
|
||||||
@@ -268,7 +299,7 @@ BlockNullPicture:
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Information"
|
#Region "Information"
|
||||||
Protected _CountVideo As Integer = 0
|
Protected _CountVideo As Integer = 0
|
||||||
Protected _CountPictures As Integer = 0
|
Protected Property _CountPictures As Integer = 0
|
||||||
Friend Overridable Property LastUpdated As Date?
|
Friend Overridable Property LastUpdated As Date?
|
||||||
Friend ReadOnly Property TotalContentCount As Integer
|
Friend ReadOnly Property TotalContentCount As Integer
|
||||||
Get
|
Get
|
||||||
@@ -310,17 +341,16 @@ BlockNullPicture:
|
|||||||
Dim luv$ = String.Empty
|
Dim luv$ = String.Empty
|
||||||
If LastUpdated.HasValue Then luv = $"{LastUpdated.Value.ToStringDate(ADateTime.Formats.BaseDateTime)}: "
|
If LastUpdated.HasValue Then luv = $"{LastUpdated.Value.ToStringDate(ADateTime.Formats.BaseDateTime)}: "
|
||||||
Return $"{luv}{Name} [{Site}]{IIf(HasError, " (with errors)", String.Empty)}: P - {_DownloadedPicturesTotal}; V - {_DownloadedVideosTotal}" &
|
Return $"{luv}{Name} [{Site}]{IIf(HasError, " (with errors)", String.Empty)}: P - {_DownloadedPicturesTotal}; V - {_DownloadedVideosTotal}" &
|
||||||
$" (P - {_CountPictures}; V - {_CountVideo})"
|
$" (P - {_CountPictures}; V - {_CountVideo})"
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
#End Region
|
#End Region
|
||||||
Protected ReadOnly LNC As New ListAddParams(LAP.NotContainsOnly)
|
|
||||||
#End Region
|
#End Region
|
||||||
#Region "LVI"
|
#Region "LVI"
|
||||||
Friend ReadOnly Property LVIKey As String Implements IUserData.LVIKey
|
Friend ReadOnly Property LVIKey As String Implements IUserData.LVIKey
|
||||||
Get
|
Get
|
||||||
If Not _IsCollection Then
|
If Not _IsCollection Then
|
||||||
Return $"{IIf(Site = Sites.Reddit, "R", "T")}_{Name}"
|
Return $"{Site.ToString.ToUpper}_{Name}"
|
||||||
Else
|
Else
|
||||||
Return $"CCCC_{CollectionName}"
|
Return $"CCCC_{CollectionName}"
|
||||||
End If
|
End If
|
||||||
@@ -342,14 +372,18 @@ BlockNullPicture:
|
|||||||
End Function
|
End Function
|
||||||
Friend Overridable ReadOnly Property FitToAddParams As Boolean Implements IUserData.FitToAddParams
|
Friend Overridable ReadOnly Property FitToAddParams As Boolean Implements IUserData.FitToAddParams
|
||||||
Get
|
Get
|
||||||
Select Case Settings.ShowingMode.Value
|
If Settings.SelectedSites.Count = 0 OrElse Settings.SelectedSites.Contains(Site) Then
|
||||||
Case ShowingModes.Regular : Return Not Temporary And Not Favorite
|
Select Case Settings.ShowingMode.Value
|
||||||
Case ShowingModes.Temporary : Return Temporary
|
Case ShowingModes.Regular : Return Not Temporary And Not Favorite
|
||||||
Case ShowingModes.Favorite : Return Favorite
|
Case ShowingModes.Temporary : Return Temporary
|
||||||
Case ShowingModes.Labels : Return Settings.Labels.CurrentSelection.ListContains(Labels)
|
Case ShowingModes.Favorite : Return Favorite
|
||||||
Case ShowingModes.NoLabels : Return Labels.Count = 0
|
Case ShowingModes.Labels : Return Settings.Labels.CurrentSelection.ListContains(Labels)
|
||||||
Case Else : Return True
|
Case ShowingModes.NoLabels : Return Labels.Count = 0
|
||||||
End Select
|
Case Else : Return True
|
||||||
|
End Select
|
||||||
|
Else
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Friend Function GetLVIGroup(ByVal Destination As ListView) As ListViewGroup Implements IUserData.GetLVIGroup
|
Friend Function GetLVIGroup(ByVal Destination As ListView) As ListViewGroup Implements IUserData.GetLVIGroup
|
||||||
@@ -364,7 +398,7 @@ BlockNullPicture:
|
|||||||
Return Destination.Groups.Item(LabelsKeeper.NoLabeledName)
|
Return Destination.Groups.Item(LabelsKeeper.NoLabeledName)
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
Return Destination.Groups.Item(GetLviGroupName(Site, Temporary, Favorite, IsCollection))
|
Return Destination.Groups.Item(GetLviGroupName(Site, Temporary, Favorite, IsCollection, IsChannel))
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Return Destination.Groups.Item(LabelsKeeper.NoLabeledName)
|
Return Destination.Groups.Item(LabelsKeeper.NoLabeledName)
|
||||||
@@ -405,8 +439,15 @@ BlockNullPicture:
|
|||||||
''' <exception cref="ArgumentOutOfRangeException"></exception>
|
''' <exception cref="ArgumentOutOfRangeException"></exception>
|
||||||
Friend Overloads Shared Function GetInstance(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True) As IUserData
|
Friend Overloads Shared Function GetInstance(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True) As IUserData
|
||||||
Select Case u.Site
|
Select Case u.Site
|
||||||
Case Sites.Reddit : Return New Reddit.UserData(u, _LoadUserInformation)
|
Case Sites.Reddit
|
||||||
|
If u.IsChannel Then
|
||||||
|
Return New Reddit.Channel(u, _LoadUserInformation)
|
||||||
|
Else
|
||||||
|
Return New Reddit.UserData(u, _LoadUserInformation)
|
||||||
|
End If
|
||||||
Case Sites.Twitter : Return New Twitter.UserData(u, _LoadUserInformation)
|
Case Sites.Twitter : Return New Twitter.UserData(u, _LoadUserInformation)
|
||||||
|
Case Sites.Instagram : Return New Instagram.UserData(u, _LoadUserInformation)
|
||||||
|
Case Sites.RedGifs : Return New RedGifs.UserData(u, _LoadUserInformation)
|
||||||
Case Else : Throw New ArgumentOutOfRangeException("Site", $"Site [{u.Site}] information does not recognized by loader")
|
Case Else : Throw New ArgumentOutOfRangeException("Site", $"Site [{u.Site}] information does not recognized by loader")
|
||||||
End Select
|
End Select
|
||||||
End Function
|
End Function
|
||||||
@@ -418,10 +459,11 @@ BlockNullPicture:
|
|||||||
If MyFile.Exists Then
|
If MyFile.Exists Then
|
||||||
FileExists = True
|
FileExists = True
|
||||||
Using x As New XmlFile(MyFile) With {.XmlReadOnly = True}
|
Using x As New XmlFile(MyFile) With {.XmlReadOnly = True}
|
||||||
x.DefaultsLoading(False)
|
|
||||||
User.Site = Site
|
User.Site = Site
|
||||||
Site = x.Value(Name_Site).FromXML(Of Integer)(0)
|
Site = x.Value(Name_Site).FromXML(Of Integer)(0)
|
||||||
User.Name = x.Value(Name_UserName)
|
User.Name = x.Value(Name_UserName)
|
||||||
|
UserExists = x.Value(Name_UserExists).FromXML(Of Boolean)(True)
|
||||||
|
UserSuspended = x.Value(Name_UserSuspended).FromXML(Of Boolean)(False)
|
||||||
ID = x.Value(Name_UserID)
|
ID = x.Value(Name_UserID)
|
||||||
FriendlyName = x.Value(Name_FriendlyName)
|
FriendlyName = x.Value(Name_FriendlyName)
|
||||||
UserDescription = x.Value(Name_Description)
|
UserDescription = x.Value(Name_Description)
|
||||||
@@ -429,14 +471,17 @@ BlockNullPicture:
|
|||||||
Temporary = x.Value(Name_Temporary).FromXML(Of Boolean)(False)
|
Temporary = x.Value(Name_Temporary).FromXML(Of Boolean)(False)
|
||||||
Favorite = x.Value(Name_Favorite).FromXML(Of Boolean)(False)
|
Favorite = x.Value(Name_Favorite).FromXML(Of Boolean)(False)
|
||||||
CreatedByChannel = x.Value(Name_CreatedByChannel).FromXML(Of Boolean)(False)
|
CreatedByChannel = x.Value(Name_CreatedByChannel).FromXML(Of Boolean)(False)
|
||||||
SeparateVideoFolder = AConvert(Of Boolean)(x.Value(Name_SeparateVideoFolder), Nothing)
|
SeparateVideoFolder = AConvert(Of Boolean)(x.Value(Name_SeparateVideoFolder), AModes.Var, Nothing)
|
||||||
ReadyForDownload = x.Value(Name_ReadyForDownload).FromXML(Of Boolean)(True)
|
ReadyForDownload = x.Value(Name_ReadyForDownload).FromXML(Of Boolean)(True)
|
||||||
|
DownloadImages = x.Value(Name_DownloadImages).FromXML(Of Boolean)(True)
|
||||||
|
DownloadVideos = x.Value(Name_DownloadVideos).FromXML(Of Boolean)(True)
|
||||||
_CountVideo = x.Value(Name_VideoCount).FromXML(Of Integer)(0)
|
_CountVideo = x.Value(Name_VideoCount).FromXML(Of Integer)(0)
|
||||||
_CountPictures = x.Value(Name_PicturesCount).FromXML(Of Integer)(0)
|
_CountPictures = x.Value(Name_PicturesCount).FromXML(Of Integer)(0)
|
||||||
LastUpdated = AConvert(Of Date)(x.Value(Name_LastUpdated), ADateTime.Formats.BaseDateTime, Nothing)
|
LastUpdated = AConvert(Of Date)(x.Value(Name_LastUpdated), ADateTime.Formats.BaseDateTime, Nothing)
|
||||||
DataMerging = x.Value(Name_DataMerging).FromXML(Of Boolean)(False)
|
DataMerging = x.Value(Name_DataMerging).FromXML(Of Boolean)(False)
|
||||||
ChangeCollectionName(x.Value(Name_CollectionName), False)
|
ChangeCollectionName(x.Value(Name_CollectionName), False)
|
||||||
Labels.ListAddList(x.Value(Name_LabelsName).StringToList(Of String, List(Of String))("|", EDP.ReturnValue), LAP.NotContainsOnly, LAP.ClearBeforeAdd)
|
Labels.ListAddList(x.Value(Name_LabelsName).StringToList(Of String, List(Of String))("|", EDP.ReturnValue), LAP.NotContainsOnly, LAP.ClearBeforeAdd)
|
||||||
|
LoadUserInformation_OptionalFields(x, True)
|
||||||
End Using
|
End Using
|
||||||
UpdateDataFiles()
|
UpdateDataFiles()
|
||||||
End If
|
End If
|
||||||
@@ -450,6 +495,8 @@ BlockNullPicture:
|
|||||||
Using x As New XmlFile With {.Name = "User"}
|
Using x As New XmlFile With {.Name = "User"}
|
||||||
x.Add(Name_Site, CInt(Site))
|
x.Add(Name_Site, CInt(Site))
|
||||||
x.Add(Name_UserName, User.Name)
|
x.Add(Name_UserName, User.Name)
|
||||||
|
x.Add(Name_UserExists, UserExists.BoolToInteger)
|
||||||
|
x.Add(Name_UserSuspended, UserSuspended.BoolToInteger)
|
||||||
x.Add(Name_UserID, ID)
|
x.Add(Name_UserID, ID)
|
||||||
x.Add(Name_FriendlyName, FriendlyName)
|
x.Add(Name_FriendlyName, FriendlyName)
|
||||||
x.Add(Name_Description, UserDescription)
|
x.Add(Name_Description, UserDescription)
|
||||||
@@ -463,6 +510,8 @@ BlockNullPicture:
|
|||||||
x.Add(Name_SeparateVideoFolder, String.Empty)
|
x.Add(Name_SeparateVideoFolder, String.Empty)
|
||||||
End If
|
End If
|
||||||
x.Add(Name_ReadyForDownload, ReadyForDownload.BoolToInteger)
|
x.Add(Name_ReadyForDownload, ReadyForDownload.BoolToInteger)
|
||||||
|
x.Add(Name_DownloadImages, DownloadImages.BoolToInteger)
|
||||||
|
x.Add(Name_DownloadVideos, DownloadVideos.BoolToInteger)
|
||||||
x.Add(Name_VideoCount, _CountVideo)
|
x.Add(Name_VideoCount, _CountVideo)
|
||||||
x.Add(Name_PicturesCount, _CountPictures)
|
x.Add(Name_PicturesCount, _CountPictures)
|
||||||
x.Add(Name_LastUpdated, AConvert(Of String)(LastUpdated, ADateTime.Formats.BaseDateTime, String.Empty))
|
x.Add(Name_LastUpdated, AConvert(Of String)(LastUpdated, ADateTime.Formats.BaseDateTime, String.Empty))
|
||||||
@@ -470,25 +519,25 @@ BlockNullPicture:
|
|||||||
x.Add(Name_LabelsName, Labels.ListToString(, "|", EDP.ReturnValue))
|
x.Add(Name_LabelsName, Labels.ListToString(, "|", EDP.ReturnValue))
|
||||||
x.Add(Name_DataMerging, DataMerging.BoolToInteger)
|
x.Add(Name_DataMerging, DataMerging.BoolToInteger)
|
||||||
|
|
||||||
|
LoadUserInformation_OptionalFields(x, False)
|
||||||
|
|
||||||
x.Save(MyFile)
|
x.Save(MyFile)
|
||||||
End Using
|
End Using
|
||||||
Settings.UpdateUsersList(User)
|
If Not IsSavedPosts Then Settings.UpdateUsersList(User)
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
LogError(ex, "user information saving error")
|
LogError(ex, "user information saving error")
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
''' <param name="Loading"><see langword="True"/>: Loading; <see langword="False"/>: Saving</param>
|
||||||
|
Protected MustOverride Sub LoadUserInformation_OptionalFields(ByRef Container As XmlFile, ByVal Loading As Boolean)
|
||||||
#End Region
|
#End Region
|
||||||
#Region "User data"
|
#Region "User data"
|
||||||
Friend Overridable Overloads Sub LoadContentInformation()
|
Friend Overridable Overloads Sub LoadContentInformation()
|
||||||
UpdateDataFiles()
|
|
||||||
LoadContentInformation(_ContentList, MyFileData)
|
|
||||||
End Sub
|
|
||||||
Private Overloads Sub LoadContentInformation(ByRef _CLIST As List(Of UserMedia), ByVal f As SFile)
|
|
||||||
Try
|
Try
|
||||||
If Not f.Exists Then Exit Sub
|
UpdateDataFiles()
|
||||||
Using x As New XmlFile(f, ProtectionLevels.All, False) With {.XmlReadOnly = True, .AllowSameNames = True}
|
If Not MyFileData.Exists Then Exit Sub
|
||||||
|
Using x As New XmlFile(MyFileData, Protector.Modes.All, False) With {.XmlReadOnly = True, .AllowSameNames = True}
|
||||||
x.LoadData()
|
x.LoadData()
|
||||||
x.DefaultsLoading(False)
|
|
||||||
If x.Count > 0 Then
|
If x.Count > 0 Then
|
||||||
Dim fs$ = MyFile.CutPath.PathWithSeparator
|
Dim fs$ = MyFile.CutPath.PathWithSeparator
|
||||||
Dim gfn As Func(Of String, String) = Function(ByVal Input As String) As String
|
Dim gfn As Func(Of String, String) = Function(ByVal Input As String) As String
|
||||||
@@ -503,7 +552,7 @@ BlockNullPicture:
|
|||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
For Each v As EContainer In x
|
For Each v As EContainer In x
|
||||||
_CLIST.Add(New UserMedia With {
|
_ContentList.Add(New UserMedia With {
|
||||||
.Type = AConvert(Of Integer)(v.Attribute(Name_MediaType).Value, 0),
|
.Type = AConvert(Of Integer)(v.Attribute(Name_MediaType).Value, 0),
|
||||||
.URL = v.Attribute(Name_MediaURL).Value,
|
.URL = v.Attribute(Name_MediaURL).Value,
|
||||||
.URL_BASE = v.Value,
|
.URL_BASE = v.Value,
|
||||||
@@ -521,14 +570,14 @@ BlockNullPicture:
|
|||||||
LogError(ex, "history loading error")
|
LogError(ex, "history loading error")
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub UpdateContentInformation(ByRef _CLIST As List(Of UserMedia), ByVal f As SFile)
|
Friend Sub UpdateContentInformation()
|
||||||
Try
|
Try
|
||||||
UpdateDataFiles()
|
UpdateDataFiles()
|
||||||
If f.IsEmptyString Then Exit Sub
|
If MyFileData.IsEmptyString Then Exit Sub
|
||||||
f.Exists(SFO.Path)
|
MyFileData.Exists(SFO.Path)
|
||||||
Using x As New XmlFile With {.AllowSameNames = True, .Name = "Data"}
|
Using x As New XmlFile With {.AllowSameNames = True, .Name = "Data"}
|
||||||
If _CLIST.Count > 0 Then
|
If _ContentList.Count > 0 Then
|
||||||
For Each i As UserMedia In _CLIST
|
For Each i As UserMedia In _ContentList
|
||||||
x.Add(New EContainer("MediaData", i.URL_BASE,
|
x.Add(New EContainer("MediaData", i.URL_BASE,
|
||||||
{New EAttribute(Name_MediaType, CInt(i.Type)),
|
{New EAttribute(Name_MediaType, CInt(i.Type)),
|
||||||
New EAttribute(Name_MediaURL, i.URL),
|
New EAttribute(Name_MediaURL, i.URL),
|
||||||
@@ -552,9 +601,11 @@ BlockNullPicture:
|
|||||||
Try
|
Try
|
||||||
Dim URL$ = String.Empty
|
Dim URL$ = String.Empty
|
||||||
Select Case Site
|
Select Case Site
|
||||||
Case Sites.Reddit : URL = $"https://www.reddit.com/user/{Name}/"
|
Case Sites.Reddit : URL = $"https://www.reddit.com/{IIf(IsChannel, "r", "user")}/{Name}/"
|
||||||
Case Sites.Twitter : URL = $"https://twitter.com/{Name}"
|
Case Sites.Twitter : URL = $"https://twitter.com/{Name}"
|
||||||
Case Else : MsgBoxE($"Site [{Site}] opening does not implemented", MsgBoxStyle.Exclamation)
|
Case Sites.Instagram : URL = $"https://www.instagram.com/{Name}/"
|
||||||
|
Case Sites.RedGifs : URL = $"https://www.redgifs.com/users/{Name}/"
|
||||||
|
Case Else : MsgBoxE($"Site [{Site}] opening not implemented", MsgBoxStyle.Exclamation)
|
||||||
End Select
|
End Select
|
||||||
If Not URL.IsEmptyString Then Process.Start(URL)
|
If Not URL.IsEmptyString Then Process.Start(URL)
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
@@ -567,11 +618,19 @@ BlockNullPicture:
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Download functions and options"
|
#Region "Download functions and options"
|
||||||
Friend Overridable Property DownloadTopCount As Integer? = Nothing Implements IUserData.DownloadTopCount
|
Friend Overridable Property DownloadTopCount As Integer? = Nothing Implements IUserData.DownloadTopCount
|
||||||
|
Protected Responser As PersonalUtilities.Tools.WEB.Response
|
||||||
Friend Overridable Sub DownloadData(ByVal Token As CancellationToken) Implements IContentProvider.DownloadData
|
Friend Overridable Sub DownloadData(ByVal Token As CancellationToken) Implements IContentProvider.DownloadData
|
||||||
Dim Canceled As Boolean = False
|
Dim Canceled As Boolean = False
|
||||||
Try
|
Try
|
||||||
UpdateDataFiles()
|
UpdateDataFiles()
|
||||||
|
If Not Responser Is Nothing Then Responser.Dispose()
|
||||||
|
Responser = New PersonalUtilities.Tools.WEB.Response
|
||||||
|
Responser.Copy(Settings(Site).Responser)
|
||||||
Dim UpPic As Boolean = Settings.ViewModeIsPicture AndAlso GetPicture(False) Is Nothing
|
Dim UpPic As Boolean = Settings.ViewModeIsPicture AndAlso GetPicture(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
|
||||||
|
UserSuspended = False
|
||||||
_DownloadedPicturesSession = 0
|
_DownloadedPicturesSession = 0
|
||||||
_DownloadedVideosSession = 0
|
_DownloadedVideosSession = 0
|
||||||
_TempMediaList.Clear()
|
_TempMediaList.Clear()
|
||||||
@@ -586,32 +645,41 @@ BlockNullPicture:
|
|||||||
DownloadDataF(Token)
|
DownloadDataF(Token)
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
|
|
||||||
|
If _TempMediaList.Count > 0 Then
|
||||||
|
If Not DownloadImages Then _TempMediaList.RemoveAll(Function(m) m.Type = UTypes.GIF Or m.Type = UTypes.Picture)
|
||||||
|
If Not DownloadVideos Then _TempMediaList.RemoveAll(Function(m) m.Type = UTypes.Video Or
|
||||||
|
m.Type = UTypes.VideoPre Or m.Type = UTypes.m3u8)
|
||||||
|
End If
|
||||||
|
|
||||||
ReparseVideo(Token)
|
ReparseVideo(Token)
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
If _TempPostsList.Count > 0 And __SaveData Then TextSaver.SaveTextToFile(_TempPostsList.ListToString(, Environment.NewLine), MyFilePosts, True,, EDP.None)
|
If _TempPostsList.Count > 0 And __SaveData Then TextSaver.SaveTextToFile(_TempPostsList.ListToString(, Environment.NewLine), MyFilePosts, True,, EDP.None)
|
||||||
_ContentNew.ListAddList(_TempMediaList, LAP.ClearBeforeAdd)
|
_ContentNew.ListAddList(_TempMediaList, LAP.ClearBeforeAdd)
|
||||||
DownloadContent(Token)
|
DownloadContent(Token)
|
||||||
ThrowIfDisposed()
|
ThrowIfDisposed()
|
||||||
_ContentList.ListAddList(_ContentNew.Where(Function(c) c.State = UState.Downloaded), LNC)
|
_ContentList.ListAddList(_ContentNew.Where(Function(c) c.State = UStates.Downloaded), LNC)
|
||||||
_CountPictures = _ContentList.LongCount(Function(c) c.Type = UserMedia.Types.Picture)
|
_CountPictures = _ContentList.LongCount(Function(c) c.Type = UTypes.Picture)
|
||||||
_CountVideo = _ContentList.LongCount(Function(c) c.Type = UserMedia.Types.Video)
|
_CountVideo = _ContentList.LongCount(Function(c) c.Type = UTypes.Video)
|
||||||
If DownloadedPictures + DownloadedVideos > 0 Then
|
If DownloadedPictures + DownloadedVideos > 0 Or EnvirChanged.Invoke Then
|
||||||
If __SaveData Then
|
If __SaveData Then
|
||||||
LastUpdated = Now
|
LastUpdated = Now
|
||||||
If Labels.Contains(LabelsKeeper.NoParsedUser) Then Labels.Remove(LabelsKeeper.NoParsedUser)
|
If Labels.Contains(LabelsKeeper.NoParsedUser) Then Labels.Remove(LabelsKeeper.NoParsedUser)
|
||||||
UpdateContentInformation(_ContentList, MyFileData)
|
UpdateContentInformation()
|
||||||
Else
|
Else
|
||||||
_CountVideo = 0
|
_CountVideo = 0
|
||||||
_CountPictures = 0
|
_CountPictures = 0
|
||||||
_ContentList.Clear()
|
_ContentList.Clear()
|
||||||
CreatedByChannel = False
|
CreatedByChannel = False
|
||||||
End If
|
End If
|
||||||
|
If Not UserExists Then ReadyForDownload = False
|
||||||
UpdateUserInformation()
|
UpdateUserInformation()
|
||||||
End If
|
End If
|
||||||
ThrowIfDisposed()
|
ThrowIfDisposed()
|
||||||
_DownloadedPicturesTotal += _DownloadedPicturesSession
|
If Not CreatedByChannel Then
|
||||||
_DownloadedVideosTotal += _DownloadedVideosSession
|
_DownloadedPicturesTotal += _DownloadedPicturesSession
|
||||||
If UpPic Then Raise_OnPictureUpdated()
|
_DownloadedVideosTotal += _DownloadedVideosSession
|
||||||
|
End If
|
||||||
|
If UpPic Or EnvirChanged.Invoke Then Raise_OnUserUpdated()
|
||||||
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
||||||
MyMainLOG = $"{Site} - {Name}: downloading canceled"
|
MyMainLOG = $"{Site} - {Name}: downloading canceled"
|
||||||
Canceled = True
|
Canceled = True
|
||||||
@@ -621,12 +689,13 @@ BlockNullPicture:
|
|||||||
LogError(ex, "downloading data error")
|
LogError(ex, "downloading data error")
|
||||||
HasError = True
|
HasError = True
|
||||||
Finally
|
Finally
|
||||||
|
If Not Responser Is Nothing Then Responser.Dispose() : Responser = Nothing
|
||||||
If Not Canceled Then _DataParsed = True ': LastUpdated = Now
|
If Not Canceled Then _DataParsed = True ': LastUpdated = Now
|
||||||
_ContentNew.Clear()
|
_ContentNew.Clear()
|
||||||
DownloadTopCount = Nothing
|
DownloadTopCount = Nothing
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub UpdateDataFiles()
|
Protected Sub UpdateDataFiles()
|
||||||
If Not User.File.IsEmptyString Then
|
If Not User.File.IsEmptyString Then
|
||||||
MyFileData = User.File
|
MyFileData = User.File
|
||||||
MyFileData.Name &= "_Data"
|
MyFileData.Name &= "_Data"
|
||||||
@@ -640,35 +709,157 @@ BlockNullPicture:
|
|||||||
Protected MustOverride Sub DownloadDataF(ByVal Token As CancellationToken)
|
Protected MustOverride Sub DownloadDataF(ByVal Token As CancellationToken)
|
||||||
Protected MustOverride Sub ReparseVideo(ByVal Token As CancellationToken)
|
Protected MustOverride Sub ReparseVideo(ByVal Token As CancellationToken)
|
||||||
Protected MustOverride Sub DownloadContent(ByVal Token As CancellationToken)
|
Protected MustOverride Sub DownloadContent(ByVal Token As CancellationToken)
|
||||||
|
Protected Sub DownloadContentDefault(ByVal Token As CancellationToken)
|
||||||
|
Try
|
||||||
|
Dim i%
|
||||||
|
Dim dCount% = 0, dTotal% = 0
|
||||||
|
ThrowAny(Token)
|
||||||
|
If _ContentNew.Count > 0 Then
|
||||||
|
_ContentNew.RemoveAll(Function(c) c.URL.IsEmptyString)
|
||||||
|
If _ContentNew.Count > 0 Then
|
||||||
|
MyFile.Exists(SFO.Path)
|
||||||
|
Dim MyDir$ = MyFile.CutPath.PathNoSeparator
|
||||||
|
Dim vsf As Boolean = SeparateVideoFolderF
|
||||||
|
Dim __isVideo As Boolean
|
||||||
|
Dim f As SFile
|
||||||
|
Dim v As UserMedia
|
||||||
|
Using w As New WebClient
|
||||||
|
If vsf Then SFileShares.SFileExists($"{MyDir}\Video\", SFO.Path)
|
||||||
|
Progress.TotalCount += _ContentNew.Count
|
||||||
|
For i = 0 To _ContentNew.Count - 1
|
||||||
|
ThrowAny(Token)
|
||||||
|
v = _ContentNew(i)
|
||||||
|
v.State = UStates.Tried
|
||||||
|
If v.File.IsEmptyString Then
|
||||||
|
f = v.URL
|
||||||
|
Else
|
||||||
|
f = v.File
|
||||||
|
End If
|
||||||
|
f.Separator = "\"
|
||||||
|
f.Path = MyDir
|
||||||
|
|
||||||
|
If v.URL_BASE.IsEmptyString Then v.URL_BASE = v.URL
|
||||||
|
|
||||||
|
If Not v.File.IsEmptyString And Not v.URL_BASE.IsEmptyString Then
|
||||||
|
Try
|
||||||
|
__isVideo = v.Type = UTypes.Video Or f.Extension = "mp4"
|
||||||
|
|
||||||
|
If f.Extension.IsEmptyString Then
|
||||||
|
Select Case v.Type
|
||||||
|
Case UTypes.Picture : f.Extension = "jpg"
|
||||||
|
Case UTypes.Video : f.Extension = "mp4"
|
||||||
|
Case UTypes.GIF : f.Extension = "gif"
|
||||||
|
End Select
|
||||||
|
End If
|
||||||
|
|
||||||
|
If __isVideo And vsf Then f.Path = $"{f.PathWithSeparator}Video"
|
||||||
|
w.DownloadFile(v.URL_BASE, f.ToString)
|
||||||
|
|
||||||
|
If __isVideo Then
|
||||||
|
v.Type = UTypes.Video
|
||||||
|
DownloadedVideos += 1
|
||||||
|
_CountVideo += 1
|
||||||
|
Else
|
||||||
|
v.Type = UTypes.Picture
|
||||||
|
DownloadedPictures += 1
|
||||||
|
_CountPictures += 1
|
||||||
|
End If
|
||||||
|
|
||||||
|
v.File = ChangeFileNameByProvider(f, v)
|
||||||
|
v.State = UStates.Downloaded
|
||||||
|
dCount += 1
|
||||||
|
Catch wex As Exception
|
||||||
|
ErrorDownloading(f, v.URL_BASE)
|
||||||
|
End Try
|
||||||
|
Else
|
||||||
|
v.State = UStates.Skipped
|
||||||
|
End If
|
||||||
|
_ContentNew(i) = v
|
||||||
|
If DownloadTopCount.HasValue AndAlso dCount >= DownloadTopCount.Value Then
|
||||||
|
Progress.Perform(_ContentNew.Count - dTotal)
|
||||||
|
Exit Sub
|
||||||
|
Else
|
||||||
|
dTotal += 1
|
||||||
|
Progress.Perform()
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
||||||
|
Catch dex As ObjectDisposedException When Disposed
|
||||||
|
Catch ex As Exception
|
||||||
|
LogError(ex, "content downloading error")
|
||||||
|
HasError = True
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
''' <param name="RDE">Request DownloadingException</param>
|
||||||
|
Protected Sub ProcessException(ByVal ex As Exception, ByVal Token As CancellationToken, ByVal Message As String, Optional ByVal RDE As Boolean = True)
|
||||||
|
If Not ((TypeOf ex Is OperationCanceledException And Token.IsCancellationRequested) Or
|
||||||
|
(TypeOf ex Is ObjectDisposedException And Disposed)) Then
|
||||||
|
If RDE AndAlso DownloadingException(ex, Message, True) = 0 Then LogError(ex, Message) : HasError = True
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
''' <summary>0 - Execute LogError and set HasError</summary>
|
||||||
|
Protected MustOverride Function DownloadingException(ByVal ex As Exception, ByVal Message As String, Optional ByVal FromPE As Boolean = False) As Integer
|
||||||
|
Protected Function ChangeFileNameByProvider(ByVal f As SFile, ByVal m As UserMedia) As SFile
|
||||||
|
Dim ff As SFile = Nothing
|
||||||
|
Try
|
||||||
|
If Not f.IsEmptyString AndAlso f.Exists Then
|
||||||
|
Dim d As Date? = m.Post.Date
|
||||||
|
If Settings.FileReplaceNameByDate Then
|
||||||
|
Dim dd$ = AConvert(Of String)(If(d, Now), FileDateAppenderProvider, String.Empty)
|
||||||
|
ff = f
|
||||||
|
ff.Name = dd
|
||||||
|
ff = SFile.Indexed_IndexFile(ff,, New NumberedFile(ff))
|
||||||
|
ElseIf d.HasValue AndAlso (Settings.FileAddDateToFileName Or Settings.FileAddTimeToFileName) AndAlso
|
||||||
|
(Not FileDateAppenderProvider Is Nothing And Not FileDateAppenderPattern.IsEmptyString) Then
|
||||||
|
ff = f
|
||||||
|
ff.Name = String.Format(FileDateAppenderPattern, f.Name, CStr(AConvert(Of String)(d.Value, FileDateAppenderProvider, String.Empty)))
|
||||||
|
End If
|
||||||
|
If Not ff.Name.IsEmptyString Then My.Computer.FileSystem.RenameFile(f, ff.File) : Return ff
|
||||||
|
End If
|
||||||
|
Return f
|
||||||
|
Catch ex As Exception
|
||||||
|
LogError(ex, $"change file name from [{f}] to [{ff}]")
|
||||||
|
Return f
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Delete, Move, Merge"
|
#Region "Delete, Move, Merge"
|
||||||
Friend Overridable Function Delete() As Integer Implements IUserData.Delete
|
Friend Overridable Function Delete() As Integer Implements IUserData.Delete
|
||||||
|
Return DeleteF(Me)
|
||||||
|
End Function
|
||||||
|
Friend Function DeleteF(ByVal Instance As IUserData) As Integer
|
||||||
Dim f As SFile = SFile.GetPath(MyFile.CutPath.Path)
|
Dim f As SFile = SFile.GetPath(MyFile.CutPath.Path)
|
||||||
If f.Exists(SFO.Path, False) AndAlso f.Delete(SFO.Path, False, False) Then
|
If f.Exists(SFO.Path, False) AndAlso (User.Merged OrElse f.Delete(SFO.Path, False, False)) Then
|
||||||
ImageHandler(Me, False)
|
ImageHandler(Me, False)
|
||||||
Settings.UsersList.Remove(User)
|
Settings.UsersList.Remove(User)
|
||||||
Settings.UpdateUsersList()
|
Settings.UpdateUsersList()
|
||||||
Settings.Users.Remove(Me)
|
Settings.Users.Remove(Instance)
|
||||||
Downloader.UserRemove(Me)
|
Downloader.UserRemove(Instance)
|
||||||
Dispose(True)
|
Dispose(True)
|
||||||
Return 1
|
Return 1
|
||||||
Else
|
Else
|
||||||
Return 0
|
Return 0
|
||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
Friend Overridable Function MoveFiles(ByVal __CollectionName As String, ByVal _MergeData As Boolean) As Boolean Implements IUserData.MoveFiles
|
Friend Overridable Function MoveFiles(ByVal __CollectionName As String) As Boolean Implements IUserData.MoveFiles
|
||||||
|
Return MoveFilesF(Me, __CollectionName)
|
||||||
|
End Function
|
||||||
|
Friend Function MoveFilesF(ByRef Instance As IUserData, ByVal __CollectionName As String) As Boolean
|
||||||
Dim UserBefore As UserInfo = User
|
Dim UserBefore As UserInfo = User
|
||||||
Dim Removed As Boolean = True
|
Dim Removed As Boolean = True
|
||||||
Dim _TurnBack As Boolean = False
|
Dim _TurnBack As Boolean = False
|
||||||
Try
|
Try
|
||||||
Dim f As SFile
|
Dim f As SFile
|
||||||
If IncludedInCollection Then
|
If IncludedInCollection Then
|
||||||
Settings.Users.Add(Me)
|
Settings.Users.Add(Instance)
|
||||||
Removed = False
|
Removed = False
|
||||||
User.CollectionName = String.Empty
|
User.CollectionName = String.Empty
|
||||||
User.IncludedInCollection = False
|
User.IncludedInCollection = False
|
||||||
Else
|
Else
|
||||||
Settings.Users.Remove(Me)
|
Settings.Users.Remove(Instance)
|
||||||
Removed = True
|
Removed = True
|
||||||
User.CollectionName = __CollectionName
|
User.CollectionName = __CollectionName
|
||||||
User.IncludedInCollection = True
|
User.IncludedInCollection = True
|
||||||
@@ -683,7 +874,7 @@ BlockNullPicture:
|
|||||||
"Destination directory is not empty!"}, MsgBoxStyle.Exclamation,,, {"Delete", "Cancel"}) = 1 Then
|
"Destination directory is not empty!"}, MsgBoxStyle.Exclamation,,, {"Delete", "Cancel"}) = 1 Then
|
||||||
MsgBoxE("Operation canceled", MsgBoxStyle.Exclamation)
|
MsgBoxE("Operation canceled", MsgBoxStyle.Exclamation)
|
||||||
User = UserBefore
|
User = UserBefore
|
||||||
If Removed Then Settings.Users.Add(Me) Else Settings.Users.Remove(Me)
|
If Removed Then Settings.Users.Add(Instance) Else Settings.Users.Remove(Instance)
|
||||||
_TurnBack = False
|
_TurnBack = False
|
||||||
Return False
|
Return False
|
||||||
End If
|
End If
|
||||||
@@ -699,7 +890,7 @@ BlockNullPicture:
|
|||||||
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Files moving error")
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Files moving error")
|
||||||
User = UserBefore
|
User = UserBefore
|
||||||
If _TurnBack Then
|
If _TurnBack Then
|
||||||
If Removed Then Settings.Users.Add(Me) Else Settings.Users.Remove(Me)
|
If Removed Then Settings.Users.Add(Instance) Else Settings.Users.Remove(Instance)
|
||||||
End If
|
End If
|
||||||
Return False
|
Return False
|
||||||
End Try
|
End Try
|
||||||
@@ -746,13 +937,15 @@ BlockNullPicture:
|
|||||||
End If
|
End If
|
||||||
UpdateUserInformation()
|
UpdateUserInformation()
|
||||||
End If
|
End If
|
||||||
|
Catch ioex As InvalidOperationException When ioex.HelpLink = 1
|
||||||
|
MsgBoxE(ioex.Message, vbCritical)
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
LogError(ex, "[UserDataBase.MergeData]")
|
LogError(ex, "[UserDataBase.MergeData]")
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Function CheckFile(ByVal f As SFile, ByRef List As IEnumerable(Of SFile)) As SFile
|
Private Function CheckFile(ByVal f As SFile, ByRef List As IEnumerable(Of SFile)) As SFile
|
||||||
If List.ListExists Then
|
If List.ListExists Then
|
||||||
Dim p As New RegexStructure(".+?\s{0,1}\((\d+)\)|.+",,,,,,, String.Empty, EDP.ReturnValue)
|
Dim p As RParams = RParams.DMS(".+?\s{0,1}\((\d+)\)|.+", 0, EDP.ReturnValue)
|
||||||
Dim i% = List.Where(Function(ff) CStr(RegexReplace(ff.Name, p)).Trim.ToLower = f.Name.Trim.ToLower).Count
|
Dim i% = List.Where(Function(ff) CStr(RegexReplace(ff.Name, p)).Trim.ToLower = f.Name.Trim.ToLower).Count
|
||||||
If i > 0 Then f.Name &= $" ({i + 1})"
|
If i > 0 Then f.Name &= $" ({i + 1})"
|
||||||
End If
|
End If
|
||||||
@@ -835,15 +1028,23 @@ BlockNullPicture:
|
|||||||
Return OutValue
|
Return OutValue
|
||||||
End Function
|
End Function
|
||||||
Friend Overridable Function CompareTo(ByVal Obj As Object) As Integer Implements IComparable.CompareTo
|
Friend Overridable Function CompareTo(ByVal Obj As Object) As Integer Implements IComparable.CompareTo
|
||||||
Return CompareTo(DirectCast(Obj, UserDataBase))
|
If TypeOf Obj Is Reddit.Channel Then
|
||||||
|
Return CompareTo(DirectCast(DirectCast(Obj, Reddit.Channel).Instance, UserDataBase))
|
||||||
|
Else
|
||||||
|
Return CompareTo(DirectCast(Obj, UserDataBase))
|
||||||
|
End If
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
#Region "IEquatable Support"
|
#Region "IEquatable Support"
|
||||||
Friend Overridable Overloads Function Equals(ByVal Other As UserDataBase) As Boolean Implements IEquatable(Of UserDataBase).Equals
|
Friend Overridable Overloads Function Equals(ByVal Other As UserDataBase) As Boolean Implements IEquatable(Of UserDataBase).Equals
|
||||||
Return Site = Other.Site And Name = Other.Name
|
Return Site = Other.Site And Name = Other.Name And IsSavedPosts = Other.IsSavedPosts
|
||||||
End Function
|
End Function
|
||||||
Public Overrides Function Equals(ByVal Obj As Object) As Boolean
|
Public Overrides Function Equals(ByVal Obj As Object) As Boolean
|
||||||
Return Equals(DirectCast(Obj, UserDataBase))
|
If TypeOf Obj Is Reddit.Channel Then
|
||||||
|
Return Equals(DirectCast(DirectCast(Obj, Reddit.Channel).Instance, UserDataBase))
|
||||||
|
Else
|
||||||
|
Return Equals(DirectCast(Obj, UserDataBase))
|
||||||
|
End If
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
#Region "IDisposable Support"
|
#Region "IDisposable Support"
|
||||||
@@ -860,6 +1061,7 @@ BlockNullPicture:
|
|||||||
_ContentNew.Clear()
|
_ContentNew.Clear()
|
||||||
_TempMediaList.Clear()
|
_TempMediaList.Clear()
|
||||||
_TempPostsList.Clear()
|
_TempPostsList.Clear()
|
||||||
|
If Not Responser Is Nothing Then Responser.Dispose()
|
||||||
If Not BTT_CONTEXT_DOWN Is Nothing Then BTT_CONTEXT_DOWN.Dispose()
|
If Not BTT_CONTEXT_DOWN Is Nothing Then BTT_CONTEXT_DOWN.Dispose()
|
||||||
If Not BTT_CONTEXT_EDIT Is Nothing Then BTT_CONTEXT_EDIT.Dispose()
|
If Not BTT_CONTEXT_EDIT Is Nothing Then BTT_CONTEXT_EDIT.Dispose()
|
||||||
If Not BTT_CONTEXT_DELETE Is Nothing Then BTT_CONTEXT_DELETE.Dispose()
|
If Not BTT_CONTEXT_DELETE Is Nothing Then BTT_CONTEXT_DELETE.Dispose()
|
||||||
@@ -892,7 +1094,7 @@ BlockNullPicture:
|
|||||||
Sub DownloadData(ByVal Token As CancellationToken)
|
Sub DownloadData(ByVal Token As CancellationToken)
|
||||||
End Interface
|
End Interface
|
||||||
Friend Interface IUserData : Inherits IContentProvider, IComparable(Of UserDataBase), IComparable, IEquatable(Of UserDataBase), IDisposable
|
Friend Interface IUserData : Inherits IContentProvider, IComparable(Of UserDataBase), IComparable, IEquatable(Of UserDataBase), IDisposable
|
||||||
Event OnPictureUpdated(ByVal User As IUserData)
|
Event OnUserUpdated(ByVal User As IUserData)
|
||||||
Property ParseUserMediaOnly As Boolean
|
Property ParseUserMediaOnly As Boolean
|
||||||
#Region "Images"
|
#Region "Images"
|
||||||
Function GetPicture() As Image
|
Function GetPicture() As Image
|
||||||
@@ -905,6 +1107,8 @@ BlockNullPicture:
|
|||||||
ReadOnly Property Labels As List(Of String)
|
ReadOnly Property Labels As List(Of String)
|
||||||
#End Region
|
#End Region
|
||||||
ReadOnly Property IsChannel As Boolean
|
ReadOnly Property IsChannel As Boolean
|
||||||
|
Property Exists As Boolean
|
||||||
|
Property Suspended As Boolean
|
||||||
Property ReadyForDownload As Boolean
|
Property ReadyForDownload As Boolean
|
||||||
Property [File] As SFile
|
Property [File] As SFile
|
||||||
Property FileExists As Boolean
|
Property FileExists As Boolean
|
||||||
@@ -916,6 +1120,8 @@ BlockNullPicture:
|
|||||||
ReadOnly Property FitToAddParams As Boolean
|
ReadOnly Property FitToAddParams As Boolean
|
||||||
ReadOnly Property LVIKey As String
|
ReadOnly Property LVIKey As String
|
||||||
ReadOnly Property LVIIndex As Integer
|
ReadOnly Property LVIIndex As Integer
|
||||||
|
Property DownloadImages As Boolean
|
||||||
|
Property DownloadVideos As Boolean
|
||||||
Function GetLVI(ByVal Destination As ListView) As ListViewItem
|
Function GetLVI(ByVal Destination As ListView) As ListViewItem
|
||||||
Function GetLVIGroup(ByVal Destination As ListView) As ListViewGroup
|
Function GetLVIGroup(ByVal Destination As ListView) As ListViewGroup
|
||||||
Sub LoadUserInformation()
|
Sub LoadUserInformation()
|
||||||
@@ -924,10 +1130,10 @@ BlockNullPicture:
|
|||||||
''' 0 - Nothing removed<br/>
|
''' 0 - Nothing removed<br/>
|
||||||
''' 1 - User removed<br/>
|
''' 1 - User removed<br/>
|
||||||
''' 2 - Collection removed<br/>
|
''' 2 - Collection removed<br/>
|
||||||
''' 3 - Collection splitted
|
''' 3 - Collection split
|
||||||
''' </summary>
|
''' </summary>
|
||||||
Function Delete() As Integer
|
Function Delete() As Integer
|
||||||
Function MoveFiles(ByVal CollectionName As String, ByVal MergeData As Boolean) As Boolean
|
Function MoveFiles(ByVal CollectionName As String) As Boolean
|
||||||
Sub OpenFolder()
|
Sub OpenFolder()
|
||||||
ReadOnly Property Self As IUserData
|
ReadOnly Property Self As IUserData
|
||||||
Property DownloadTopCount As Integer?
|
Property DownloadTopCount As Integer?
|
||||||
|
|||||||
102
SCrawler/API/Imgur/Envir.vb
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
' 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.Functions.XML
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
|
Imports PersonalUtilities.Tools.WebDocuments.JSON
|
||||||
|
Imports System.Net
|
||||||
|
Imports SCrawler.API.Imgur.Declarations
|
||||||
|
Imports SCrawler.API.Base
|
||||||
|
Namespace API.Imgur
|
||||||
|
Namespace Declarations
|
||||||
|
Friend Module Imgur_Declarations
|
||||||
|
Friend ReadOnly PostRegex As RParams = RParams.DMS("/([\w\d]+?)(|\.[\w]{0,4})\Z", 1)
|
||||||
|
End Module
|
||||||
|
End Namespace
|
||||||
|
Friend NotInheritable Class Envir
|
||||||
|
Private Sub New()
|
||||||
|
End Sub
|
||||||
|
Friend Shared Function GetGallery(ByVal URL As String, Optional ByVal e As ErrorsDescriber = Nothing) As List(Of String)
|
||||||
|
Try
|
||||||
|
If Not Settings.ImgurClientID.IsEmptyString And Not URL.IsEmptyString Then
|
||||||
|
Dim __url$ = RegexReplace(URL, PostRegex)
|
||||||
|
If Not __url.IsEmptyString Then
|
||||||
|
__url = $"https://api.imgur.com/post/v1/albums/{__url}?client_id={Settings.ImgurClientID.Value}&include=media"
|
||||||
|
Using w As New WebClient
|
||||||
|
Dim r$ = w.DownloadString(__url)
|
||||||
|
If Not r.IsEmptyString Then
|
||||||
|
Using j As EContainer = JsonDocument.Parse(r).XmlIfNothing
|
||||||
|
If j.Contains("media") Then
|
||||||
|
Dim UrlsList As New List(Of String)
|
||||||
|
Dim tmpUrl$
|
||||||
|
For Each m As EContainer In j("media")
|
||||||
|
tmpUrl = m.Value("url")
|
||||||
|
If Not tmpUrl.IsEmptyString Then UrlsList.ListAddValue(tmpUrl, Base.LNC)
|
||||||
|
Next
|
||||||
|
Return UrlsList
|
||||||
|
End If
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Return Nothing
|
||||||
|
Catch ex As Exception
|
||||||
|
Return DownloadingException(ex, $"[API.Imgur.Envir.GetGallery({URL})]", Nothing, e)
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
Friend Shared Function GetImage(ByVal URL As String, Optional ByVal e As ErrorsDescriber = Nothing) As String
|
||||||
|
Try
|
||||||
|
If Not Settings.ImgurClientID.IsEmptyString And Not URL.IsEmptyString Then
|
||||||
|
Dim __url$ = RegexReplace(URL, PostRegex)
|
||||||
|
If Not __url.IsEmptyString Then
|
||||||
|
__url = $"https://api.imgur.com/3/image/{__url}?client_id={Settings.ImgurClientID.Value}&include=media"
|
||||||
|
Using w As New WebClient
|
||||||
|
Dim r$ = w.DownloadString(__url)
|
||||||
|
If Not r.IsEmptyString Then Return JsonDocument.Parse(r).XmlIfNothing.Value({"data"}, "link")
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Return String.Empty
|
||||||
|
Catch ex As Exception
|
||||||
|
Return DownloadingException(ex, $"[API.Imgur.Envir.GetImage({URL})]", String.Empty, e)
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
Friend Shared Function GetVideoInfo(ByVal URL As String) As IEnumerable(Of UserMedia)
|
||||||
|
Try
|
||||||
|
If Not URL.IsEmptyString AndAlso URL.ToLower.Contains("imgur") AndAlso Not Settings.ImgurClientID.IsEmptyString Then
|
||||||
|
Dim img$ = GetImage(URL, EDP.ReturnValue)
|
||||||
|
If Not img.IsEmptyString Then
|
||||||
|
Return {New UserMedia(img)}
|
||||||
|
Else
|
||||||
|
Return GetGallery(URL, EDP.ReturnValue).ListIfNothing.Select(Function(u) New UserMedia(u))
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Return Nothing
|
||||||
|
Catch ex As Exception
|
||||||
|
Return ErrorsDescriber.Execute(EDP.ShowMainMsg + EDP.SendInLog, ex, "Imgur standalone downloader: fetch media error")
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
Private Shared Function DownloadingException(ByVal ex As Exception, ByVal Message As String,
|
||||||
|
ByVal NullArg As Object, ByVal e As ErrorsDescriber) As Object
|
||||||
|
If TypeOf ex Is WebException Then
|
||||||
|
Dim obj As HttpWebResponse = TryCast(DirectCast(ex, WebException).Response, HttpWebResponse)
|
||||||
|
If Not obj Is Nothing Then
|
||||||
|
If obj.StatusCode = HttpStatusCode.NotFound Then
|
||||||
|
Return NullArg
|
||||||
|
ElseIf obj.StatusCode = HttpStatusCode.Unauthorized Then
|
||||||
|
MyMainLOG = "Imgur credentials expired"
|
||||||
|
Return NullArg
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
If Not e.Exists Then e = New ErrorsDescriber(EDP.ReturnValue + EDP.SendInLog)
|
||||||
|
Return ErrorsDescriber.Execute(e, ex, Message, NullArg)
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
24
SCrawler/API/Instagram/Declarations.vb
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
' 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.Functions.RegularExpressions
|
||||||
|
Namespace API.Instagram
|
||||||
|
Friend Module Declarations
|
||||||
|
Friend ReadOnly FilesPattern As RParams = RParams.DMS(".+?([^/\?]+?\.[\w\d]{3,4})(?=(\?|\Z))", 1, EDP.ReturnValue)
|
||||||
|
Friend ReadOnly Property DateProvider As New JsonDate
|
||||||
|
Friend Class JsonDate : Implements ICustomProvider
|
||||||
|
Friend 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
|
||||||
|
Return ADateTime.ParseUnicode(Value)
|
||||||
|
End Function
|
||||||
|
Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat
|
||||||
|
Throw New NotImplementedException("GetFormat is not available in this context")
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
End Module
|
||||||
|
End Namespace
|
||||||
44
SCrawler/API/Instagram/ProfileSaved.vb
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
' 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 SCrawler.API.Base
|
||||||
|
Imports System.Threading
|
||||||
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
|
Namespace API.Instagram
|
||||||
|
Friend NotInheritable Class ProfileSaved
|
||||||
|
Friend Shared ReadOnly Property DataPath As SFile = Settings(Sites.Instagram).SavedPostsPath
|
||||||
|
Private Sub New()
|
||||||
|
End Sub
|
||||||
|
Friend Shared Sub Download(ByRef Bar As MyProgress, ByVal Token As CancellationToken)
|
||||||
|
Try
|
||||||
|
Dim u As New UserInfo(Settings(Sites.Instagram).SavedPostsUserName.Value, Sites.Instagram) With {.SpecialPath = DataPath}
|
||||||
|
u.UpdateUserFile()
|
||||||
|
Using user As New UserData(u,, False)
|
||||||
|
DirectCast(user.Self, UserDataBase).IsSavedPosts = True
|
||||||
|
user.Progress = Bar
|
||||||
|
If Not user.FileExists Then user.UpdateUserInformation()
|
||||||
|
If Settings(Sites.Instagram).InstagramLastDownloadDate.Value < Now.AddMinutes(60) Then
|
||||||
|
user.RequestsCount = Settings(Sites.Instagram).InstagramLastRequestsCount
|
||||||
|
End If
|
||||||
|
user.DownloadData(Token)
|
||||||
|
Bar.InformationTemporary = $"Images: {user.DownloadedPictures}; Videos: {user.DownloadedVideos}"
|
||||||
|
With Settings
|
||||||
|
.BeginUpdate()
|
||||||
|
With .Site(Sites.Instagram)
|
||||||
|
.InstagramLastDownloadDate.Value = Now
|
||||||
|
.InstagramLastRequestsCount.Value = user.RequestsCount
|
||||||
|
End With
|
||||||
|
.EndUpdate()
|
||||||
|
End With
|
||||||
|
End Using
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendInLog, ex, "[API.Instagram.ProfileSaved.Download]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
439
SCrawler/API/Instagram/UserData.vb
Normal file
@@ -0,0 +1,439 @@
|
|||||||
|
' 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.Functions.XML
|
||||||
|
Imports PersonalUtilities.Functions.Messaging
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
|
Imports PersonalUtilities.Tools.WebDocuments.JSON
|
||||||
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
|
Imports SCrawler.API.Base
|
||||||
|
Imports System.Threading
|
||||||
|
Imports System.Net
|
||||||
|
Imports UTypes = SCrawler.API.Base.UserMedia.Types
|
||||||
|
Namespace API.Instagram
|
||||||
|
Friend Class UserData : Inherits UserDataBase
|
||||||
|
Private Const MaxPostsCount As Integer = 200
|
||||||
|
Private Const Name_LastCursor As String = "LastCursor"
|
||||||
|
Private Const Name_FirstLoadingDone As String = "FirstLoadingDone"
|
||||||
|
Friend Overrides Property Site As Sites = Sites.Instagram
|
||||||
|
Friend Overrides Property Progress As MyProgress
|
||||||
|
Get
|
||||||
|
If Not _Progress Is Nothing Then Return _Progress Else Return MainProgressInst
|
||||||
|
End Get
|
||||||
|
Set(ByVal p As MyProgress)
|
||||||
|
_Progress = p
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private ReadOnly _SavedPostsIDs As New List(Of String)
|
||||||
|
Private LastCursor As String = String.Empty
|
||||||
|
Private FirstLoadingDone As Boolean = True
|
||||||
|
''' <summary>Video downloader initializer</summary>
|
||||||
|
Private Sub New()
|
||||||
|
End Sub
|
||||||
|
''' <summary>Default initializer</summary>
|
||||||
|
Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True, Optional ByVal InvokeImageHandler As Boolean = True)
|
||||||
|
MyBase.New(InvokeImageHandler)
|
||||||
|
User = u
|
||||||
|
If _LoadUserInformation Then LoadUserInformation()
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub LoadUserInformation_OptionalFields(ByRef Container As XmlFile, ByVal Loading As Boolean)
|
||||||
|
If Loading Then
|
||||||
|
LastCursor = Container.Value(Name_LastCursor)
|
||||||
|
FirstLoadingDone = Container.Value(Name_FirstLoadingDone).FromXML(Of Boolean)(False)
|
||||||
|
Else
|
||||||
|
Container.Add(Name_LastCursor, LastCursor)
|
||||||
|
Container.Add(Name_FirstLoadingDone, FirstLoadingDone.BoolToInteger)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
||||||
|
Try
|
||||||
|
_InstaHash = String.Empty
|
||||||
|
HasError = False
|
||||||
|
If Not LastCursor.IsEmptyString Then
|
||||||
|
DownloadData(LastCursor, Token)
|
||||||
|
ThrowAny(Token)
|
||||||
|
If Not HasError Then FirstLoadingDone = True
|
||||||
|
End If
|
||||||
|
If Not HasError Then
|
||||||
|
DownloadData(String.Empty, Token)
|
||||||
|
ThrowAny(Token)
|
||||||
|
If Not HasError Then FirstLoadingDone = True
|
||||||
|
End If
|
||||||
|
If FirstLoadingDone Then LastCursor = String.Empty
|
||||||
|
If IsSavedPosts Then DownloadPosts(Token)
|
||||||
|
If WaitNotificationMode = WNM.SkipTemp Or WaitNotificationMode = WNM.SkipCurrent Then WaitNotificationMode = WNM.Notify
|
||||||
|
Catch ex As Exception
|
||||||
|
ProcessException(ex, Token, "[API.Instagram.UserData.DownloadDataF", False)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private _InstaHash As String = String.Empty
|
||||||
|
#Region "429 bypass"
|
||||||
|
Friend RequestsCount As Integer = 0
|
||||||
|
Friend Enum WNM As Integer
|
||||||
|
Notify = 0
|
||||||
|
SkipCurrent = 1
|
||||||
|
SkipAll = 2
|
||||||
|
SkipTemp = 3
|
||||||
|
End Enum
|
||||||
|
Friend WaitNotificationMode As WNM = WNM.Notify
|
||||||
|
Private Caught429 As Boolean = False
|
||||||
|
Private ProgressTempSet As Boolean = False
|
||||||
|
Private Const InstAborted As String = "InstAborted"
|
||||||
|
Private Function Ready() As Boolean
|
||||||
|
With Settings(Sites.Instagram)
|
||||||
|
If Not .InstagramReadyForDownload Then
|
||||||
|
If WaitNotificationMode = WNM.Notify Then
|
||||||
|
Dim m As New MMessage("Instagram [too many requests] error." & vbCr &
|
||||||
|
$"The program suggests waiting {If(Settings(Sites.Instagram).InstagramLastApplyingValue, 0)} minutes." & vbCr &
|
||||||
|
"What do you want to do?", "Waiting for Instagram download...",
|
||||||
|
{
|
||||||
|
New MsgBoxButton("Wait") With {.ToolTip = "Wait and ask again when the error is found."},
|
||||||
|
New MsgBoxButton("Wait (disable current") With {.ToolTip = "Wait and skip future prompts while downloading the current profile."},
|
||||||
|
New MsgBoxButton("Abort") With {.ToolTip = "Abort operation"},
|
||||||
|
New MsgBoxButton("Wait (disable all)") With {.ToolTip = "Wait and skip future prompts while downloading the current session."}
|
||||||
|
},
|
||||||
|
vbExclamation) With {.ButtonsPerRow = 2, .DefaultButton = 0, .CancelButton = 2}
|
||||||
|
Select Case MsgBoxE(m).Index
|
||||||
|
Case 1 : WaitNotificationMode = WNM.SkipCurrent
|
||||||
|
Case 2 : Throw New OperationCanceledException("Instagram download operation aborted") With {.HelpLink = InstAborted}
|
||||||
|
Case 3 : WaitNotificationMode = WNM.SkipAll
|
||||||
|
Case Else : WaitNotificationMode = WNM.SkipTemp
|
||||||
|
End Select
|
||||||
|
End If
|
||||||
|
If Not ProgressTempSet Then Progress.InformationTemporary = $"Waiting until {Settings(Sites.Instagram).GetInstaWaitDate().ToString(ParsersDataDateProvider)}"
|
||||||
|
ProgressTempSet = True
|
||||||
|
Return False
|
||||||
|
Else
|
||||||
|
Return True
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End Function
|
||||||
|
Private Sub ReconfigureAwaiter()
|
||||||
|
If WaitNotificationMode = WNM.SkipTemp Then WaitNotificationMode = WNM.Notify
|
||||||
|
If Caught429 Then Caught429 = False : RequestsCount = 0
|
||||||
|
ProgressTempSet = False
|
||||||
|
End Sub
|
||||||
|
Private Sub NextRequest(ByVal StartWait As Boolean)
|
||||||
|
With Settings(Sites.Instagram)
|
||||||
|
If StartWait And (RequestsCount Mod .RequestsWaitTimerTaskCount.Value) = 0 Then Thread.Sleep(.RequestsWaitTimer)
|
||||||
|
If RequestsCount >= MaxPostsCount - 5 Then Thread.Sleep(.SleepTimerOnPostsLimit)
|
||||||
|
End With
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
Private Overloads Sub DownloadData(ByVal Cursor As String, ByVal Token As CancellationToken)
|
||||||
|
Dim URL$ = String.Empty
|
||||||
|
Dim _DownloadComplete As Boolean = False
|
||||||
|
LastCursor = Cursor
|
||||||
|
Try
|
||||||
|
Do While Not _DownloadComplete
|
||||||
|
If Not Ready() Then Thread.Sleep(10000) : ThrowAny(Token) : Continue Do
|
||||||
|
ReconfigureAwaiter()
|
||||||
|
|
||||||
|
Try
|
||||||
|
Dim n As EContainer, nn As EContainer, node As EContainer
|
||||||
|
Dim HasNextPage As Boolean = False
|
||||||
|
Dim EndCursor$ = String.Empty
|
||||||
|
Dim PostID$ = String.Empty, PostDate$ = String.Empty
|
||||||
|
|
||||||
|
NextRequest(True)
|
||||||
|
|
||||||
|
'Check environment
|
||||||
|
If Cursor.IsEmptyString And _InstaHash.IsEmptyString Then _
|
||||||
|
_InstaHash = If(IsSavedPosts, Settings(Sites.Instagram).InstaHash_SP, Settings(Sites.Instagram).InstaHash).Value
|
||||||
|
If _InstaHash.IsEmptyString Then Throw New ArgumentNullException(IIf(IsSavedPosts, "InstaHashSavedPosts", "InstaHash"), "Query hash is null")
|
||||||
|
If ID.IsEmptyString Then GetUserId()
|
||||||
|
If ID.IsEmptyString Then Throw New ArgumentException("User ID is not detected", "ID")
|
||||||
|
|
||||||
|
'Create query
|
||||||
|
Dim vars$ = "{""id"":" & ID & ",""first"":50,""after"":""" & Cursor & """}"
|
||||||
|
vars = SymbolsConverter.ASCII.EncodeSymbolsOnly(vars)
|
||||||
|
URL = $"https://www.instagram.com/graphql/query/?query_hash={_InstaHash}&variables={vars}"
|
||||||
|
|
||||||
|
'Get response
|
||||||
|
Dim r$ = Responser.GetResponse(URL,, EDP.ThrowException)
|
||||||
|
Settings(Sites.Instagram).InstagramTooManyRequests(False)
|
||||||
|
RequestsCount += 1
|
||||||
|
ThrowAny(Token)
|
||||||
|
|
||||||
|
'Data
|
||||||
|
If Not r.IsEmptyString Then
|
||||||
|
Using j As EContainer = JsonDocument.Parse(r).XmlIfNothing
|
||||||
|
n = j.ItemF({"data", "user", 0}).XmlIfNothing
|
||||||
|
If n.Count > 0 Then
|
||||||
|
If n.Contains("page_info") Then
|
||||||
|
With n("page_info")
|
||||||
|
HasNextPage = .Value("has_next_page").FromXML(Of Boolean)(False)
|
||||||
|
EndCursor = .Value("end_cursor")
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
n = n("edges").XmlIfNothing
|
||||||
|
If n.Count > 0 Then
|
||||||
|
For Each nn In n
|
||||||
|
ThrowAny(Token)
|
||||||
|
node = nn(0).XmlIfNothing
|
||||||
|
If IsSavedPosts Then
|
||||||
|
PostID = node.Value("shortcode")
|
||||||
|
If Not PostID.IsEmptyString Then
|
||||||
|
If _TempPostsList.Contains(PostID) Then Exit Sub Else _SavedPostsIDs.Add(PostID)
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
PostID = node.Value("id")
|
||||||
|
If Not PostID.IsEmptyString And _TempPostsList.Contains(PostID) Then Exit Sub
|
||||||
|
_TempPostsList.Add(PostID)
|
||||||
|
PostDate = node.Value("taken_at_timestamp")
|
||||||
|
ObtainMedia(node, PostID, PostDate)
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
If j.Value("status") = "ok" AndAlso j({"data", "user"}).XmlIfNothing.Count = 0 AndAlso _TempMediaList.Count = 0 Then
|
||||||
|
Settings(Sites.Instagram).InstaHashUpdateRequired.Value = True
|
||||||
|
UserExists = False
|
||||||
|
_DownloadComplete = True
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End Using
|
||||||
|
Else
|
||||||
|
_DownloadComplete = True
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
_DownloadComplete = True
|
||||||
|
If HasNextPage And Not EndCursor.IsEmptyString Then DownloadData(EndCursor, Token)
|
||||||
|
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
||||||
|
Exit Do
|
||||||
|
Catch dex As ObjectDisposedException When Disposed
|
||||||
|
Exit Do
|
||||||
|
Catch ex As Exception
|
||||||
|
If DownloadingException(ex, $"data downloading error [{URL}]") = 1 Then Continue Do Else Exit Do
|
||||||
|
End Try
|
||||||
|
Loop
|
||||||
|
Catch oex2 As OperationCanceledException When Token.IsCancellationRequested Or oex2.HelpLink = InstAborted
|
||||||
|
If oex2.HelpLink = InstAborted Then HasError = True
|
||||||
|
Catch DoEx As Exception
|
||||||
|
ProcessException(DoEx, Token, $"data downloading error [{URL}]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub DownloadPosts(ByVal Token As CancellationToken)
|
||||||
|
Dim URL$ = String.Empty
|
||||||
|
Dim _DownloadComplete As Boolean = False
|
||||||
|
Dim _Index% = 0
|
||||||
|
Try
|
||||||
|
Do While Not _DownloadComplete
|
||||||
|
If Not Ready() Then Thread.Sleep(10000) : ThrowAny(Token) : Continue Do
|
||||||
|
ReconfigureAwaiter()
|
||||||
|
|
||||||
|
Try
|
||||||
|
Dim r$
|
||||||
|
Dim j As EContainer, jj As EContainer
|
||||||
|
Dim _MediaObtained As Boolean
|
||||||
|
If _SavedPostsIDs.Count > 0 And _Index <= _SavedPostsIDs.Count - 1 Then
|
||||||
|
Dim e As New ErrorsDescriber(EDP.ThrowException)
|
||||||
|
For i% = _Index To _SavedPostsIDs.Count - 1
|
||||||
|
_Index = i
|
||||||
|
URL = $"https://instagram.com/p/{_SavedPostsIDs(i)}/?__a=1"
|
||||||
|
ThrowAny(Token)
|
||||||
|
NextRequest((i + 1 Mod 5) = 0)
|
||||||
|
ThrowAny(Token)
|
||||||
|
r = Responser.GetResponse(URL,, e)
|
||||||
|
Settings(Sites.Instagram).InstagramTooManyRequests(False)
|
||||||
|
RequestsCount += 1
|
||||||
|
If Not r.IsEmptyString Then
|
||||||
|
j = JsonDocument.Parse(r)
|
||||||
|
If Not j Is Nothing Then
|
||||||
|
_MediaObtained = False
|
||||||
|
If j.Contains({"graphql", "shortcode_media"}) Then
|
||||||
|
With j({"graphql", "shortcode_media"}).XmlIfNothing
|
||||||
|
If .Count > 0 Then ObtainMedia(.Self, _SavedPostsIDs(i), String.Empty) : _MediaObtained = True
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
If Not _MediaObtained AndAlso j.Contains("items") Then
|
||||||
|
With j("items")
|
||||||
|
If .Count > 0 Then
|
||||||
|
For Each jj In .Self : ObtainMedia2(jj, _SavedPostsIDs(i)) : Next
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
j.Dispose()
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
_DownloadComplete = True
|
||||||
|
End If
|
||||||
|
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
||||||
|
Exit Do
|
||||||
|
Catch dex As ObjectDisposedException When Disposed
|
||||||
|
Exit Do
|
||||||
|
Catch ex As Exception
|
||||||
|
If DownloadingException(ex, $"downloading saved posts error [{URL}]") = 1 Then Continue Do Else Exit Do
|
||||||
|
End Try
|
||||||
|
Loop
|
||||||
|
Catch oex2 As OperationCanceledException When Token.IsCancellationRequested Or oex2.HelpLink = InstAborted
|
||||||
|
If oex2.HelpLink = InstAborted Then HasError = True
|
||||||
|
Catch DoEx As Exception
|
||||||
|
ProcessException(DoEx, Token, $"downloading saved posts error [{URL}]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub ObtainMedia(ByVal node As EContainer, ByVal PostID As String, ByVal PostDate As String)
|
||||||
|
Dim CreateMedia As Action(Of EContainer) =
|
||||||
|
Sub(ByVal e As EContainer)
|
||||||
|
Dim t As UTypes = If(e.Value("is_video").FromXML(Of Boolean)(False), UTypes.Video, UTypes.Picture)
|
||||||
|
Dim tmpValue$
|
||||||
|
If t = UTypes.Picture Then
|
||||||
|
tmpValue = e.Value("display_url")
|
||||||
|
Else
|
||||||
|
tmpValue = e.Value("video_url")
|
||||||
|
End If
|
||||||
|
If Not tmpValue.IsEmptyString Then _TempMediaList.ListAddValue(MediaFromData(t, tmpValue, PostID, PostDate), LNC)
|
||||||
|
End Sub
|
||||||
|
If node.Contains({"edge_sidecar_to_children", "edges"}) Then
|
||||||
|
For Each edge As EContainer In node({"edge_sidecar_to_children", "edges"}) : CreateMedia(edge("node").XmlIfNothing) : Next
|
||||||
|
Else
|
||||||
|
CreateMedia(node)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub ObtainMedia2(ByVal n As EContainer, ByVal PostID As String)
|
||||||
|
Try
|
||||||
|
Dim img As Predicate(Of EContainer) = Function(_img) Not _img.Name.IsEmptyString AndAlso _img.Name.StartsWith("image_versions") AndAlso _img.Count > 0
|
||||||
|
Dim vid As Predicate(Of EContainer) = Function(_vid) Not _vid.Name.IsEmptyString AndAlso _vid.Name.StartsWith("video_versions") AndAlso _vid.Count > 0
|
||||||
|
Dim ss As Func(Of EContainer, Sizes) = Function(_ss) New Sizes(_ss.Value("width"), _ss.Value("url"))
|
||||||
|
If n.Count > 0 Then
|
||||||
|
Dim l As New List(Of Sizes)
|
||||||
|
Dim d As EContainer
|
||||||
|
Dim t%
|
||||||
|
'8 - gallery
|
||||||
|
'2 - one video
|
||||||
|
'1 - one picture
|
||||||
|
t = n.Value("media_type").FromXML(Of Integer)(-1)
|
||||||
|
If t >= 0 Then
|
||||||
|
Select Case t
|
||||||
|
Case 1
|
||||||
|
If n.Contains(img) Then
|
||||||
|
t = n.Value("media_type").FromXML(Of Integer)(-1)
|
||||||
|
If t >= 0 Then
|
||||||
|
With n.ItemF({img, "candidates"}).XmlIfNothing
|
||||||
|
If .Count > 0 Then
|
||||||
|
l.Clear()
|
||||||
|
l.ListAddList(.Select(ss), LNC)
|
||||||
|
If l.Count > 0 Then
|
||||||
|
l.Sort()
|
||||||
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, l.First.Data, PostID, Nothing), LNC)
|
||||||
|
l.Clear()
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Case 2
|
||||||
|
If n.Contains(vid) Then
|
||||||
|
With n.ItemF({vid}).XmlIfNothing
|
||||||
|
If .Count > 0 Then
|
||||||
|
l.Clear()
|
||||||
|
l.ListAddList(.Select(ss), LNC)
|
||||||
|
If l.Count > 0 Then
|
||||||
|
l.Sort()
|
||||||
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.Video, l.First.Data, PostID, Nothing), LNC)
|
||||||
|
l.Clear()
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
Case 8
|
||||||
|
With n("carousel_media").XmlIfNothing
|
||||||
|
If .Count > 0 Then
|
||||||
|
For Each d In .Self : ObtainMedia2(d, PostID) : Next
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End Select
|
||||||
|
End If
|
||||||
|
l.Clear()
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendInLog, ex, "API.Instagram.GetGallery")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub GetUserId()
|
||||||
|
Try
|
||||||
|
Dim r$ = Responser.GetResponse($"https://www.instagram.com/{Name}/?__a=1",, EDP.ThrowException)
|
||||||
|
If Not r.IsEmptyString Then
|
||||||
|
Using j As EContainer = JsonDocument.Parse(r).XmlIfNothing
|
||||||
|
ID = j({"graphql", "user"}, "id").XmlIfNothingValue
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
If Responser.StatusCode = HttpStatusCode.NotFound Or Responser.StatusCode = HttpStatusCode.BadRequest Then
|
||||||
|
Throw ex
|
||||||
|
Else
|
||||||
|
LogError(ex, "get Instagram user id")
|
||||||
|
End If
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken)
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken)
|
||||||
|
DownloadContentDefault(Token)
|
||||||
|
End Sub
|
||||||
|
''' <summary>
|
||||||
|
''' <inheritdoc cref="UserDataBase.DownloadingException(Exception, String)"/><br/>
|
||||||
|
''' 1 - continue
|
||||||
|
''' </summary>
|
||||||
|
Protected Overrides Function DownloadingException(ByVal ex As Exception, ByVal Message As String, Optional ByVal FromPE As Boolean = False) As Integer
|
||||||
|
If Responser.StatusCode = HttpStatusCode.NotFound Then
|
||||||
|
UserExists = False
|
||||||
|
ElseIf Responser.StatusCode = HttpStatusCode.BadRequest Then
|
||||||
|
HasError = True
|
||||||
|
MyMainLOG = "Instagram credentials have expired"
|
||||||
|
Settings(Sites.Instagram).InstaHashUpdateRequired.Value = True
|
||||||
|
ElseIf Responser.StatusCode = 429 Then
|
||||||
|
With Settings(Sites.Instagram)
|
||||||
|
Dim WaiterExists As Boolean = .InstagramLastApplyingValue.HasValue
|
||||||
|
.InstagramTooManyRequests(True)
|
||||||
|
If Not WaiterExists Then .InstagramLastApplyingValue = 2
|
||||||
|
End With
|
||||||
|
Caught429 = True
|
||||||
|
MyMainLOG = $"Number of requests before error 429: {RequestsCount}"
|
||||||
|
Return 1
|
||||||
|
Else
|
||||||
|
Settings(Sites.Instagram).InstaHashUpdateRequired.Value = True
|
||||||
|
If Not FromPE Then LogError(ex, Message) : HasError = True
|
||||||
|
Return 0
|
||||||
|
End If
|
||||||
|
Return 2
|
||||||
|
End Function
|
||||||
|
Private Shared Function MediaFromData(ByVal t As UTypes, ByVal _URL As String, ByVal PostID As String, ByVal PostDate As String) As UserMedia
|
||||||
|
_URL = LinkFormatterSecure(RegexReplace(_URL.Replace("\", String.Empty), LinkPattern))
|
||||||
|
Dim m As New UserMedia(_URL, t) With {.Post = New UserPost With {.ID = PostID}}
|
||||||
|
If Not m.URL.IsEmptyString Then m.File = CStr(RegexReplace(m.URL, FilesPattern))
|
||||||
|
If Not PostDate.IsEmptyString Then m.Post.Date = AConvert(Of Date)(PostDate, DateProvider, Nothing) Else m.Post.Date = Nothing
|
||||||
|
Return m
|
||||||
|
End Function
|
||||||
|
Friend Shared Function GetVideoInfo(ByVal URL As String) As IEnumerable(Of UserMedia)
|
||||||
|
Try
|
||||||
|
If Not URL.IsEmptyString AndAlso URL.Contains("instagram.com") Then
|
||||||
|
Dim PID$ = RegexReplace(URL, RParams.DMS(".*?instagram.com/p/([_\w\d]+)", 1))
|
||||||
|
If Not PID.IsEmptyString Then
|
||||||
|
Using t As New UserData
|
||||||
|
t.Responser = New PersonalUtilities.Tools.WEB.Response
|
||||||
|
t.Responser.Copy(Settings(Sites.Instagram).Responser)
|
||||||
|
t._SavedPostsIDs.Add(PID)
|
||||||
|
t.DownloadPosts(Nothing)
|
||||||
|
Return ListAddList(Nothing, t._TempMediaList)
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Return Nothing
|
||||||
|
Catch ex As Exception
|
||||||
|
Return ErrorsDescriber.Execute(EDP.ShowMainMsg + EDP.SendInLog, ex, "Instagram standalone downloader: fetch media error")
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||||
|
If Not disposedValue And disposing Then _SavedPostsIDs.Clear()
|
||||||
|
MyBase.Dispose(disposing)
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
@@ -1,19 +1,273 @@
|
|||||||
Imports PersonalUtilities.Tools
|
' 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.Tools
|
||||||
Imports PersonalUtilities.Forms.Toolbars
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
Imports PersonalUtilities.Functions.XML
|
Imports PersonalUtilities.Functions.XML
|
||||||
Imports SCrawler.API.Base
|
Imports SCrawler.API.Base
|
||||||
|
Imports System.Threading
|
||||||
Namespace API.Reddit
|
Namespace API.Reddit
|
||||||
Friend Class Channel : Implements ICollection(Of UserPost), IEquatable(Of Channel), IComparable(Of Channel),
|
Friend Class Channel : Implements ICollection(Of UserPost), IEquatable(Of Channel), IComparable(Of Channel),
|
||||||
IRangeSwitcherContainer(Of UserPost), ILoaderSaver, IMyEnumerator(Of UserPost), IChannelLimits, IDisposable
|
IRangeSwitcherContainer(Of UserPost), ILoaderSaver, IMyEnumerator(Of UserPost), IChannelLimits, IUserData, IDisposable
|
||||||
#Region "XML Nodes' Names"
|
#Region "XML Nodes' Names"
|
||||||
Private Const Name_Name As String = "Name"
|
Private Const Name_Name As String = "Name"
|
||||||
Private Const Name_ID As String = "ID"
|
Private Const Name_ID As String = "ID"
|
||||||
Private Const Name_Date As String = "Date"
|
Private Const Name_Date As String = "Date"
|
||||||
Private Const Name_PostsNode As String = "Posts"
|
Private Const Name_PostsNode As String = "Posts"
|
||||||
|
Private Const Name_UsersAdded As String = "UsersAdded"
|
||||||
|
Private Const Name_PostsDownloaded As String = "PostsDownloaded"
|
||||||
#End Region
|
#End Region
|
||||||
Friend Const DefaultDownloadLimitCount As Integer = 1000
|
Friend Const DefaultDownloadLimitCount As Integer = 1000
|
||||||
Friend Property Name As String = String.Empty
|
#Region "IUserData Support"
|
||||||
Friend Property ID As String = String.Empty
|
Private Event OnUserUpdated As IUserData.OnUserUpdatedEventHandler Implements IUserData.OnUserUpdated
|
||||||
|
Friend Property Instance As IUserData
|
||||||
|
Private Property IUserData_ParseUserMediaOnly As Boolean = False Implements IUserData.ParseUserMediaOnly
|
||||||
|
Private Property IUserData_Exists As Boolean Implements IUserData.Exists
|
||||||
|
Get
|
||||||
|
Return Instance.Exists
|
||||||
|
End Get
|
||||||
|
Set(ByVal e As Boolean)
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_Suspended As Boolean Implements IUserData.Suspended
|
||||||
|
Get
|
||||||
|
Return Instance.Suspended
|
||||||
|
End Get
|
||||||
|
Set(ByVal s As Boolean)
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_IsCollection As Boolean Implements IUserData.IsCollection
|
||||||
|
Get
|
||||||
|
Return Instance.IsCollection
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_CollectionName As String Implements IUserData.CollectionName
|
||||||
|
Get
|
||||||
|
Return Instance.CollectionName
|
||||||
|
End Get
|
||||||
|
Set(ByVal NewName As String)
|
||||||
|
Instance.CollectionName = NewName
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_IncludedInCollection As Boolean Implements IUserData.IncludedInCollection
|
||||||
|
Get
|
||||||
|
Return Instance.IncludedInCollection
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_Labels As List(Of String) Implements IUserData.Labels
|
||||||
|
Get
|
||||||
|
Return Instance.Labels
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_IsChannel As Boolean = True Implements IUserData.IsChannel
|
||||||
|
Private Property IUserData_ReadyForDownload As Boolean Implements IUserData.ReadyForDownload
|
||||||
|
Get
|
||||||
|
Return Instance.ReadyForDownload
|
||||||
|
End Get
|
||||||
|
Set(ByVal IsReady As Boolean)
|
||||||
|
Instance.ReadyForDownload = IsReady
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_File As SFile Implements IUserData.File
|
||||||
|
Get
|
||||||
|
Return Instance.File
|
||||||
|
End Get
|
||||||
|
Set(ByVal NewFile As SFile)
|
||||||
|
Instance.File = NewFile
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_FileExists As Boolean Implements IUserData.FileExists
|
||||||
|
Get
|
||||||
|
Return Instance.FileExists
|
||||||
|
End Get
|
||||||
|
Set(ByVal IsExists As Boolean)
|
||||||
|
Instance.FileExists = IsExists
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_DownloadedPictures As Integer Implements IUserData.DownloadedPictures
|
||||||
|
Get
|
||||||
|
Return Instance.DownloadedPictures
|
||||||
|
End Get
|
||||||
|
Set(ByVal c As Integer)
|
||||||
|
Instance.DownloadedPictures = c
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_DownloadedVideos As Integer Implements IUserData.DownloadedVideos
|
||||||
|
Get
|
||||||
|
Return Instance.DownloadedVideos
|
||||||
|
End Get
|
||||||
|
Set(ByVal c As Integer)
|
||||||
|
Instance.DownloadedVideos = c
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_DownloadedTotal(Optional Total As Boolean = True) As Integer Implements IUserData.DownloadedTotal
|
||||||
|
Get
|
||||||
|
Return Instance.DownloadedTotal
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_DownloadedInformation As String Implements IUserData.DownloadedInformation
|
||||||
|
Get
|
||||||
|
Return Instance.DownloadedInformation
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_HasError As Boolean Implements IUserData.HasError
|
||||||
|
Get
|
||||||
|
Return Instance.HasError
|
||||||
|
End Get
|
||||||
|
Set(ByVal e As Boolean)
|
||||||
|
Instance.HasError = e
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_FitToAddParams As Boolean Implements IUserData.FitToAddParams
|
||||||
|
Get
|
||||||
|
Return Instance.FitToAddParams
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_LVIKey As String Implements IUserData.LVIKey
|
||||||
|
Get
|
||||||
|
Return Instance.LVIKey
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_LVIIndex As Integer Implements IUserData.LVIIndex
|
||||||
|
Get
|
||||||
|
Return Instance.LVIIndex
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_DownloadImages As Boolean Implements IUserData.DownloadImages
|
||||||
|
Get
|
||||||
|
Return Instance.DownloadImages
|
||||||
|
End Get
|
||||||
|
Set(ByVal d As Boolean)
|
||||||
|
Instance.DownloadImages = d
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_DownloadVideos As Boolean Implements IUserData.DownloadVideos
|
||||||
|
Get
|
||||||
|
Return Instance.DownloadVideos
|
||||||
|
End Get
|
||||||
|
Set(ByVal d As Boolean)
|
||||||
|
Instance.DownloadVideos = d
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Property IUserData_Self As IUserData Implements IUserData.Self
|
||||||
|
Get
|
||||||
|
Return Instance
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_DownloadTopCount As Integer? Implements IUserData.DownloadTopCount
|
||||||
|
Get
|
||||||
|
Return Instance.DownloadTopCount
|
||||||
|
End Get
|
||||||
|
Set(ByVal c As Integer?)
|
||||||
|
Instance.DownloadTopCount = c
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Friend Property Site As Sites = Sites.Reddit Implements IContentProvider.Site
|
||||||
|
Private Property IUserData_FriendlyName As String Implements IContentProvider.FriendlyName
|
||||||
|
Get
|
||||||
|
Return Instance.FriendlyName
|
||||||
|
End Get
|
||||||
|
Set(ByVal NewName As String)
|
||||||
|
Instance.FriendlyName = NewName
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_Description As String Implements IContentProvider.Description
|
||||||
|
Get
|
||||||
|
Return Instance.Description
|
||||||
|
End Get
|
||||||
|
Set(ByVal d As String)
|
||||||
|
Instance.Description = d
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_Favorite As Boolean Implements IContentProvider.Favorite
|
||||||
|
Get
|
||||||
|
Return Instance.Favorite
|
||||||
|
End Get
|
||||||
|
Set(ByVal f As Boolean)
|
||||||
|
Instance.Favorite = f
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Property IUserData_Temporary As Boolean Implements IContentProvider.Temporary
|
||||||
|
Get
|
||||||
|
Return Instance.Temporary
|
||||||
|
End Get
|
||||||
|
Set(ByVal t As Boolean)
|
||||||
|
Instance.Temporary = t
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Sub IUserData_SetPicture(ByVal f As SFile) Implements IUserData.SetPicture
|
||||||
|
Instance.SetPicture(f)
|
||||||
|
End Sub
|
||||||
|
Private Sub IUserData_LoadUserInformation() Implements IUserData.LoadUserInformation
|
||||||
|
Instance.LoadUserInformation()
|
||||||
|
End Sub
|
||||||
|
Private Sub IUserData_UpdateUserInformation() Implements IUserData.UpdateUserInformation
|
||||||
|
Instance.UpdateUserInformation()
|
||||||
|
End Sub
|
||||||
|
Private Sub IUserData_OpenFolder() Implements IUserData.OpenFolder
|
||||||
|
Instance.OpenFolder()
|
||||||
|
End Sub
|
||||||
|
Private Sub IUserData_OpenSite() Implements IContentProvider.OpenSite
|
||||||
|
Instance.OpenSite()
|
||||||
|
End Sub
|
||||||
|
Private Sub IUserData_DownloadData(ByVal Token As CancellationToken) Implements IContentProvider.DownloadData
|
||||||
|
DownloadData(Token, False, Nothing)
|
||||||
|
End Sub
|
||||||
|
Private Function IUserData_GetPicture() As Image Implements IUserData.GetPicture
|
||||||
|
Return Instance.GetPicture()
|
||||||
|
End Function
|
||||||
|
Private Function IUserData_GetLVI(ByVal Destination As ListView) As ListViewItem Implements IUserData.GetLVI
|
||||||
|
Return Instance.GetLVI(Destination)
|
||||||
|
End Function
|
||||||
|
Private Function IUserData_GetLVIGroup(ByVal Destination As ListView) As ListViewGroup Implements IUserData.GetLVIGroup
|
||||||
|
Return Instance.GetLVIGroup(Destination)
|
||||||
|
End Function
|
||||||
|
Private Function IUserData_Delete() As Integer Implements IUserData.Delete
|
||||||
|
Return DirectCast(Instance, UserDataBase).DeleteF(Me)
|
||||||
|
End Function
|
||||||
|
Private Function IUserData_MoveFiles(ByVal CollectionName As String) As Boolean Implements IUserData.MoveFiles
|
||||||
|
Return DirectCast(Instance, UserDataBase).MoveFilesF(Me, CollectionName)
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
|
Private _Name As String = String.Empty
|
||||||
|
Friend Property Name As String Implements IUserData.Name
|
||||||
|
Get
|
||||||
|
If IsRegularChannel Then
|
||||||
|
Return Instance.Name
|
||||||
|
Else
|
||||||
|
Return _Name
|
||||||
|
End If
|
||||||
|
End Get
|
||||||
|
Set(ByVal NewName As String)
|
||||||
|
If IsRegularChannel Then
|
||||||
|
Instance.Name = NewName
|
||||||
|
Else
|
||||||
|
_Name = NewName
|
||||||
|
End If
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private _ID As String = String.Empty
|
||||||
|
Friend Property ID As String Implements IUserData.ID
|
||||||
|
Get
|
||||||
|
If IsRegularChannel Then
|
||||||
|
Return Instance.ID
|
||||||
|
Else
|
||||||
|
Return _ID
|
||||||
|
End If
|
||||||
|
End Get
|
||||||
|
Set(ByVal NewID As String)
|
||||||
|
If IsRegularChannel Then
|
||||||
|
Instance.ID = NewID
|
||||||
|
Else
|
||||||
|
_ID = NewID
|
||||||
|
End If
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
Friend ReadOnly Property CUser As UserInfo
|
Friend ReadOnly Property CUser As UserInfo
|
||||||
Get
|
Get
|
||||||
Return New UserInfo(Me)
|
Return New UserInfo(Me)
|
||||||
@@ -59,6 +313,31 @@ Namespace API.Reddit
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Private ReadOnly Property Range As RangeSwitcher(Of UserPost)
|
Private ReadOnly Property Range As RangeSwitcher(Of UserPost)
|
||||||
|
Friend ReadOnly Property CountOfAddedUsers As List(Of Integer)
|
||||||
|
Friend ReadOnly Property CountOfLoadedPostsPerSession As List(Of Integer)
|
||||||
|
Private _FirstUserAdded As Boolean = False
|
||||||
|
Friend Sub UserAdded(Optional ByVal IsAdded As Boolean = True)
|
||||||
|
If Not _FirstUserAdded Then CountOfAddedUsers.Add(0) : _FirstUserAdded = True
|
||||||
|
Dim v% = CountOfAddedUsers.Last
|
||||||
|
v += IIf(IsAdded, 1, -1)
|
||||||
|
If v < 0 Then v = 0
|
||||||
|
CountOfAddedUsers(CountOfAddedUsers.Count - 1) = v
|
||||||
|
End Sub
|
||||||
|
Friend Function GetChannelStats(ByVal Extended As Boolean) As String
|
||||||
|
Dim s$ = String.Empty
|
||||||
|
Dim p As New ANumbers With {.FormatOptions = ANumbers.Options.GroupIntegral}
|
||||||
|
If Extended Then
|
||||||
|
s.StringAppendLine($"Users added from this channel: {CountOfAddedUsers.Sum.NumToString(p)}")
|
||||||
|
s.StringAppendLine($"Users added from this channel (avg): {CountOfAddedUsers.DefaultIfEmpty(0).Average.RoundDown.NumToString(p)}")
|
||||||
|
s.StringAppendLine($"Users added from this channel (session): {CountOfAddedUsers.LastOrDefault.NumToString(p)}")
|
||||||
|
s.StringAppendLine($"Posts downloaded (avg): {CountOfLoadedPostsPerSession.DefaultIfEmpty(0).Average.RoundUp.NumToString(p)}")
|
||||||
|
s.StringAppendLine($"Posts downloaded (session): {CountOfLoadedPostsPerSession.LastOrDefault.NumToString(p)}")
|
||||||
|
Else
|
||||||
|
s.StringAppend($"Users: {CountOfAddedUsers.Sum.NumToString(p)} (avg: {CountOfAddedUsers.DefaultIfEmpty(0).Average.RoundDown.NumToString(p)}; s: {CountOfAddedUsers.LastOrDefault.NumToString(p)})")
|
||||||
|
s.StringAppend($"Posts: {CountOfLoadedPostsPerSession.DefaultIfEmpty(0).Average.RoundUp.NumToString(p)} (s: {CountOfLoadedPostsPerSession.LastOrDefault.NumToString(p)})", "; ")
|
||||||
|
End If
|
||||||
|
Return s
|
||||||
|
End Function
|
||||||
#Region "Limits Support"
|
#Region "Limits Support"
|
||||||
Private _DownloadLimitCount As Integer? = Nothing
|
Private _DownloadLimitCount As Integer? = Nothing
|
||||||
Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount
|
Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount
|
||||||
@@ -122,18 +401,31 @@ Namespace API.Reddit
|
|||||||
End Sub
|
End Sub
|
||||||
Friend Property AutoGetLimits As Boolean = True Implements IChannelLimits.AutoGetLimits
|
Friend Property AutoGetLimits As Boolean = True Implements IChannelLimits.AutoGetLimits
|
||||||
#End Region
|
#End Region
|
||||||
|
Friend ReadOnly IsRegularChannel As Boolean = False
|
||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
Posts = New List(Of UserPost)
|
Posts = New List(Of UserPost)
|
||||||
PostsLatest = New List(Of UserPost)
|
PostsLatest = New List(Of UserPost)
|
||||||
Range = New RangeSwitcher(Of UserPost)(Me)
|
Range = New RangeSwitcher(Of UserPost)(Me)
|
||||||
|
CountOfAddedUsers = New List(Of Integer)
|
||||||
|
CountOfLoadedPostsPerSession = New List(Of Integer)
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub New(ByVal f As SFile)
|
Friend Sub New(ByVal f As SFile)
|
||||||
Me.New
|
Me.New
|
||||||
LoadData(f, False)
|
LoadData(f, False)
|
||||||
End Sub
|
End Sub
|
||||||
|
Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True)
|
||||||
|
Me.New
|
||||||
|
Instance = New UserData(u, _LoadUserInformation) With {.SaveToCache = False, .SkipExistsUsers = False, .ChannelInfo = Me}
|
||||||
|
AutoGetLimits = True
|
||||||
|
DirectCast(Instance, UserData).SetLimit(Me)
|
||||||
|
IsRegularChannel = True
|
||||||
|
End Sub
|
||||||
Public Shared Widening Operator CType(ByVal f As SFile) As Channel
|
Public Shared Widening Operator CType(ByVal f As SFile) As Channel
|
||||||
Return New Channel(f)
|
Return New Channel(f)
|
||||||
End Operator
|
End Operator
|
||||||
|
Public Shared Widening Operator CType(ByVal c As Channel) As UserDataBase
|
||||||
|
Return DirectCast(c.Instance, UserDataBase)
|
||||||
|
End Operator
|
||||||
Public Overrides Function ToString() As String
|
Public Overrides Function ToString() As String
|
||||||
If Not Name.IsEmptyString Then
|
If Not Name.IsEmptyString Then
|
||||||
Return Name
|
Return Name
|
||||||
@@ -144,23 +436,28 @@ Namespace API.Reddit
|
|||||||
Friend Sub Delete()
|
Friend Sub Delete()
|
||||||
If File.Exists Then File.Delete()
|
If File.Exists Then File.Delete()
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub DownloadData(ByVal Token As Threading.CancellationToken, Optional ByVal SkipExists As Boolean = True,
|
Friend Sub DownloadData(ByVal Token As CancellationToken, Optional ByVal SkipExists As Boolean = True,
|
||||||
Optional ByVal p As MyProgress = Nothing)
|
Optional ByVal p As MyProgress = Nothing)
|
||||||
Try
|
Try
|
||||||
_Downloading = True
|
_Downloading = True
|
||||||
Using d As New UserData(CUser, False, False) With {
|
If Not Instance Is Nothing Then
|
||||||
.Progress = p,
|
Instance.DownloadData(Token)
|
||||||
.SaveToCache = True,
|
Else
|
||||||
.SkipExistsUsers = SkipExists,
|
Using d As New UserData(CUser, False, False) With {
|
||||||
.ChannelInfo = Me
|
.Progress = p,
|
||||||
}
|
.SaveToCache = True,
|
||||||
d.SetLimit(Me)
|
.SkipExistsUsers = SkipExists,
|
||||||
d.DownloadData(Token)
|
.ChannelInfo = Me
|
||||||
Posts.ListAddList(d.GetNewChannelPosts(), LAP.NotContainsOnly)
|
}
|
||||||
Posts.Sort()
|
d.SetLimit(Me)
|
||||||
LatestParsedDate = If(Posts.FirstOrDefault(Function(pp) pp.Date.HasValue).Date, LatestParsedDate)
|
d.DownloadData(Token)
|
||||||
Token.ThrowIfCancellationRequested()
|
Dim b% = Posts.Count
|
||||||
End Using
|
Posts.ListAddList(d.GetNewChannelPosts(), LAP.NotContainsOnly)
|
||||||
|
If Posts.Count - b > 0 Then CountOfLoadedPostsPerSession.Add(Posts.Count - b)
|
||||||
|
Posts.Sort()
|
||||||
|
LatestParsedDate = If(Posts.FirstOrDefault(Function(pp) pp.Date.HasValue).Date, LatestParsedDate)
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
||||||
Finally
|
Finally
|
||||||
_Downloading = False
|
_Downloading = False
|
||||||
@@ -201,26 +498,50 @@ Namespace API.Reddit
|
|||||||
Friend Overloads Function Equals(ByVal Other As Channel) As Boolean Implements IEquatable(Of Channel).Equals
|
Friend Overloads Function Equals(ByVal Other As Channel) As Boolean Implements IEquatable(Of Channel).Equals
|
||||||
Return ID = Other.ID
|
Return ID = Other.ID
|
||||||
End Function
|
End Function
|
||||||
Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean
|
Private Overloads Function Equals(ByVal Other As UserDataBase) As Boolean Implements IEquatable(Of UserDataBase).Equals
|
||||||
If Not Obj Is Nothing Then
|
If Not Instance Is Nothing Then
|
||||||
If TypeOf Obj Is String Then
|
Return Instance.Equals(Other)
|
||||||
Return ID = CStr(Obj)
|
|
||||||
Else
|
|
||||||
Return Equals(DirectCast(Obj, Channel))
|
|
||||||
End If
|
|
||||||
Else
|
Else
|
||||||
Return False
|
Return False
|
||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
|
Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean
|
||||||
|
If Not Obj Is Nothing Then
|
||||||
|
If TypeOf Obj Is String Then
|
||||||
|
Return ID = CStr(Obj)
|
||||||
|
ElseIf TypeOf Obj Is Channel Then
|
||||||
|
Return Equals(DirectCast(Obj, Channel))
|
||||||
|
ElseIf TypeOf Obj Is UserDataBase Then
|
||||||
|
Return Equals(DirectCast(Obj, UserDataBase))
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Return False
|
||||||
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
#Region "IComparable Support"
|
#Region "IComparable Support"
|
||||||
Friend Function CompareTo(ByVal Other As Channel) As Integer Implements IComparable(Of Channel).CompareTo
|
Friend Overloads Function CompareTo(ByVal Other As Channel) As Integer Implements IComparable(Of Channel).CompareTo
|
||||||
If Not Name.IsEmptyString And Not Other.Name.IsEmptyString Then
|
If Not Name.IsEmptyString And Not Other.Name.IsEmptyString Then
|
||||||
Return Name.CompareTo(Other.Name)
|
Return Name.CompareTo(Other.Name)
|
||||||
Else
|
Else
|
||||||
Return ID.CompareTo(Other.ID)
|
Return ID.CompareTo(Other.ID)
|
||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
|
Private Overloads Function CompareTo(ByVal Other As UserDataBase) As Integer Implements IComparable(Of UserDataBase).CompareTo
|
||||||
|
If Not Instance Is Nothing Then
|
||||||
|
Return Instance.CompareTo(Other)
|
||||||
|
Else
|
||||||
|
Return 0
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Private Overloads Function CompareTo(ByVal Obj As Object) As Integer Implements IComparable.CompareTo
|
||||||
|
If TypeOf Obj Is Channel Then
|
||||||
|
Return CompareTo(DirectCast(Obj, Channel))
|
||||||
|
ElseIf TypeOf Obj Is UserDataBase And Not Instance Is Nothing Then
|
||||||
|
Return Instance.CompareTo(Obj)
|
||||||
|
Else
|
||||||
|
Return 0
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
#Region "ILoaderSaver Support"
|
#Region "ILoaderSaver Support"
|
||||||
Friend Overloads Function LoadData(Optional ByVal f As SFile = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean Implements ILoaderSaver.Load
|
Friend Overloads Function LoadData(Optional ByVal f As SFile = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean Implements ILoaderSaver.Load
|
||||||
@@ -228,14 +549,15 @@ Namespace API.Reddit
|
|||||||
End Function
|
End Function
|
||||||
Friend Overloads Function LoadData(ByVal f As SFile, ByVal PartialLoad As Boolean, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean
|
Friend Overloads Function LoadData(ByVal f As SFile, ByVal PartialLoad As Boolean, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean
|
||||||
If f.Exists Then
|
If f.Exists Then
|
||||||
Using x As New XmlFile(f, ProtectionLevels.All, False) With {.XmlReadOnly = True, .AllowSameNames = True}
|
Using x As New XmlFile(f, Protector.Modes.All, False) With {.XmlReadOnly = True, .AllowSameNames = True}
|
||||||
x.LoadData()
|
x.LoadData()
|
||||||
x.DefaultsLoading(False)
|
|
||||||
If x.Count > 0 Then
|
If x.Count > 0 Then
|
||||||
Dim XMLDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
|
Dim XMLDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
|
||||||
Name = x.Value(Name_Name)
|
Name = x.Value(Name_Name)
|
||||||
ID = x.Value(Name_ID)
|
ID = x.Value(Name_ID)
|
||||||
LatestParsedDate = AConvert(Of Date)(x.Value(Name_Date), XMLDateProvider, Nothing)
|
LatestParsedDate = AConvert(Of Date)(x.Value(Name_Date), XMLDateProvider, Nothing)
|
||||||
|
CountOfAddedUsers.ListAddList(x.Value(Name_UsersAdded).StringToList(Of Integer)("|"), LAP.ClearBeforeAdd)
|
||||||
|
CountOfLoadedPostsPerSession.ListAddList(x.Value(Name_PostsDownloaded).StringToList(Of Integer)("|"), LAP.ClearBeforeAdd)
|
||||||
If Not PartialLoad Then
|
If Not PartialLoad Then
|
||||||
With x(Name_PostsNode).XmlIfNothing
|
With x(Name_PostsNode).XmlIfNothing
|
||||||
If .Count > 0 Then .ForEach(Sub(ee) PostsLatest.Add(New UserPost With {
|
If .Count > 0 Then .ForEach(Sub(ee) PostsLatest.Add(New UserPost With {
|
||||||
@@ -251,7 +573,6 @@ Namespace API.Reddit
|
|||||||
Friend Overloads Function Save(Optional ByVal f As SFile = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean Implements ILoaderSaver.Save
|
Friend Overloads Function Save(Optional ByVal f As SFile = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean Implements ILoaderSaver.Save
|
||||||
Dim XMLDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
|
Dim XMLDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
|
||||||
Using x As New XmlFile With {.AllowSameNames = True, .Name = "Channel"}
|
Using x As New XmlFile With {.AllowSameNames = True, .Name = "Channel"}
|
||||||
x.DefaultsLoading(False)
|
|
||||||
x.Add(Name_Name, Name)
|
x.Add(Name_Name, Name)
|
||||||
x.Add(Name_ID, ID)
|
x.Add(Name_ID, ID)
|
||||||
If Posts.Count > 0 Or PostsLatest.Count > 0 Then
|
If Posts.Count > 0 Or PostsLatest.Count > 0 Then
|
||||||
@@ -261,6 +582,8 @@ Namespace API.Reddit
|
|||||||
LatestParsedDate = tmpPostList.FirstOrDefault(Function(pd) pd.Date.HasValue).Date
|
LatestParsedDate = tmpPostList.FirstOrDefault(Function(pd) pd.Date.HasValue).Date
|
||||||
x.Add(Name_Date, AConvert(Of String)(LatestParsedDate, XMLDateProvider, String.Empty))
|
x.Add(Name_Date, AConvert(Of String)(LatestParsedDate, XMLDateProvider, String.Empty))
|
||||||
x.Add(Name_PostsNode, String.Empty)
|
x.Add(Name_PostsNode, String.Empty)
|
||||||
|
x.Add(Name_UsersAdded, CountOfAddedUsers.ListToString(, "|"))
|
||||||
|
x.Add(Name_PostsDownloaded, CountOfLoadedPostsPerSession.ListToString(, "|"))
|
||||||
With x(Name_PostsNode)
|
With x(Name_PostsNode)
|
||||||
tmpPostList.Take(200).ToList.ForEach(Sub(p) .Add(New EContainer("Post",
|
tmpPostList.Take(200).ToList.ForEach(Sub(p) .Add(New EContainer("Post",
|
||||||
String.Empty,
|
String.Empty,
|
||||||
@@ -280,12 +603,20 @@ Namespace API.Reddit
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "IDisposable Support"
|
#Region "IDisposable Support"
|
||||||
Private disposedValue As Boolean = False
|
Private disposedValue As Boolean = False
|
||||||
|
Friend ReadOnly Property Disposed As Boolean Implements IUserData.Disposed
|
||||||
|
Get
|
||||||
|
Return disposedValue
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
|
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
|
||||||
If Not disposedValue Then
|
If Not disposedValue Then
|
||||||
If disposing Then
|
If disposing Then
|
||||||
Posts.Clear()
|
Posts.Clear()
|
||||||
PostsLatest.Clear()
|
PostsLatest.Clear()
|
||||||
|
CountOfAddedUsers.Clear()
|
||||||
|
CountOfLoadedPostsPerSession.Clear()
|
||||||
Range.Dispose()
|
Range.Dispose()
|
||||||
|
If Not Instance Is Nothing Then Instance.Dispose()
|
||||||
If CachePath.Exists(SFO.Path, False) Then CachePath.Delete(SFO.Path, False, False, EDP.SendInLog)
|
If CachePath.Exists(SFO.Path, False) Then CachePath.Delete(SFO.Path, False, False, EDP.SendInLog)
|
||||||
End If
|
End If
|
||||||
disposedValue = True
|
disposedValue = True
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
Imports PersonalUtilities.Tools
|
' 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.Tools
|
||||||
Imports PersonalUtilities.Forms.Toolbars
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
Imports SCrawler.API.Base
|
Imports SCrawler.API.Base
|
||||||
Imports System.Threading
|
Imports System.Threading
|
||||||
@@ -66,7 +74,6 @@ Namespace API.Reddit
|
|||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
Throw New ArgumentException($"Channel ID [{ChannelID}] does not found in channels collection", "ChannelID") With {.HelpLink = 1}
|
Throw New ArgumentException($"Channel ID [{ChannelID}] does not found in channels collection", "ChannelID") With {.HelpLink = 1}
|
||||||
'Return Nothing
|
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Friend Sub DownloadData(ByVal Token As CancellationToken, Optional ByVal SkipExists As Boolean = True,
|
Friend Sub DownloadData(ByVal Token As CancellationToken, Optional ByVal SkipExists As Boolean = True,
|
||||||
@@ -103,7 +110,7 @@ Namespace API.Reddit
|
|||||||
Return Count > 0 AndAlso Channels.Contains(_Item)
|
Return Count > 0 AndAlso Channels.Contains(_Item)
|
||||||
End Function
|
End Function
|
||||||
Friend Function Remove(ByVal _Item As Channel) As Boolean Implements ICollection(Of Channel).Remove
|
Friend Function Remove(ByVal _Item As Channel) As Boolean Implements ICollection(Of Channel).Remove
|
||||||
If Count > 0 Then
|
If Count > 0 And Not _Item Is Nothing Then
|
||||||
Dim i% = Channels.IndexOf(_Item)
|
Dim i% = Channels.IndexOf(_Item)
|
||||||
If i >= 0 Then
|
If i >= 0 Then
|
||||||
With Channels(i) : .Delete() : .Dispose() : End With
|
With Channels(i) : .Delete() : .Dispose() : End With
|
||||||
|
|||||||
@@ -1,32 +1,39 @@
|
|||||||
Imports PersonalUtilities.Functions.XML.Base
|
' 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.Functions.XML.Base
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Namespace API.Reddit
|
Namespace API.Reddit
|
||||||
Friend Module Declarations
|
Friend Module Declarations
|
||||||
Friend ReadOnly JsonNodesJson() As NodeParams = {New NodeParams("posts", True, True, True, True, 3)}
|
Friend ReadOnly JsonNodesJson() As NodeParams = {New NodeParams("posts", True, True, True, True, 3)}
|
||||||
Friend ReadOnly ChannelJsonNodes() As NodeParams = {New NodeParams("data", True, True, True, True, 1),
|
Friend ReadOnly ChannelJsonNodes() As NodeParams = {New NodeParams("data", True, True, True, True, 1),
|
||||||
New NodeParams("children", True, True, True)}
|
New NodeParams("children", True, True, True)}
|
||||||
Friend ReadOnly UrlBasePattern As New RegexStructure("(?<=/)([^/]+?\.[\w]{3,4})(?=(\?|\Z))", True, False)
|
Friend ReadOnly UrlBasePattern As RParams = RParams.DM("(?<=/)([^/]+?\.[\w]{3,4})(?=(\?|\Z))", 0)
|
||||||
Friend ReadOnly VideoRegEx As New RegexStructure("http.{0,1}://[^" & Chr(34) & "]+?mp4", True, False)
|
Friend ReadOnly VideoRegEx As RParams = RParams.DM("http.{0,1}://[^" & Chr(34) & "]+?mp4", 0)
|
||||||
Friend ReadOnly DateProvider As New JsonDate
|
Friend ReadOnly DateProvider As New JsonDate
|
||||||
Friend ReadOnly DateProviderChannel As New JsonDateChannel
|
Friend ReadOnly DateProviderChannel As New JsonDateChannel
|
||||||
Private ReadOnly EUR_PROVIDER As New ANumbers(ANumbers.Modes.EUR)
|
Private ReadOnly EUR_PROVIDER As New ANumbers(ANumbers.Cultures.EUR)
|
||||||
Friend Class JsonDate : Implements ICustomProvider
|
Friend Class JsonDate : Implements ICustomProvider
|
||||||
''' <inheritdoc cref="ADateTime.ParseUnicodeJS(Object, Object, ErrorsDescriber)"/>
|
|
||||||
Friend Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider,
|
Friend 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
|
Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert
|
||||||
Return ADateTime.ParseUnicodeJS(Value, NothingArg, e)
|
Return ADateTime.ParseUnicodeJS(Value, NothingArg, e)
|
||||||
End Function
|
End Function
|
||||||
Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat
|
Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat
|
||||||
Throw New NotImplementedException("GetFormat does not available in this context")
|
Throw New NotImplementedException("GetFormat is not available in this context")
|
||||||
End Function
|
End Function
|
||||||
End Class
|
End Class
|
||||||
Friend Class JsonDateChannel : Implements ICustomProvider
|
Friend Class JsonDateChannel : Implements ICustomProvider
|
||||||
''' <inheritdoc cref="ADateTime.ParseUnicodeJS(Object, Object, ErrorsDescriber)"/>
|
|
||||||
Friend Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider,
|
Friend 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
|
Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert
|
||||||
Return ADateTime.ParseUnicode(AConvert(Of Integer)(Value, EUR_PROVIDER, Value), NothingArg, e)
|
Return ADateTime.ParseUnicode(AConvert(Of Integer)(Value, EUR_PROVIDER, Value), NothingArg, e)
|
||||||
End Function
|
End Function
|
||||||
Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat
|
Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat
|
||||||
Throw New NotImplementedException("GetFormat does not available in this context")
|
Throw New NotImplementedException("GetFormat is not available in this context")
|
||||||
End Function
|
End Function
|
||||||
End Class
|
End Class
|
||||||
End Module
|
End Module
|
||||||
|
|||||||
@@ -1,26 +1,33 @@
|
|||||||
Imports System.Net
|
' 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.Net
|
||||||
Imports SCrawler.API.Reddit.M3U8_Declarations
|
Imports SCrawler.API.Reddit.M3U8_Declarations
|
||||||
Imports PersonalUtilities.Tools.WEB
|
Imports PersonalUtilities.Tools.WEB
|
||||||
Namespace API.Reddit.M3U8_Declarations
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Friend Module M3U8_Declarations
|
|
||||||
Friend ReadOnly BaseUrlPattern As New RegexStructure("([htps:/]{7,8}.+?/.+?)(?=/)", True, False,,,,,, EDP.ReturnValue)
|
|
||||||
Friend ReadOnly PlayListRegEx_1 As New RegexStructure("(#EXT-X-STREAM-INF)(.+)(RESOLUTION=)(\d+)(.+?[\r\n]{1,2})(.+?)([\r\n]{1,2})", True, False,,,
|
|
||||||
RegexReturn.List,, New List(Of String),
|
|
||||||
New ErrorsDescriber(False, False, True, New List(Of String)))
|
|
||||||
Friend ReadOnly PlayListRegEx_2 As New RegexStructure("(?<=#EXT-X-BYTERANGE.+?[\r\n]{1,2})(.+)(?=[\r\n]{0,2})", True, False,,, RegexReturn.List,,
|
|
||||||
New List(Of String),
|
|
||||||
New ErrorsDescriber(False, False, True, New List(Of String)))
|
|
||||||
Friend ReadOnly DPED As New ErrorsDescriber(EDP.SendInLog + EDP.ReturnValue)
|
|
||||||
End Module
|
|
||||||
End Namespace
|
|
||||||
Namespace API.Reddit
|
Namespace API.Reddit
|
||||||
|
Namespace M3U8_Declarations
|
||||||
|
Friend Module M3U8_Declarations
|
||||||
|
Friend ReadOnly BaseUrlPattern As RParams = RParams.DM("([htps:/]{7,8}.+?/.+?)(?=/)", 0, EDP.ReturnValue)
|
||||||
|
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)
|
||||||
|
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 DPED As New ErrorsDescriber(EDP.SendInLog + EDP.ReturnValue)
|
||||||
|
End Module
|
||||||
|
End Namespace
|
||||||
Friend NotInheritable Class M3U8
|
Friend NotInheritable Class M3U8
|
||||||
Private Sub New()
|
Private Sub New()
|
||||||
End Sub
|
End Sub
|
||||||
Private Structure Resolution : Implements IRegExCreator, IComparable(Of Resolution)
|
Private Structure Resolution : Implements IRegExCreator, IComparable(Of Resolution)
|
||||||
Friend File As String
|
Friend File As String
|
||||||
Friend Resolution As Integer
|
Friend Resolution As Integer
|
||||||
Friend Function CreateFromArray(ByVal ParamsArray() As String) As IRegExCreator Implements IRegExCreator.CreateFromArray
|
Friend Function CreateFromArray(ByVal ParamsArray() As String) As Object Implements IRegExCreator.CreateFromArray
|
||||||
If ParamsArray.ArrayExists Then
|
If ParamsArray.ArrayExists Then
|
||||||
File = ParamsArray(0)
|
File = ParamsArray(0)
|
||||||
If ParamsArray.Length > 1 Then Resolution = AConvert(Of Integer)(ParamsArray(1), 0)
|
If ParamsArray.Length > 1 Then Resolution = AConvert(Of Integer)(ParamsArray(1), 0)
|
||||||
@@ -37,7 +44,7 @@ Namespace API.Reddit
|
|||||||
Using w As New WebClient
|
Using w As New WebClient
|
||||||
Dim r$ = w.DownloadString(PlayListURL)
|
Dim r$ = w.DownloadString(PlayListURL)
|
||||||
If Not r.IsEmptyString Then
|
If Not r.IsEmptyString Then
|
||||||
Dim l As List(Of Resolution) = RegexFields(Of Resolution)(r, {PlayListRegEx_1}, {6, 4})
|
Dim l As List(Of Resolution) = FNF.RegexFields(Of Resolution)(r, {PlayListRegEx_1}, {6, 4})
|
||||||
If l.ListExists Then
|
If l.ListExists Then
|
||||||
l.Sort()
|
l.Sort()
|
||||||
Dim pls$ = $"{BaseUrl}/{l.First.File}"
|
Dim pls$ = $"{BaseUrl}/{l.First.File}"
|
||||||
@@ -66,7 +73,7 @@ Namespace API.Reddit
|
|||||||
ConcatFile.Extension = "mp4"
|
ConcatFile.Extension = "mp4"
|
||||||
CachePath = $"{f.PathWithSeparator}_Cache\{SFile.GetDirectories($"{f.PathWithSeparator}_Cache\",,, EDP.ReturnValue).ListIfNothing.Count + 1}\"
|
CachePath = $"{f.PathWithSeparator}_Cache\{SFile.GetDirectories($"{f.PathWithSeparator}_Cache\",,, EDP.ReturnValue).ListIfNothing.Count + 1}\"
|
||||||
If CachePath.Exists(SFO.Path) Then
|
If CachePath.Exists(SFO.Path) Then
|
||||||
Dim p As New SFileNumbers(ConcatFile.Name,,, New ANumbers(ANumbers.Modes.USA) With {.GroupSeparator = String.Empty, .FormatMode = ANumbers.Formats.General})
|
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.ReturnValue)
|
||||||
Dim i%
|
Dim i%
|
||||||
Dim eFiles As New List(Of SFile)
|
Dim eFiles As New List(Of SFile)
|
||||||
|
|||||||
33
SCrawler/API/Reddit/ProfileSaved.vb
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
' 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 SCrawler.API.Base
|
||||||
|
Imports System.Threading
|
||||||
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
|
Namespace API.Reddit
|
||||||
|
Friend NotInheritable Class ProfileSaved
|
||||||
|
Friend Shared ReadOnly Property DataPath As SFile = Settings(Sites.Reddit).SavedPostsPath
|
||||||
|
Private Sub New()
|
||||||
|
End Sub
|
||||||
|
Friend Shared Sub Download(ByRef Bar As MyProgress, ByVal Token As CancellationToken)
|
||||||
|
Try
|
||||||
|
Dim u As New UserInfo(Settings(Sites.Reddit).SavedPostsUserName.Value, Sites.Reddit) With {.IsChannel = True, .SpecialPath = DataPath}
|
||||||
|
u.UpdateUserFile()
|
||||||
|
Using user As New UserData(u,, False)
|
||||||
|
DirectCast(user.Self, UserDataBase).IsSavedPosts = True
|
||||||
|
user.Progress = Bar
|
||||||
|
If Not user.FileExists Then user.UpdateUserInformation()
|
||||||
|
user.DownloadData(Token)
|
||||||
|
Bar.InformationTemporary = $"Images: {user.DownloadedPictures}; Videos: {user.DownloadedVideos}"
|
||||||
|
End Using
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendInLog, ex, "[API.Reddit.ProfileSaved.Download]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
@@ -1,5 +1,13 @@
|
|||||||
Imports PersonalUtilities.Functions.XML
|
' Copyright (C) 2022 Andy
|
||||||
Imports PersonalUtilities.Forms.Toolbars
|
' 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.Functions.XML
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Imports PersonalUtilities.Tools.ImageRenderer
|
Imports PersonalUtilities.Tools.ImageRenderer
|
||||||
Imports PersonalUtilities.Tools.WebDocuments.JSON
|
Imports PersonalUtilities.Tools.WebDocuments.JSON
|
||||||
Imports System.Net
|
Imports System.Net
|
||||||
@@ -42,31 +50,34 @@ Namespace API.Reddit
|
|||||||
Select c.Post) Else Return Nothing
|
Select c.Post) Else Return Nothing
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
Private _Progress As MyProgress
|
|
||||||
Friend Property Progress As MyProgress
|
|
||||||
Get
|
|
||||||
If _Progress Is Nothing Then Return MainProgress Else Return _Progress
|
|
||||||
End Get
|
|
||||||
Set(ByVal p As MyProgress)
|
|
||||||
_Progress = p
|
|
||||||
End Set
|
|
||||||
End Property
|
|
||||||
#Region "Initializers"
|
#Region "Initializers"
|
||||||
''' <summary>Video downloader initializer</summary>
|
''' <summary>Video downloader initializer</summary>
|
||||||
Private Sub New()
|
Private Sub New()
|
||||||
|
ChannelPostsNames = New List(Of String)
|
||||||
|
_ExistsUsersNames = New List(Of String)
|
||||||
|
_CrossPosts = New List(Of String)
|
||||||
End Sub
|
End Sub
|
||||||
''' <summary>Default initializer</summary>
|
''' <summary>Default initializer</summary>
|
||||||
Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True, Optional ByVal InvokeImageHandler As Boolean = True)
|
Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True, Optional ByVal InvokeImageHandler As Boolean = True)
|
||||||
MyBase.New(InvokeImageHandler)
|
MyBase.New(InvokeImageHandler)
|
||||||
ChannelPostsNames = New List(Of String)
|
ChannelPostsNames = New List(Of String)
|
||||||
_ExistsUsersNames = New List(Of String)
|
_ExistsUsersNames = New List(Of String)
|
||||||
|
_CrossPosts = New List(Of String)
|
||||||
User = u
|
User = u
|
||||||
If _LoadUserInformation Then LoadUserInformation()
|
If _LoadUserInformation Then LoadUserInformation()
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "Load and Update user info"
|
||||||
|
Protected Overrides Sub LoadUserInformation_OptionalFields(ByRef Container As XmlFile, ByVal Loading As Boolean)
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
#Region "Download Overrides"
|
#Region "Download Overrides"
|
||||||
Friend Overrides Sub DownloadData(ByVal Token As CancellationToken)
|
Friend Overrides Sub DownloadData(ByVal Token As CancellationToken)
|
||||||
If IsChannel Then
|
_CrossPosts.Clear()
|
||||||
|
If Not IsSavedPosts AndAlso (IsChannel AndAlso Not ChannelInfo.IsRegularChannel) Then
|
||||||
|
If Not Responser Is Nothing Then Responser.Dispose()
|
||||||
|
Responser = New PersonalUtilities.Tools.WEB.Response
|
||||||
|
Responser.Copy(Settings(Sites.Reddit).Responser)
|
||||||
ChannelPostsNames.ListAddList(ChannelInfo.PostsAll.Select(Function(p) p.ID), LNC)
|
ChannelPostsNames.ListAddList(ChannelInfo.PostsAll.Select(Function(p) p.ID), LNC)
|
||||||
If SkipExistsUsers Then _ExistsUsersNames.ListAddList(Settings.UsersList.Select(Function(p) p.Name), LNC)
|
If SkipExistsUsers Then _ExistsUsersNames.ListAddList(Settings.UsersList.Select(Function(p) p.Name), LNC)
|
||||||
DownloadDataF(Token)
|
DownloadDataF(Token)
|
||||||
@@ -79,8 +90,21 @@ Namespace API.Reddit
|
|||||||
End Sub
|
End Sub
|
||||||
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
||||||
_TotalPostsDownloaded = 0
|
_TotalPostsDownloaded = 0
|
||||||
If IsChannel Then
|
If IsSavedPosts Then
|
||||||
DownloadDataChannel(String.Empty, Token)
|
DownloadDataChannel(String.Empty, Token)
|
||||||
|
ElseIf IsChannel Then
|
||||||
|
If ChannelInfo.IsRegularChannel Then
|
||||||
|
ChannelPostsNames.ListAddList(_TempPostsList, LNC)
|
||||||
|
If ChannelPostsNames.Count > 0 Then
|
||||||
|
DownloadLimitCount = Nothing
|
||||||
|
With _ContentList.Where(Function(c) c.Post.Date.HasValue)
|
||||||
|
If .Count > 0 Then DownloadLimitDate = .Max(Function(p) p.Post.Date.Value).AddMinutes(-10)
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
If DownloadTopCount.HasValue Then DownloadLimitCount = DownloadTopCount
|
||||||
|
End If
|
||||||
|
DownloadDataChannel(String.Empty, Token)
|
||||||
|
If ChannelInfo.IsRegularChannel Then _TempPostsList.ListAddList(_TempMediaList.Select(Function(m) m.Post.ID), LNC)
|
||||||
Else
|
Else
|
||||||
DownloadDataUser(String.Empty, Token)
|
DownloadDataUser(String.Empty, Token)
|
||||||
End If
|
End If
|
||||||
@@ -88,10 +112,13 @@ Namespace API.Reddit
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Download Functions (User, Channel)"
|
#Region "Download Functions (User, Channel)"
|
||||||
Private _TotalPostsDownloaded As Integer = 0
|
Private _TotalPostsDownloaded As Integer = 0
|
||||||
|
Private ReadOnly _CrossPosts As List(Of String)
|
||||||
Private Sub DownloadDataUser(ByVal POST As String, ByVal Token As CancellationToken)
|
Private Sub DownloadDataUser(ByVal POST As String, ByVal Token As CancellationToken)
|
||||||
|
Const CPRI$ = "crosspostRootId"
|
||||||
|
Const CPPI$ = "crosspostParentId"
|
||||||
Dim URL$ = String.Empty
|
Dim URL$ = String.Empty
|
||||||
Try
|
Try
|
||||||
Dim PostID$ = String.Empty
|
Dim PostID$ = String.Empty, PostTmp$ = String.Empty
|
||||||
Dim PostDate$
|
Dim PostDate$
|
||||||
Dim n As EContainer, nn As EContainer, s As EContainer
|
Dim n As EContainer, nn As EContainer, s As EContainer
|
||||||
Dim NewPostDetected As Boolean = False
|
Dim NewPostDetected As Boolean = False
|
||||||
@@ -100,53 +127,69 @@ Namespace API.Reddit
|
|||||||
Dim added As Boolean
|
Dim added As Boolean
|
||||||
Dim __ItemType$
|
Dim __ItemType$
|
||||||
Dim tmpType As UTypes
|
Dim tmpType As UTypes
|
||||||
Dim CheckNode As Predicate(Of EContainer) = Function(e) e("author").XmlIfNothingValue("/").ToLower.Equals(Name.ToLower)
|
Dim IsCrossPost As Predicate(Of EContainer) = Function(e) Not (e.Value(CPRI).IsEmptyString And e.Value(CPPI).IsEmptyString)
|
||||||
|
Dim CheckNode As Predicate(Of EContainer) = Function(e) Not ParseUserMediaOnly OrElse e("author").XmlIfNothingValue("/").ToLower.Equals(Name.ToLower)
|
||||||
Dim UPicType As Func(Of String, UTypes) = Function(input) IIf(input = "image", UTypes.Picture, UTypes.GIF)
|
Dim UPicType As Func(Of String, UTypes) = Function(input) IIf(input = "image", UTypes.Picture, UTypes.GIF)
|
||||||
|
Dim _PostID As Func(Of String) = Function() IIf(PostTmp.IsEmptyString, PostID, PostTmp)
|
||||||
|
|
||||||
URL = $"https://gateway.reddit.com/desktopapi/v1/user/{Name}/posts?rtj=only&allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic"
|
URL = $"https://gateway.reddit.com/desktopapi/v1/user/{Name}/posts?rtj=only&allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic"
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
Dim r$ = GetSiteResponse(URL)
|
Dim r$ = Responser.GetResponse(URL,, EDP.ThrowException)
|
||||||
If Not r.IsEmptyString Then
|
If Not r.IsEmptyString Then
|
||||||
Using w As EContainer = JsonDocument.Parse(r)
|
Using w As EContainer = JsonDocument.Parse(r).XmlIfNothing
|
||||||
If w.Count > 0 Then
|
If w.Count > 0 Then
|
||||||
n = w.GetNode(JsonNodesJson)
|
n = w.GetNode(JsonNodesJson)
|
||||||
If Not n Is Nothing AndAlso n.Count > 0 Then
|
If Not n Is Nothing AndAlso n.Count > 0 Then
|
||||||
For Each nn In n
|
For Each nn In n
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
If nn.Count > 0 Then
|
If nn.Count > 0 Then
|
||||||
PostID = nn.Name
|
|
||||||
If PostID.IsEmptyString AndAlso nn.Contains("id") Then PostID = nn("id").Value
|
|
||||||
If nn.Contains("created") Then PostDate = nn("created").Value Else PostDate = String.Empty
|
|
||||||
If Not _TempPostsList.Contains(PostID) Then
|
|
||||||
NewPostDetected = True
|
|
||||||
_TempPostsList.Add(PostID)
|
|
||||||
Else
|
|
||||||
ExistsDetected = True
|
|
||||||
Continue For
|
|
||||||
End If
|
|
||||||
If CheckNode(nn) Then
|
If CheckNode(nn) Then
|
||||||
|
|
||||||
|
'Obtain post ID
|
||||||
|
PostTmp = nn.Name
|
||||||
|
If PostTmp.IsEmptyString Then PostTmp = nn.Value("id")
|
||||||
|
If PostTmp.IsEmptyString Then Continue For
|
||||||
|
'Check for CrossPost
|
||||||
|
If IsCrossPost(nn) Then
|
||||||
|
_CrossPosts.ListAddList({nn.Value(CPRI), nn.Value(CPPI)}, LNC)
|
||||||
|
Continue For
|
||||||
|
Else
|
||||||
|
If Not _CrossPosts.Contains(PostTmp) Then PostID = PostTmp : PostTmp = String.Empty
|
||||||
|
End If
|
||||||
|
|
||||||
|
'Download decision
|
||||||
|
If Not _TempPostsList.Contains(_PostID()) Then
|
||||||
|
NewPostDetected = True
|
||||||
|
_TempPostsList.Add(_PostID())
|
||||||
|
Else
|
||||||
|
If Not _CrossPosts.Contains(_PostID()) Then ExistsDetected = True
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
|
If nn.Contains("created") Then PostDate = nn("created").Value Else PostDate = String.Empty
|
||||||
|
|
||||||
_ItemsBefore = _TempMediaList.Count
|
_ItemsBefore = _TempMediaList.Count
|
||||||
added = True
|
added = True
|
||||||
s = nn.ItemF({"source", "url"})
|
s = nn.ItemF({"source", "url"})
|
||||||
If s.XmlIfNothingValue("/").Contains("redgifs.com") Then
|
If s.XmlIfNothingValue("/").Contains("redgifs.com") Then
|
||||||
_TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre, s.Value, PostID, PostDate,, IsChannel), LNC)
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre, s.Value, _PostID(), PostDate,, IsChannel), LNC)
|
||||||
_TotalPostsDownloaded += 1
|
ElseIf Not CreateImgurMedia(s.XmlIfNothingValue, _PostID(), PostDate,, IsChannel) Then
|
||||||
Else
|
|
||||||
s = nn.ItemF({"media"}).XmlIfNothing
|
s = nn.ItemF({"media"}).XmlIfNothing
|
||||||
__ItemType = s("type").XmlIfNothingValue
|
__ItemType = s("type").XmlIfNothingValue
|
||||||
Select Case __ItemType
|
Select Case __ItemType
|
||||||
Case "gallery" : DownloadGallery(s, PostID, PostDate) : _TotalPostsDownloaded += 1
|
Case "gallery" : If Not DownloadGallery(s, _PostID(), PostDate) Then added = False
|
||||||
Case "image", "gifvideo"
|
Case "image", "gifvideo"
|
||||||
If s.Contains("content") Then
|
If s.Contains("content") Then
|
||||||
_TempMediaList.ListAddValue(MediaFromData(UPicType(__ItemType), s.Value("content"),
|
_TempMediaList.ListAddValue(MediaFromData(UPicType(__ItemType), s.Value("content"),
|
||||||
PostID, PostDate,, IsChannel), LNC)
|
_PostID(), PostDate,, IsChannel), LNC)
|
||||||
_TotalPostsDownloaded += 1
|
Else
|
||||||
|
added = False
|
||||||
End If
|
End If
|
||||||
Case "video"
|
Case "video"
|
||||||
If Settings.UseM3U8 AndAlso s("hlsUrl").XmlIfNothingValue("/").ToLower.Contains("m3u8") Then
|
If Settings.UseM3U8 AndAlso s("hlsUrl").XmlIfNothingValue("/").ToLower.Contains("m3u8") Then
|
||||||
_TempMediaList.ListAddValue(MediaFromData(UTypes.m3u8, s.Value("hlsUrl"),
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.m3u8, s.Value("hlsUrl"),
|
||||||
PostID, PostDate,, IsChannel), LNC)
|
_PostID(), PostDate,, IsChannel), LNC)
|
||||||
_TotalPostsDownloaded += 1
|
Else
|
||||||
|
added = False
|
||||||
End If
|
End If
|
||||||
Case Else : added = False
|
Case Else : added = False
|
||||||
End Select
|
End Select
|
||||||
@@ -164,8 +207,7 @@ Namespace API.Reddit
|
|||||||
End Select
|
End Select
|
||||||
End With
|
End With
|
||||||
If Not tmpType = UTypes.Undefined Then
|
If Not tmpType = UTypes.Undefined Then
|
||||||
_TempMediaList.ListAddValue(MediaFromData(tmpType, s.Value, PostID, PostDate,, IsChannel), LNC)
|
_TempMediaList.ListAddValue(MediaFromData(tmpType, s.Value, _PostID(), PostDate,, IsChannel), LNC)
|
||||||
_TotalPostsDownloaded += 1
|
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
@@ -178,11 +220,8 @@ Namespace API.Reddit
|
|||||||
If POST.IsEmptyString And ExistsDetected Then Exit Sub
|
If POST.IsEmptyString And ExistsDetected Then Exit Sub
|
||||||
If Not PostID.IsEmptyString And NewPostDetected Then DownloadDataUser(PostID, Token)
|
If Not PostID.IsEmptyString And NewPostDetected Then DownloadDataUser(PostID, Token)
|
||||||
End If
|
End If
|
||||||
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
|
||||||
Catch dex As ObjectDisposedException When Disposed
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
LogError(ex, $"data downloading error [{URL}]")
|
ProcessException(ex, Token, $"data downloading error [{URL}]")
|
||||||
HasError = True
|
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub DownloadDataChannel(ByVal POST As String, ByVal Token As CancellationToken)
|
Private Sub DownloadDataChannel(ByVal POST As String, ByVal Token As CancellationToken)
|
||||||
@@ -196,9 +235,14 @@ Namespace API.Reddit
|
|||||||
Dim eCount As Predicate(Of EContainer) = Function(e) e.Count > 0
|
Dim eCount As Predicate(Of EContainer) = Function(e) e.Count > 0
|
||||||
Dim lDate As Date?
|
Dim lDate As Date?
|
||||||
|
|
||||||
URL = $"https://reddit.com/r/{Name}/new.json?allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic"
|
If IsSavedPosts Then
|
||||||
|
URL = $"https://www.reddit.com/user/{Name}/saved.json?after={POST}"
|
||||||
|
Else
|
||||||
|
URL = $"https://reddit.com/r/{Name}/new.json?allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic"
|
||||||
|
End If
|
||||||
|
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
Dim r$ = GetSiteResponse(URL)
|
Dim r$ = Responser.GetResponse(URL,, EDP.ThrowException)
|
||||||
If Not r.IsEmptyString Then
|
If Not r.IsEmptyString Then
|
||||||
Using w As EContainer = JsonDocument.Parse(r).XmlIfNothing
|
Using w As EContainer = JsonDocument.Parse(r).XmlIfNothing
|
||||||
If w.Count > 0 Then
|
If w.Count > 0 Then
|
||||||
@@ -240,6 +284,20 @@ Namespace API.Reddit
|
|||||||
_TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC)
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC)
|
||||||
_TotalPostsDownloaded += 1
|
_TotalPostsDownloaded += 1
|
||||||
End If
|
End If
|
||||||
|
ElseIf Not s.Value({"media", "reddit_video"}, "fallback_url").IsEmptyString Then
|
||||||
|
tmpUrl = s.Value({"media", "reddit_video"}, "fallback_url")
|
||||||
|
If SaveToCache Then
|
||||||
|
tmpUrl = s.Value("thumbnail")
|
||||||
|
If Not tmpUrl.IsEmptyString Then
|
||||||
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC)
|
||||||
|
_TotalPostsDownloaded += 1
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre + UTypes.m3u8, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC)
|
||||||
|
_TotalPostsDownloaded += 1
|
||||||
|
End If
|
||||||
|
ElseIf CreateImgurMedia(tmpUrl, PostID, PostDate, _UserID, IsChannel) Then
|
||||||
|
_TotalPostsDownloaded += 1
|
||||||
ElseIf s.Item("media_metadata").XmlIfNothing.Count > 0 Then
|
ElseIf s.Item("media_metadata").XmlIfNothing.Count > 0 Then
|
||||||
DownloadGallery(s, PostID, PostDate, _UserID, SaveToCache)
|
DownloadGallery(s, PostID, PostDate, _UserID, SaveToCache)
|
||||||
_TotalPostsDownloaded += 1
|
_TotalPostsDownloaded += 1
|
||||||
@@ -258,18 +316,53 @@ Namespace API.Reddit
|
|||||||
If POST.IsEmptyString And ExistsDetected Then Exit Sub
|
If POST.IsEmptyString And ExistsDetected Then Exit Sub
|
||||||
If Not PostID.IsEmptyString And NewPostDetected Then DownloadDataChannel(PostID, Token)
|
If Not PostID.IsEmptyString And NewPostDetected Then DownloadDataChannel(PostID, Token)
|
||||||
End If
|
End If
|
||||||
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
|
||||||
Catch dex As ObjectDisposedException When Disposed
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
LogError(ex, $"channel data downloading error [{URL}]")
|
ProcessException(ex, Token, $"channel data downloading error [{URL}]")
|
||||||
HasError = True
|
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Download Base Functions"
|
#Region "Download Base Functions"
|
||||||
Private Sub DownloadGallery(ByVal w As EContainer, ByVal PostID As String, ByVal PostDate As String,
|
Private Function ImgurPicture(ByVal Source As EContainer, ByVal Value As String) As String
|
||||||
Optional ByVal _UserID As String = Nothing, Optional ByVal FirstOnly As Boolean = False)
|
|
||||||
Try
|
Try
|
||||||
|
Dim e As EContainer = Source({"source", "url"}).XmlIfNothing
|
||||||
|
If Not e.IsEmptyString AndAlso e.Value.ToLower.Contains("imgur") Then
|
||||||
|
Return e.Value
|
||||||
|
Else
|
||||||
|
Return Value
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
LogError(ex, "[ImgurPicture]")
|
||||||
|
Return Value
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
Private Function CreateImgurMedia(ByVal _URL As String, ByVal PostID As String, ByVal PostDate As String,
|
||||||
|
Optional ByVal _UserID As String = "", Optional ByVal IsChannel As Boolean = False) As Boolean
|
||||||
|
If Not _URL.IsEmptyString AndAlso _URL.Contains("imgur") Then
|
||||||
|
If _URL.StringContains({".jpg", ".png", ".jpeg"}) Then
|
||||||
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, _URL, PostID, PostDate, _UserID, IsChannel), LNC)
|
||||||
|
ElseIf _URL.Contains(".gifv") Then
|
||||||
|
If SaveToCache Then
|
||||||
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, _URL.Replace(".gifv", ".gif"),
|
||||||
|
PostID, PostDate, _UserID, IsChannel), LNC)
|
||||||
|
Else
|
||||||
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.Video, _URL.Replace(".gifv", ".mp4"),
|
||||||
|
PostID, PostDate, _UserID, IsChannel), LNC)
|
||||||
|
End If
|
||||||
|
ElseIf _URL.Contains(".gif") Then
|
||||||
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.GIF, _URL, PostID, PostDate, _UserID, IsChannel), LNC)
|
||||||
|
Else
|
||||||
|
If Not TryFile(_URL) Then _URL &= ".jpg"
|
||||||
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, _URL, PostID, PostDate, _UserID, IsChannel), LNC)
|
||||||
|
End If
|
||||||
|
Return True
|
||||||
|
Else
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Private Function DownloadGallery(ByVal w As EContainer, ByVal PostID As String, ByVal PostDate As String,
|
||||||
|
Optional ByVal _UserID As String = Nothing, Optional ByVal FirstOnly As Boolean = False) As Boolean
|
||||||
|
Try
|
||||||
|
Dim added As Boolean = False
|
||||||
Dim cn$ = IIf(IsChannel, "media_metadata", "mediaMetadata")
|
Dim cn$ = IIf(IsChannel, "media_metadata", "mediaMetadata")
|
||||||
If Not w Is Nothing AndAlso w(cn).XmlIfNothing.Count > 0 Then
|
If Not w Is Nothing AndAlso w(cn).XmlIfNothing.Count > 0 Then
|
||||||
Dim t As EContainer
|
Dim t As EContainer
|
||||||
@@ -277,27 +370,30 @@ Namespace API.Reddit
|
|||||||
t = n.ItemF({"s", "u"})
|
t = n.ItemF({"s", "u"})
|
||||||
If Not t Is Nothing AndAlso Not t.Value.IsEmptyString Then
|
If Not t Is Nothing AndAlso Not t.Value.IsEmptyString Then
|
||||||
_TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, t.Value, PostID, PostDate, _UserID, IsChannel), LNC)
|
_TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, t.Value, PostID, PostDate, _UserID, IsChannel), LNC)
|
||||||
|
added = True
|
||||||
If FirstOnly Then Exit For
|
If FirstOnly Then Exit For
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
|
Return added
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
LogError(ex, "gallery parsing error")
|
ProcessException(ex, Nothing, "gallery parsing error", False)
|
||||||
HasError = True
|
Return False
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Function
|
||||||
Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken)
|
Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken)
|
||||||
Try
|
Try
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
If _TempMediaList.Count > 0 AndAlso _TempMediaList.Exists(Function(p) p.Type = UTypes.VideoPre) Then
|
Const v2 As UTypes = UTypes.VideoPre + UTypes.m3u8
|
||||||
|
If _TempMediaList.Count > 0 AndAlso _TempMediaList.Exists(Function(p) p.Type = UTypes.VideoPre Or p.Type = v2) Then
|
||||||
Dim r$, v$
|
Dim r$, v$
|
||||||
Dim e As New ErrorsDescriber(EDP.ReturnValue)
|
Dim e As New ErrorsDescriber(EDP.ReturnValue)
|
||||||
Dim m As UserMedia
|
Dim m As UserMedia
|
||||||
For i% = _TempMediaList.Count - 1 To 0 Step -1
|
For i% = _TempMediaList.Count - 1 To 0 Step -1
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
If _TempMediaList(i).Type = UTypes.VideoPre Then
|
If _TempMediaList(i).Type = UTypes.VideoPre Or _TempMediaList(i).Type = v2 Then
|
||||||
m = _TempMediaList(i)
|
m = _TempMediaList(i)
|
||||||
r = GetSiteResponse(m.URL, e)
|
If _TempMediaList(i).Type = UTypes.VideoPre Then r = Responser.GetResponse(m.URL,, e) Else r = m.URL
|
||||||
_TempMediaList(i) = New UserMedia
|
_TempMediaList(i) = New UserMedia
|
||||||
If Not r.IsEmptyString Then
|
If Not r.IsEmptyString Then
|
||||||
v = RegexReplace(r, VideoRegEx)
|
v = RegexReplace(r, VideoRegEx)
|
||||||
@@ -310,19 +406,19 @@ Namespace API.Reddit
|
|||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
|
||||||
Catch dex As ObjectDisposedException When Disposed
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
LogError(ex, "video reparsing error")
|
ProcessException(ex, Token, "video reparsing error", False)
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Friend Shared Function GetVideoInfo(ByVal URL As String) As UserMedia
|
Friend Shared Function GetVideoInfo(ByVal URL As String) As IEnumerable(Of UserMedia)
|
||||||
Try
|
Try
|
||||||
If Not URL.IsEmptyString AndAlso URL.Contains("redgifs") Then
|
If Not URL.IsEmptyString AndAlso URL.Contains("redgifs") Then
|
||||||
Using r As New UserData
|
Using r As New UserData
|
||||||
r._TempMediaList.Add(MediaFromData(UTypes.VideoPre, URL, String.Empty, String.Empty,, False))
|
r._TempMediaList.Add(MediaFromData(UTypes.VideoPre, URL, String.Empty, String.Empty,, False))
|
||||||
|
r.Responser = New PersonalUtilities.Tools.WEB.Response
|
||||||
|
r.Responser.Copy(Settings(Sites.Reddit).Responser)
|
||||||
r.ReparseVideo(Nothing)
|
r.ReparseVideo(Nothing)
|
||||||
If r._TempMediaList.ListExists Then Return r._TempMediaList(0)
|
If r._TempMediaList.ListExists Then Return {r._TempMediaList(0)}
|
||||||
End Using
|
End Using
|
||||||
End If
|
End If
|
||||||
Return Nothing
|
Return Nothing
|
||||||
@@ -344,9 +440,9 @@ Namespace API.Reddit
|
|||||||
End Function
|
End Function
|
||||||
Private Function TryFile(ByVal URL As String) As Boolean
|
Private Function TryFile(ByVal URL As String) As Boolean
|
||||||
Try
|
Try
|
||||||
If Not URL.IsEmptyString AndAlso URL.Contains(".jpg") Then
|
If Not URL.IsEmptyString AndAlso URL.StringContains({".jpg", ".png", ".jpeg"}) Then
|
||||||
Dim f As SFile = CStr(RegexReplace(URL, FilesPattern))
|
Dim f As SFile = CStr(RegexReplace(URL, FilesPattern))
|
||||||
Return Not f.IsEmptyString And Not f.File.IsEmptyString
|
Return Not f.File.IsEmptyString
|
||||||
End If
|
End If
|
||||||
Return False
|
Return False
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
@@ -359,6 +455,8 @@ Namespace API.Reddit
|
|||||||
#End Region
|
#End Region
|
||||||
Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken)
|
Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken)
|
||||||
Try
|
Try
|
||||||
|
Const _RFN$ = "RedditVideo"
|
||||||
|
Const RFN$ = _RFN & "{0}"
|
||||||
Dim i%
|
Dim i%
|
||||||
Dim dCount% = 0, dTotal% = 0
|
Dim dCount% = 0, dTotal% = 0
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
@@ -367,23 +465,38 @@ Namespace API.Reddit
|
|||||||
If _ContentNew.Count > 0 Then
|
If _ContentNew.Count > 0 Then
|
||||||
MyFile.Exists(SFO.Path)
|
MyFile.Exists(SFO.Path)
|
||||||
Dim MyDir$
|
Dim MyDir$
|
||||||
If IsChannel And SaveToCache Then
|
If Not IsSavedPosts AndAlso (IsChannel And SaveToCache) Then
|
||||||
MyDir = ChannelInfo.CachePath.PathNoSeparator
|
MyDir = ChannelInfo.CachePath.PathNoSeparator
|
||||||
Else
|
Else
|
||||||
MyDir = MyFile.CutPath.PathNoSeparator
|
MyDir = MyFile.CutPath.PathNoSeparator
|
||||||
End If
|
End If
|
||||||
|
Dim StartRFN% = 0
|
||||||
|
If _ContentNew.Exists(Function(c) c.Type = UTypes.Video And c.URL.Contains("redd.it")) Then
|
||||||
|
StartRFN = SFile.Indexed_GetMaxIndex($"{MyDir}\{IIf(SeparateVideoFolderF, "Video\", String.Empty)}{_RFN}.mp4",, New SFileNumbers(_RFN, String.Empty), EDP.ReturnValue)
|
||||||
|
End If
|
||||||
Dim HashList As New List(Of String)
|
Dim HashList As New List(Of String)
|
||||||
If _ContentList.Count > 0 Then HashList.ListAddList((From h In _ContentList Where Not h.MD5.IsEmptyString Select h.MD5), LNC)
|
If _ContentList.Count > 0 Then HashList.ListAddList((From h In _ContentList Where Not h.MD5.IsEmptyString Select h.MD5), LNC)
|
||||||
Dim f As SFile
|
Dim f As SFile
|
||||||
Dim v As UserMedia
|
Dim v As UserMedia
|
||||||
Dim cached As Boolean = IsChannel And SaveToCache
|
Dim cached As Boolean = IsChannel And SaveToCache
|
||||||
Dim vsf As Boolean = SeparateVideoFolderF
|
Dim vsf As Boolean = SeparateVideoFolderF
|
||||||
Dim ImgFormat As Imaging.ImageFormat
|
Dim UseMD5 As Boolean = Not IsChannel Or (Not cached And Settings.ChannelsRegularCheckMD5)
|
||||||
Dim bDP As New ErrorsDescriber(EDP.None)
|
Dim bDP As New ErrorsDescriber(EDP.None)
|
||||||
|
Dim ImgurUrls As New List(Of String)
|
||||||
|
Dim TryBytes As Func(Of String, Imaging.ImageFormat, String) =
|
||||||
|
Function(ByVal __URL As String, ByVal ImgFormat As Imaging.ImageFormat) As String
|
||||||
|
Try
|
||||||
|
Return ByteArrayToString(GetMD5(SFile.GetBytesFromNet(__URL, bDP), ImgFormat))
|
||||||
|
Catch hash_ex As Exception
|
||||||
|
Return String.Empty
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
Dim MD5BS As Func(Of String, UTypes,
|
Dim MD5BS As Func(Of String, UTypes,
|
||||||
SFile, Boolean, String) = Function(ByVal __URL As String, ByVal __MT As UTypes,
|
SFile, Boolean, String) = Function(ByVal __URL As String, ByVal __MT As UTypes,
|
||||||
ByVal __File As SFile, ByVal __IsBase As Boolean) As String
|
ByVal __File As SFile, ByVal __IsBase As Boolean) As String
|
||||||
Try
|
Try
|
||||||
|
ImgurUrls.Clear()
|
||||||
|
Dim ImgFormat As Imaging.ImageFormat
|
||||||
If __MT = UTypes.GIF Then
|
If __MT = UTypes.GIF Then
|
||||||
ImgFormat = Imaging.ImageFormat.Gif
|
ImgFormat = Imaging.ImageFormat.Gif
|
||||||
ElseIf __IsBase Then
|
ElseIf __IsBase Then
|
||||||
@@ -391,7 +504,27 @@ Namespace API.Reddit
|
|||||||
Else
|
Else
|
||||||
ImgFormat = GetImageFormat(__File)
|
ImgFormat = GetImageFormat(__File)
|
||||||
End If
|
End If
|
||||||
Return ByteArrayToString(GetMD5(SFile.GetBytesFromNet(__URL, bDP), ImgFormat))
|
|
||||||
|
Dim tmpBytes$ = TryBytes(__URL, ImgFormat)
|
||||||
|
If tmpBytes.IsEmptyString And Not __MT = UTypes.GIF Then
|
||||||
|
ImgFormat = Imaging.ImageFormat.Png
|
||||||
|
tmpBytes = TryBytes(__URL, ImgFormat)
|
||||||
|
If Not tmpBytes.IsEmptyString Then Return tmpBytes
|
||||||
|
Else
|
||||||
|
Return tmpBytes
|
||||||
|
End If
|
||||||
|
|
||||||
|
If tmpBytes.IsEmptyString And Not __MT = UTypes.GIF And __URL.Contains("imgur.com") Then
|
||||||
|
For c% = 0 To 1
|
||||||
|
If c = 0 Then
|
||||||
|
ImgurUrls.ListAddList(Imgur.Envir.GetGallery(__URL))
|
||||||
|
Else
|
||||||
|
ImgurUrls.ListAddValue(Imgur.Envir.GetImage(__URL))
|
||||||
|
End If
|
||||||
|
If ImgurUrls.Count > 0 Then Exit For
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
Return tmpBytes
|
||||||
Catch hash_ex As Exception
|
Catch hash_ex As Exception
|
||||||
Return String.Empty
|
Return String.Empty
|
||||||
End Try
|
End Try
|
||||||
@@ -411,39 +544,63 @@ Namespace API.Reddit
|
|||||||
End If
|
End If
|
||||||
f.Separator = "\"
|
f.Separator = "\"
|
||||||
m = String.Empty
|
m = String.Empty
|
||||||
If (v.Type = UTypes.Picture Or v.Type = UTypes.GIF) And Not cached Then
|
If (v.Type = UTypes.Picture Or v.Type = UTypes.GIF) And UseMD5 Then
|
||||||
m = MD5BS(v.URL, v.Type, f, False)
|
m = MD5BS(v.URL, v.Type, f, False)
|
||||||
If m.IsEmptyString AndAlso Not v.URL_BASE.IsEmptyString AndAlso Not v.URL_BASE = v.URL Then
|
If ImgurUrls.Count = 0 AndAlso m.IsEmptyString AndAlso Not v.URL_BASE.IsEmptyString AndAlso Not v.URL_BASE = v.URL Then
|
||||||
m = MD5BS(v.URL_BASE, v.Type, f, True)
|
m = MD5BS(v.URL_BASE, v.Type, f, True)
|
||||||
If Not m.IsEmptyString Then v.URL = v.URL_BASE
|
If Not m.IsEmptyString Then v.URL = v.URL_BASE
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
|
|
||||||
If (Not m.IsEmptyString AndAlso Not HashList.Contains(m)) Or Not (v.Type = UTypes.Picture Or
|
If (Not m.IsEmptyString AndAlso Not HashList.Contains(m)) Or Not (v.Type = UTypes.Picture Or
|
||||||
v.Type = UTypes.GIF) Or cached Then
|
v.Type = UTypes.GIF) Or Not UseMD5 Or ImgurUrls.Count > 0 Then
|
||||||
If Not cached Then HashList.Add(m)
|
Do
|
||||||
v.MD5 = m
|
If Not cached And Not m.IsEmptyString Then HashList.Add(m)
|
||||||
f.Path = MyDir
|
v.MD5 = m
|
||||||
Try
|
If ImgurUrls.Count > 0 Then
|
||||||
If (v.Type = UTypes.Video Or v.Type = UTypes.m3u8) And vsf Then f.Path = $"{f.PathWithSeparator}Video"
|
If ImgurUrls(0).IsEmptyString Then ImgurUrls.RemoveAt(0) : Continue Do
|
||||||
If v.Type = UTypes.m3u8 Then
|
f = UrlToFile(ImgurUrls(0))
|
||||||
f = M3U8.Download(v.URL, f)
|
If f.Extension.IsEmptyString Then f.Extension = "gif"
|
||||||
Else
|
If f.Name.IsEmptyString Then
|
||||||
w.DownloadFile(v.URL, f.ToString)
|
f.Path = MyDir
|
||||||
|
f.Name = $"ImgurImg_{v.File.Name}"
|
||||||
|
f = SFile.Indexed_IndexFile(f,,, EDP.ReturnValue)
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
If Not v.Type = UTypes.m3u8 Or Not f.IsEmptyString Then
|
f.Path = MyDir
|
||||||
Select Case v.Type
|
Try
|
||||||
Case UTypes.Picture : DownloadedPictures += 1 : _CountPictures += 1
|
If (v.Type = UTypes.Video Or v.Type = UTypes.m3u8 Or (ImgurUrls.Count > 0 AndAlso f.Extension = "mp4")) And
|
||||||
Case UTypes.Video, UTypes.m3u8 : DownloadedVideos += 1 : _CountVideo += 1
|
vsf Then f.Path = $"{f.PathWithSeparator}Video"
|
||||||
End Select
|
If v.Type = UTypes.Video AndAlso v.URL.Contains("redd.it") Then
|
||||||
v.File = f
|
StartRFN += 1
|
||||||
v.Post.CachedFile = f
|
f.Name = String.Format(RFN, StartRFN)
|
||||||
v.State = UStates.Downloaded
|
End If
|
||||||
dCount += 1
|
If v.Type = UTypes.m3u8 Then
|
||||||
End If
|
f = M3U8.Download(v.URL, f)
|
||||||
Catch wex As Exception
|
ElseIf ImgurUrls.Count > 0 Then
|
||||||
If Not IsChannel Then ErrorDownloading(f, v.URL)
|
w.DownloadFile(ImgurUrls(0), f.ToString)
|
||||||
End Try
|
Else
|
||||||
|
w.DownloadFile(v.URL, f.ToString)
|
||||||
|
End If
|
||||||
|
If Not v.Type = UTypes.m3u8 Or Not f.IsEmptyString Then
|
||||||
|
Select Case v.Type
|
||||||
|
Case UTypes.Picture : DownloadedPictures += 1 : _CountPictures += 1
|
||||||
|
Case UTypes.Video, UTypes.m3u8 : DownloadedVideos += 1 : _CountVideo += 1
|
||||||
|
End Select
|
||||||
|
If Not IsChannel Or Not SaveToCache Then
|
||||||
|
v.File = ChangeFileNameByProvider(f, v)
|
||||||
|
Else
|
||||||
|
v.File = f
|
||||||
|
End If
|
||||||
|
v.Post.CachedFile = f
|
||||||
|
v.State = UStates.Downloaded
|
||||||
|
dCount += 1
|
||||||
|
End If
|
||||||
|
Catch wex As Exception
|
||||||
|
If Not IsChannel Then ErrorDownloading(f, v.URL)
|
||||||
|
End Try
|
||||||
|
If ImgurUrls.Count > 0 Then ImgurUrls.RemoveAt(0)
|
||||||
|
Loop While ImgurUrls.Count > 0
|
||||||
Else
|
Else
|
||||||
v.State = UStates.Skipped
|
v.State = UStates.Skipped
|
||||||
End If
|
End If
|
||||||
@@ -467,27 +624,23 @@ Namespace API.Reddit
|
|||||||
HasError = True
|
HasError = True
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Protected Function GetSiteResponse(ByVal URL As String, Optional ByVal e As ErrorsDescriber = Nothing) As String
|
Protected Overrides Function DownloadingException(ByVal ex As Exception, ByVal Message As String, Optional ByVal FromPE As Boolean = False) As Integer
|
||||||
Try
|
If Responser.StatusCode = HttpStatusCode.NotFound Then
|
||||||
Return Settings.Site(Sites.Reddit).Responser.GetResponse(URL,, EDP.ThrowException)
|
UserExists = False
|
||||||
Catch ex As Exception
|
ElseIf Responser.StatusCode = HttpStatusCode.Forbidden Then
|
||||||
HasError = True
|
UserSuspended = True
|
||||||
Dim OptText$ = String.Empty
|
ElseIf Responser.StatusCode = HttpStatusCode.BadGateway Or
|
||||||
If Not e.Exists Then
|
Responser.StatusCode = HttpStatusCode.ServiceUnavailable Or
|
||||||
Dim ee As EDP = EDP.SendInLog
|
Responser.StatusCode = HttpStatusCode.GatewayTimeout Then
|
||||||
If Settings.Site(Sites.Reddit).Responser.StatusCode = HttpStatusCode.NotFound Then
|
MyMainLOG = "Reddit is currently unavailable"
|
||||||
ee += EDP.ThrowException
|
Else
|
||||||
OptText = ": USER NOT FOUND"
|
If Not FromPE Then LogError(ex, Message) : HasError = True
|
||||||
Else
|
Return 0
|
||||||
ee += EDP.ReturnValue
|
End If
|
||||||
End If
|
Return 1
|
||||||
e = New ErrorsDescriber(ee)
|
|
||||||
End If
|
|
||||||
Return ErrorsDescriber.Execute(e, ex, $"[{Site} - {Name}: GetSiteResponse([{URL}])]{OptText}", String.Empty)
|
|
||||||
End Try
|
|
||||||
End Function
|
End Function
|
||||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||||
If Not disposedValue And disposing Then ChannelPostsNames.Clear() : _ExistsUsersNames.Clear()
|
If Not disposedValue And disposing Then ChannelPostsNames.Clear() : _ExistsUsersNames.Clear() : _CrossPosts.Clear()
|
||||||
MyBase.Dispose(disposing)
|
MyBase.Dispose(disposing)
|
||||||
End Sub
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
22
SCrawler/API/Redgifs/Declarations.vb
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
' 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 API.RedGifs
|
||||||
|
Friend Module Declarations
|
||||||
|
Friend ReadOnly DateProvider As New JsonDate
|
||||||
|
Friend Class JsonDate : Implements ICustomProvider
|
||||||
|
Friend 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
|
||||||
|
Return ADateTime.ParseUnicode(Value, NothingArg, e)
|
||||||
|
End Function
|
||||||
|
Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat
|
||||||
|
Throw New NotImplementedException("GetFormat is not available in this context")
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
End Module
|
||||||
|
End Namespace
|
||||||
91
SCrawler/API/Redgifs/UserData.vb
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
' 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.Functions.XML
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
|
Imports PersonalUtilities.Tools.WebDocuments.JSON
|
||||||
|
Imports System.Threading
|
||||||
|
Imports System.Net
|
||||||
|
Imports SCrawler.API.Base
|
||||||
|
Imports UTypes = SCrawler.API.Base.UserMedia.Types
|
||||||
|
Namespace API.RedGifs
|
||||||
|
Friend Class UserData : Inherits UserDataBase
|
||||||
|
Friend Overrides Property Site As Sites = Sites.RedGifs
|
||||||
|
Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True)
|
||||||
|
User = u
|
||||||
|
If _LoadUserInformation Then LoadUserInformation()
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub LoadUserInformation_OptionalFields(ByRef Container As XmlFile, ByVal Loading As Boolean)
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
||||||
|
DownloadData(1, Token)
|
||||||
|
End Sub
|
||||||
|
Private Overloads Sub DownloadData(ByVal Page As Integer, ByVal Token As CancellationToken)
|
||||||
|
Dim URL$ = String.Empty
|
||||||
|
Try
|
||||||
|
URL = $"https://api.redgifs.com/v2/users/{Name}/search?order=recent&page={Page}"
|
||||||
|
Dim r$ = Responser.GetResponse(URL,, EDP.ThrowException)
|
||||||
|
Dim postDate$, postID$
|
||||||
|
Dim pTotal% = 0
|
||||||
|
Dim u$
|
||||||
|
Dim ut As UTypes
|
||||||
|
If Not r.IsEmptyString Then
|
||||||
|
Using j As EContainer = JsonDocument.Parse(r).XmlIfNothing
|
||||||
|
If j.Contains("gifs") Then
|
||||||
|
pTotal = j.Value("pages").FromXML(Of Integer)(0)
|
||||||
|
For Each g As EContainer In j("gifs")
|
||||||
|
postDate = g.Value("createDate")
|
||||||
|
postID = g.Value("id")
|
||||||
|
If Not _TempPostsList.Contains(postID) Then _TempPostsList.Add(postID) Else Exit For
|
||||||
|
With g("urls")
|
||||||
|
If .ListExists Then
|
||||||
|
u = If(.Item("hd"), .Item("sd")).XmlIfNothingValue
|
||||||
|
If Not u.IsEmptyString Then
|
||||||
|
ut = UTypes.Undefined
|
||||||
|
'Type 1: video
|
||||||
|
'Type 2: image
|
||||||
|
Select Case g.Value("type").FromXML(Of Integer)(0)
|
||||||
|
Case 1 : ut = UTypes.Video
|
||||||
|
Case 2 : ut = UTypes.Picture
|
||||||
|
End Select
|
||||||
|
If Not ut = UTypes.Undefined Then _TempMediaList.ListAddValue(MediaFromData(ut, u, postID, postDate))
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
|
If pTotal > 0 And Page < pTotal Then DownloadData(Page + 1, Token)
|
||||||
|
Catch ex As Exception
|
||||||
|
ProcessException(ex, Token, $"data downloading error [{URL}]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken)
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken)
|
||||||
|
DownloadContentDefault(Token)
|
||||||
|
End Sub
|
||||||
|
Private Shared Function MediaFromData(ByVal t As UTypes, ByVal _URL As String, ByVal PostID As String, ByVal PostDate As String) As UserMedia
|
||||||
|
_URL = LinkFormatterSecure(RegexReplace(_URL.Replace("\", String.Empty), LinkPattern))
|
||||||
|
Dim m As New UserMedia(_URL, t) With {.Post = New UserPost With {.ID = PostID}}
|
||||||
|
If Not m.URL.IsEmptyString Then m.File = CStr(RegexReplace(m.URL, FilesPattern)) : m.URL_BASE = m.URL
|
||||||
|
If Not PostDate.IsEmptyString Then m.Post.Date = AConvert(Of Date)(PostDate, DateProvider, Nothing) Else m.Post.Date = Nothing
|
||||||
|
Return m
|
||||||
|
End Function
|
||||||
|
Protected Overrides Function DownloadingException(ByVal ex As Exception, ByVal Message As String, Optional ByVal FromPE As Boolean = False) As Integer
|
||||||
|
If Responser.StatusCode = HttpStatusCode.NotFound Then
|
||||||
|
UserExists = False
|
||||||
|
Else
|
||||||
|
If Not FromPE Then LogError(ex, Message) : HasError = True
|
||||||
|
Return 0
|
||||||
|
End If
|
||||||
|
Return 1
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
@@ -1,9 +1,18 @@
|
|||||||
Imports PersonalUtilities.Functions.XML.Base
|
' 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.Functions.XML.Base
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Namespace API.Twitter
|
Namespace API.Twitter
|
||||||
Friend Module Declarations
|
Friend Module Declarations
|
||||||
Friend DateProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
|
Friend DateProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
|
||||||
Friend ReadOnly VideoNode As NodeParams() = {New NodeParams("video_info", True, True, True, True, 10)}
|
Friend ReadOnly VideoNode As NodeParams() = {New NodeParams("video_info", True, True, True, True, 10)}
|
||||||
Friend ReadOnly VideoSizeRegEx As New RegexStructure("\d+x(\d+)",,,, 1,,, String.Empty, EDP.ReturnValue)
|
Friend ReadOnly VideoSizeRegEx As RParams = RParams.DMS("\d+x(\d+)", 1, EDP.ReturnValue)
|
||||||
Friend ReadOnly UserIdRegEx As New RegexStructure("user_id.:.(\d+)",,,, 1,,, String.Empty, EDP.ReturnValue)
|
Friend ReadOnly UserIdRegEx As RParams = RParams.DMS("user_id.:.(\d+)", 1, EDP.ReturnValue)
|
||||||
End Module
|
End Module
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -1,37 +1,22 @@
|
|||||||
Imports PersonalUtilities.Tools.WebDocuments.JSON
|
' 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.Tools.WEB
|
||||||
|
Imports PersonalUtilities.Tools.WebDocuments.JSON
|
||||||
Imports PersonalUtilities.Functions.XML
|
Imports PersonalUtilities.Functions.XML
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Imports System.Net
|
Imports System.Net
|
||||||
Imports System.Threading
|
Imports System.Threading
|
||||||
Imports SCrawler.API.Base
|
Imports SCrawler.API.Base
|
||||||
Imports UStates = SCrawler.API.Base.UserMedia.States
|
|
||||||
Namespace API.Twitter
|
Namespace API.Twitter
|
||||||
Friend Class UserData : Inherits UserDataBase
|
Friend Class UserData : Inherits UserDataBase
|
||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
Friend Overrides Property Site As Sites = Sites.Twitter
|
Friend Overrides Property Site As Sites = Sites.Twitter
|
||||||
Private Structure Sizes : Implements IComparable(Of Sizes)
|
|
||||||
Friend Value As Integer
|
|
||||||
Friend Name As String
|
|
||||||
Friend ReadOnly HasError As Boolean
|
|
||||||
Friend Sub New(ByVal _Value As String, ByVal _Name As String)
|
|
||||||
Try
|
|
||||||
Value = _Value
|
|
||||||
Name = _Name
|
|
||||||
Catch ex As Exception
|
|
||||||
HasError = True
|
|
||||||
End Try
|
|
||||||
End Sub
|
|
||||||
Friend Function CompareTo(ByVal Other As Sizes) As Integer Implements IComparable(Of Sizes).CompareTo
|
|
||||||
Return Value.CompareTo(Other.Value) * -1
|
|
||||||
End Function
|
|
||||||
Friend Shared Function Reparse(ByRef Current As Sizes, ByVal Other As Sizes, ByVal LargeContained As Boolean) As Sizes
|
|
||||||
If LargeContained And Current.Name.IsEmptyString And Current.Value > Other.Value Then Current.Name = "large"
|
|
||||||
Return Current
|
|
||||||
End Function
|
|
||||||
Friend Shared Function ApplyLarge(ByRef s As Sizes) As Sizes
|
|
||||||
s.Name = "large"
|
|
||||||
Return s
|
|
||||||
End Function
|
|
||||||
End Structure
|
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Initializer"
|
#Region "Initializer"
|
||||||
Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True)
|
Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True)
|
||||||
@@ -39,6 +24,10 @@ Namespace API.Twitter
|
|||||||
If _LoadUserInformation Then LoadUserInformation()
|
If _LoadUserInformation Then LoadUserInformation()
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "Load and Update user info"
|
||||||
|
Protected Overrides Sub LoadUserInformation_OptionalFields(ByRef Container As XmlFile, ByVal Loading As Boolean)
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
#Region "Download functions"
|
#Region "Download functions"
|
||||||
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
||||||
DownloadData(String.Empty, Token)
|
DownloadData(String.Empty, Token)
|
||||||
@@ -59,7 +48,7 @@ Namespace API.Twitter
|
|||||||
If Not POST.IsEmptyString Then URL &= $"&max_id={POST}"
|
If Not POST.IsEmptyString Then URL &= $"&max_id={POST}"
|
||||||
|
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
Dim r$ = Settings.Site(Sites.Twitter).Responser.GetResponse(URL,, EDP.ThrowException)
|
Dim r$ = Responser.GetResponse(URL,, EDP.ThrowException)
|
||||||
If Not r.IsEmptyString Then
|
If Not r.IsEmptyString Then
|
||||||
Using w As EContainer = JsonDocument.Parse(r)
|
Using w As EContainer = JsonDocument.Parse(r)
|
||||||
If Not w Is Nothing AndAlso w.Count > 0 Then
|
If Not w Is Nothing AndAlso w.Count > 0 Then
|
||||||
@@ -106,25 +95,22 @@ Namespace API.Twitter
|
|||||||
If POST.IsEmptyString And ExistsDetected Then Exit Sub
|
If POST.IsEmptyString And ExistsDetected Then Exit Sub
|
||||||
If Not PostID.IsEmptyString And NewPostDetected Then DownloadData(PostID, Token)
|
If Not PostID.IsEmptyString And NewPostDetected Then DownloadData(PostID, Token)
|
||||||
End If
|
End If
|
||||||
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
|
||||||
Catch dex As ObjectDisposedException When Disposed
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
LogError(ex, $"data downloading error [{URL}]")
|
ProcessException(ex, Token, $"data downloading error [{URL}]")
|
||||||
HasError = True
|
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Friend Shared Function GetVideoInfo(ByVal URL As String) As UserMedia
|
Friend Shared Function GetVideoInfo(ByVal URL As String) As IEnumerable(Of UserMedia)
|
||||||
Try
|
Try
|
||||||
If URL.Contains("twitter") Then
|
If URL.Contains("twitter") Then
|
||||||
Dim PostID$ = RegexReplace(URL, New RegexStructure("(?<=/)\d+", True, False,,,,, String.Empty))
|
Dim PostID$ = RegexReplace(URL, RParams.DM("(?<=/)\d+", 0))
|
||||||
If Not PostID.IsEmptyString Then
|
If Not PostID.IsEmptyString Then
|
||||||
Dim r$ = Settings.Site(Sites.Twitter).Responser.GetResponse($"https://api.twitter.com/1.1/statuses/show.json?id={PostID}",,
|
Dim r$ = DirectCast(Settings(Sites.Twitter).Responser.Copy(), Response).
|
||||||
EDP.ReturnValue)
|
GetResponse($"https://api.twitter.com/1.1/statuses/show.json?id={PostID}",, EDP.ReturnValue)
|
||||||
If Not r.IsEmptyString Then
|
If Not r.IsEmptyString Then
|
||||||
Using j As EContainer = JsonDocument.Parse(r)
|
Using j As EContainer = JsonDocument.Parse(r)
|
||||||
If j.ListExists Then
|
If j.ListExists Then
|
||||||
Dim u$ = GetVideoNodeURL(j)
|
Dim u$ = GetVideoNodeURL(j)
|
||||||
If Not u.IsEmptyString Then Return MediaFromData(u, PostID, String.Empty)
|
If Not u.IsEmptyString Then Return {MediaFromData(u, PostID, String.Empty)}
|
||||||
End If
|
End If
|
||||||
End Using
|
End Using
|
||||||
End If
|
End If
|
||||||
@@ -147,12 +133,12 @@ Namespace API.Twitter
|
|||||||
Next
|
Next
|
||||||
If l.Count > 0 Then
|
If l.Count > 0 Then
|
||||||
l.Sort()
|
l.Sort()
|
||||||
If l(0).Name.IsEmptyString And LargeContained Then Return "large" Else Return l(0).Name
|
If l(0).Data.IsEmptyString And LargeContained Then Return "large" Else Return l(0).Data
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
Return String.Empty
|
Return String.Empty
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
LogError(ex, "[GetPictureOption]")
|
LogError(ex, "[API.Twitter.UserData.GetPictureOption]")
|
||||||
Return String.Empty
|
Return String.Empty
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
@@ -164,7 +150,7 @@ Namespace API.Twitter
|
|||||||
If Not URL.IsEmptyString Then _TempMediaList.ListAddValue(MediaFromData(URL, PostID, PostDate), LNC) : Return True
|
If Not URL.IsEmptyString Then _TempMediaList.ListAddValue(MediaFromData(URL, PostID, PostDate), LNC) : Return True
|
||||||
Return False
|
Return False
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
LogError(ex, "[CheckVideoNode]")
|
LogError(ex, "[API.Twitter.UserData.CheckVideoNode]")
|
||||||
Return False
|
Return False
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
@@ -185,7 +171,7 @@ Namespace API.Twitter
|
|||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
If l.Count > 0 Then l.RemoveAll(Function(s) s.HasError)
|
If l.Count > 0 Then l.RemoveAll(Function(s) s.HasError)
|
||||||
If l.Count > 0 Then l.Sort() : Return l(0).Name
|
If l.Count > 0 Then l.Sort() : Return l(0).Data
|
||||||
End If
|
End If
|
||||||
Return String.Empty
|
Return String.Empty
|
||||||
End Function
|
End Function
|
||||||
@@ -205,62 +191,20 @@ Namespace API.Twitter
|
|||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken)
|
Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken)
|
||||||
Try
|
DownloadContentDefault(Token)
|
||||||
Dim i%
|
|
||||||
ThrowAny(Token)
|
|
||||||
If _ContentNew.Count > 0 Then
|
|
||||||
_ContentNew.RemoveAll(Function(c) c.URL.IsEmptyString)
|
|
||||||
If _ContentNew.Count > 0 Then
|
|
||||||
MyFile.Exists(SFO.Path)
|
|
||||||
Dim MyDir$ = MyFile.CutPath.Path
|
|
||||||
Dim vsf As Boolean = SeparateVideoFolderF
|
|
||||||
Dim f As SFile
|
|
||||||
Dim v As UserMedia
|
|
||||||
Using w As New WebClient
|
|
||||||
If vsf Then SFileShares.SFileExists($"{MyDir}\Video\", SFO.Path)
|
|
||||||
MainProgress.TotalCount += _ContentNew.Count
|
|
||||||
For i = 0 To _ContentNew.Count - 1
|
|
||||||
ThrowAny(Token)
|
|
||||||
v = _ContentNew(i)
|
|
||||||
v.State = UStates.Tried
|
|
||||||
If v.File.IsEmptyString Then
|
|
||||||
f = v.URL
|
|
||||||
Else
|
|
||||||
f = v.File
|
|
||||||
End If
|
|
||||||
f.Separator = "\"
|
|
||||||
f.Path = MyDir
|
|
||||||
|
|
||||||
If v.URL_BASE.IsEmptyString Then v.URL_BASE = v.URL
|
|
||||||
|
|
||||||
If Not v.File.IsEmptyString AndAlso Not v.URL_BASE.IsEmptyString Then
|
|
||||||
Try
|
|
||||||
If f.Extension = "mp4" And vsf Then f.Path = $"{f.PathWithSeparator}Video"
|
|
||||||
w.DownloadFile(v.URL_BASE, f.ToString)
|
|
||||||
Select Case f.Extension
|
|
||||||
Case "mp4" : v.Type = UserMedia.Types.Video : DownloadedVideos += 1 : _CountVideo += 1
|
|
||||||
Case Else : v.Type = UserMedia.Types.Picture : DownloadedPictures += 1 : _CountPictures += 1
|
|
||||||
End Select
|
|
||||||
v.File = f
|
|
||||||
v.State = UStates.Downloaded
|
|
||||||
Catch wex As Exception
|
|
||||||
ErrorDownloading(f, v.URL_BASE)
|
|
||||||
End Try
|
|
||||||
Else
|
|
||||||
v.State = UStates.Skipped
|
|
||||||
End If
|
|
||||||
_ContentNew(i) = v
|
|
||||||
MainProgress.Perform()
|
|
||||||
Next
|
|
||||||
End Using
|
|
||||||
End If
|
|
||||||
End If
|
|
||||||
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
|
||||||
Catch dex As ObjectDisposedException When Disposed
|
|
||||||
Catch ex As Exception
|
|
||||||
LogError(ex, "content downloading error")
|
|
||||||
HasError = True
|
|
||||||
End Try
|
|
||||||
End Sub
|
End Sub
|
||||||
|
Protected Overrides Function DownloadingException(ByVal ex As Exception, ByVal Message As String, Optional ByVal FromPE As Boolean = False) As Integer
|
||||||
|
If Responser.StatusCode = HttpStatusCode.NotFound Then
|
||||||
|
UserExists = False
|
||||||
|
ElseIf Responser.StatusCode = HttpStatusCode.Unauthorized Then
|
||||||
|
UserSuspended = True
|
||||||
|
ElseIf Responser.StatusCode = HttpStatusCode.BadRequest Then
|
||||||
|
MyMainLOG = "Twitter has invalid credentials"
|
||||||
|
Else
|
||||||
|
If Not FromPE Then LogError(ex, Message) : HasError = True
|
||||||
|
Return 0
|
||||||
|
End If
|
||||||
|
Return 1
|
||||||
|
End Function
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -1,4 +1,13 @@
|
|||||||
Imports PersonalUtilities.Tools
|
' 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.Tools
|
||||||
|
Imports PersonalUtilities.Functions.XML
|
||||||
Imports System.Threading
|
Imports System.Threading
|
||||||
Imports SCrawler.API.Base
|
Imports SCrawler.API.Base
|
||||||
Namespace API
|
Namespace API
|
||||||
@@ -28,6 +37,20 @@ Namespace API
|
|||||||
CollectionName = NewCollectionName
|
CollectionName = NewCollectionName
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
|
Friend Overrides Property UserExists As Boolean
|
||||||
|
Get
|
||||||
|
Return Count > 0 AndAlso Collections.Exists(Function(c) c.Exists)
|
||||||
|
End Get
|
||||||
|
Set(ByVal e As Boolean)
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Friend Overrides Property UserSuspended As Boolean
|
||||||
|
Get
|
||||||
|
Return Count > 0 AndAlso Collections.LongCount(Function(c) c.Suspended) = Count
|
||||||
|
End Get
|
||||||
|
Set(ByVal s As Boolean)
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
Friend Overrides Sub ChangeCollectionName(ByVal NewName As String, ByVal UpdateSettings As Boolean)
|
Friend Overrides Sub ChangeCollectionName(ByVal NewName As String, ByVal UpdateSettings As Boolean)
|
||||||
_CollectionName = NewName
|
_CollectionName = NewName
|
||||||
If Count > 0 Then Collections.ForEach(Sub(c) c.CollectionName = NewName)
|
If Count > 0 Then Collections.ForEach(Sub(c) c.CollectionName = NewName)
|
||||||
@@ -98,7 +121,7 @@ Namespace API
|
|||||||
Friend Overrides Property DataMerging As Boolean
|
Friend Overrides Property DataMerging As Boolean
|
||||||
Get
|
Get
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
Return DirectCast(Collections(0), UserDataBase).DataMerging
|
Return DirectCast(Collections(0).Self, UserDataBase).DataMerging
|
||||||
Else
|
Else
|
||||||
Return False
|
Return False
|
||||||
End If
|
End If
|
||||||
@@ -142,6 +165,14 @@ Namespace API
|
|||||||
UpdateUserInformation()
|
UpdateUserInformation()
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
|
Friend Overrides Property ReadyForDownload As Boolean
|
||||||
|
Get
|
||||||
|
Return Count > 0 AndAlso Collections(0).ReadyForDownload
|
||||||
|
End Get
|
||||||
|
Set(ByVal IsReady As Boolean)
|
||||||
|
If Count > 0 Then Collections.ForEach(Sub(c) c.ReadyForDownload = IsReady)
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
Friend Overrides ReadOnly Property Labels As List(Of String)
|
Friend Overrides ReadOnly Property Labels As List(Of String)
|
||||||
Get
|
Get
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
@@ -153,15 +184,15 @@ Namespace API
|
|||||||
End Property
|
End Property
|
||||||
Friend Overrides Function GetUserInformation() As String
|
Friend Overrides Function GetUserInformation() As String
|
||||||
Dim OutStr$ = String.Empty
|
Dim OutStr$ = String.Empty
|
||||||
If Count > 0 Then Collections.ForEach(Sub(c) OutStr.StringAppendLine(DirectCast(c, UserDataBase).GetUserInformation(), $"{vbCrLf}{vbCrLf}"))
|
If Count > 0 Then Collections.ForEach(Sub(c) OutStr.StringAppendLine(DirectCast(c.Self, UserDataBase).GetUserInformation(), $"{vbCrLf}{vbCrLf}"))
|
||||||
Return OutStr
|
Return OutStr
|
||||||
End Function
|
End Function
|
||||||
Friend Overrides Property LastUpdated As Date?
|
Friend Overrides Property LastUpdated As Date?
|
||||||
Get
|
Get
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
With If((From c In Collections
|
With If((From c In Collections
|
||||||
Where DirectCast(c, UserDataBase).LastUpdated.HasValue
|
Where DirectCast(c.Self, UserDataBase).LastUpdated.HasValue
|
||||||
Select DirectCast(c, UserDataBase).LastUpdated.Value).ToList, New List(Of Date))
|
Select DirectCast(c.Self, UserDataBase).LastUpdated.Value).ToList, New List(Of Date))
|
||||||
If .Count > 0 Then Return .Max
|
If .Count > 0 Then Return .Max
|
||||||
End With
|
End With
|
||||||
End If
|
End If
|
||||||
@@ -179,7 +210,7 @@ Namespace API
|
|||||||
Friend ReadOnly Property ContextDown As ToolStripMenuItem()
|
Friend ReadOnly Property ContextDown As ToolStripMenuItem()
|
||||||
Get
|
Get
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_DOWN).ToArray
|
Return Collections.Select(Function(c) DirectCast(c.Self, UserDataBase).BTT_CONTEXT_DOWN).ToArray
|
||||||
Else
|
Else
|
||||||
Return New ToolStripMenuItem() {}
|
Return New ToolStripMenuItem() {}
|
||||||
End If
|
End If
|
||||||
@@ -188,7 +219,7 @@ Namespace API
|
|||||||
Friend ReadOnly Property ContextEdit As ToolStripMenuItem()
|
Friend ReadOnly Property ContextEdit As ToolStripMenuItem()
|
||||||
Get
|
Get
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_EDIT).ToArray
|
Return Collections.Select(Function(c) DirectCast(c.Self, UserDataBase).BTT_CONTEXT_EDIT).ToArray
|
||||||
Else
|
Else
|
||||||
Return New ToolStripMenuItem() {}
|
Return New ToolStripMenuItem() {}
|
||||||
End If
|
End If
|
||||||
@@ -197,7 +228,7 @@ Namespace API
|
|||||||
Friend ReadOnly Property ContextDelete As ToolStripMenuItem()
|
Friend ReadOnly Property ContextDelete As ToolStripMenuItem()
|
||||||
Get
|
Get
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_DELETE).ToArray
|
Return Collections.Select(Function(c) DirectCast(c.Self, UserDataBase).BTT_CONTEXT_DELETE).ToArray
|
||||||
Else
|
Else
|
||||||
Return New ToolStripMenuItem() {}
|
Return New ToolStripMenuItem() {}
|
||||||
End If
|
End If
|
||||||
@@ -206,7 +237,7 @@ Namespace API
|
|||||||
Friend ReadOnly Property ContextPath As ToolStripMenuItem()
|
Friend ReadOnly Property ContextPath As ToolStripMenuItem()
|
||||||
Get
|
Get
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_OPEN_PATH).ToArray
|
Return Collections.Select(Function(c) DirectCast(c.Self, UserDataBase).BTT_CONTEXT_OPEN_PATH).ToArray
|
||||||
Else
|
Else
|
||||||
Return New ToolStripMenuItem() {}
|
Return New ToolStripMenuItem() {}
|
||||||
End If
|
End If
|
||||||
@@ -215,7 +246,7 @@ Namespace API
|
|||||||
Friend ReadOnly Property ContextSite As ToolStripMenuItem()
|
Friend ReadOnly Property ContextSite As ToolStripMenuItem()
|
||||||
Get
|
Get
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_OPEN_SITE).ToArray
|
Return Collections.Select(Function(c) DirectCast(c.Self, UserDataBase).BTT_CONTEXT_OPEN_SITE).ToArray
|
||||||
Else
|
Else
|
||||||
Return New ToolStripMenuItem() {}
|
Return New ToolStripMenuItem() {}
|
||||||
End If
|
End If
|
||||||
@@ -239,7 +270,9 @@ Namespace API
|
|||||||
If Count > 0 Then Collections.ForEach(Sub(c) c.UpdateUserInformation())
|
If Count > 0 Then Collections.ForEach(Sub(c) c.UpdateUserInformation())
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overrides Sub LoadContentInformation()
|
Friend Overrides Sub LoadContentInformation()
|
||||||
If Count > 0 Then Collections.ForEach(Sub(c) DirectCast(c, UserDataBase).LoadContentInformation())
|
If Count > 0 Then Collections.ForEach(Sub(c) DirectCast(c.Self, UserDataBase).LoadContentInformation())
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub LoadUserInformation_OptionalFields(ByRef Container As XmlFile, ByVal Loading As Boolean)
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overrides Property DownloadTopCount As Integer?
|
Friend Overrides Property DownloadTopCount As Integer?
|
||||||
Get
|
Get
|
||||||
@@ -262,8 +295,11 @@ Namespace API
|
|||||||
End Sub
|
End Sub
|
||||||
Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken)
|
Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub User_OnPictureUpdated(ByVal User As IUserData)
|
Protected Overrides Function DownloadingException(ByVal ex As Exception, ByVal Message As String, Optional ByVal FromPE As Boolean = False) As Integer
|
||||||
Raise_OnPictureUpdated()
|
Return 0
|
||||||
|
End Function
|
||||||
|
Private Sub User_OnUserUpdated(ByVal User As IUserData)
|
||||||
|
Raise_OnUserUpdated()
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overrides Sub OpenSite()
|
Friend Overrides Sub OpenSite()
|
||||||
If Count > 0 Then Collections(0).OpenSite()
|
If Count > 0 Then Collections(0).OpenSite()
|
||||||
@@ -288,8 +324,8 @@ Namespace API
|
|||||||
''' <exception cref="InvalidOperationException"></exception>
|
''' <exception cref="InvalidOperationException"></exception>
|
||||||
Friend Overloads Sub Add(ByVal _Item As IUserData) Implements ICollection(Of IUserData).Add
|
Friend Overloads Sub Add(ByVal _Item As IUserData) Implements ICollection(Of IUserData).Add
|
||||||
With _Item
|
With _Item
|
||||||
Dim m As Boolean = DataMerging
|
If .MoveFiles(CollectionName) Then
|
||||||
If .MoveFiles(CollectionName, m) Then
|
If DataMerging Then DirectCast(.Self, UserDataBase).MergeData()
|
||||||
Collections.Add(_Item)
|
Collections.Add(_Item)
|
||||||
With Collections.Last
|
With Collections.Last
|
||||||
If Collections.Count - 1 > 0 Then
|
If Collections.Count - 1 > 0 Then
|
||||||
@@ -298,7 +334,7 @@ Namespace API
|
|||||||
.UpdateUserInformation()
|
.UpdateUserInformation()
|
||||||
End If
|
End If
|
||||||
ImageHandler(_Item, False)
|
ImageHandler(_Item, False)
|
||||||
AddHandler .OnPictureUpdated, AddressOf User_OnPictureUpdated
|
AddHandler .Self.OnUserUpdated, AddressOf User_OnUserUpdated
|
||||||
DirectCast(.Self, UserDataBase).CreateButtons(Count - 1)
|
DirectCast(.Self, UserDataBase).CreateButtons(Count - 1)
|
||||||
End With
|
End With
|
||||||
Else
|
Else
|
||||||
@@ -308,23 +344,23 @@ Namespace API
|
|||||||
End Sub
|
End Sub
|
||||||
''' <summary>FOR SETTINGS START LOADING ONLY</summary>
|
''' <summary>FOR SETTINGS START LOADING ONLY</summary>
|
||||||
Friend Overloads Sub Add(ByVal u As UserInfo, Optional ByVal _LoadData As Boolean = True)
|
Friend Overloads Sub Add(ByVal u As UserInfo, Optional ByVal _LoadData As Boolean = True)
|
||||||
Select Case u.Site
|
Collections.Add(GetInstance(u, _LoadData))
|
||||||
Case Sites.Reddit : Collections.Add(New Reddit.UserData(u, _LoadData))
|
If Not Collections.Last Is Nothing Then
|
||||||
Case Sites.Twitter : Collections.Add(New Twitter.UserData(u, _LoadData))
|
With DirectCast(Collections.Last.Self, UserDataBase)
|
||||||
Case Else : Exit Sub
|
.CreateButtons(Count - 1)
|
||||||
End Select
|
AddHandler .BTT_CONTEXT_DELETE.Click, AddressOf BTT_CONTEXT_DELETE_Click
|
||||||
With DirectCast(Collections(Count - 1), UserDataBase)
|
End With
|
||||||
.CreateButtons(Count - 1)
|
AddHandler Collections.Last.OnUserUpdated, AddressOf User_OnUserUpdated
|
||||||
AddHandler .BTT_CONTEXT_DELETE.Click, AddressOf BTT_CONTEXT_DELETE_Click
|
Else
|
||||||
End With
|
Collections.RemoveAt(Count - 1)
|
||||||
AddHandler Collections(Count - 1).OnPictureUpdated, AddressOf User_OnPictureUpdated
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub AddRange(ByVal _Items As IEnumerable(Of IUserData))
|
Friend Sub AddRange(ByVal _Items As IEnumerable(Of IUserData))
|
||||||
If Not _Items Is Nothing AndAlso _Items.Count > 0 Then
|
If Not _Items Is Nothing AndAlso _Items.Count > 0 Then
|
||||||
For i% = 0 To _Items.Count - 1 : Add(_Items(i)) : Next
|
For i% = 0 To _Items.Count - 1 : Add(_Items(i)) : Next
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overrides Function MoveFiles(ByVal __CollectionName As String, ByVal _MergeData As Boolean) As Boolean
|
Friend Overrides Function MoveFiles(ByVal __CollectionName As String) As Boolean
|
||||||
Throw New NotImplementedException("Files moving does not available if collection context")
|
Throw New NotImplementedException("Files moving does not available if collection context")
|
||||||
End Function
|
End Function
|
||||||
Friend Overloads Sub MergeData(ByVal Merging As Boolean)
|
Friend Overloads Sub MergeData(ByVal Merging As Boolean)
|
||||||
@@ -334,7 +370,7 @@ Namespace API
|
|||||||
MsgBoxE($"Collection [{CollectionName}] data already merged")
|
MsgBoxE($"Collection [{CollectionName}] data already merged")
|
||||||
Else
|
Else
|
||||||
If Collections.Count > 1 Then
|
If Collections.Count > 1 Then
|
||||||
Collections.ForEach(Sub(c) DirectCast(c, UserDataBase).MergeData())
|
Collections.ForEach(Sub(c) DirectCast(c.Self, UserDataBase).MergeData())
|
||||||
MsgBoxE($"Collection [{CollectionName}] data merged")
|
MsgBoxE($"Collection [{CollectionName}] data merged")
|
||||||
Else
|
Else
|
||||||
MsgBoxE($"Collection [{CollectionName}] contains only one user profile" & vbCr &
|
MsgBoxE($"Collection [{CollectionName}] contains only one user profile" & vbCr &
|
||||||
@@ -367,21 +403,24 @@ Namespace API
|
|||||||
"Operation canceled", MsgBoxStyle.Critical)
|
"Operation canceled", MsgBoxStyle.Critical)
|
||||||
Return False
|
Return False
|
||||||
Else
|
Else
|
||||||
DirectCast(_Item, UserDataBase).MoveFiles(String.Empty, False)
|
DirectCast(_Item.Self, UserDataBase).MoveFiles(String.Empty)
|
||||||
ImageHandler(_Item)
|
ImageHandler(_Item)
|
||||||
Return Collections.Remove(_Item)
|
Return Collections.Remove(_Item)
|
||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
Friend Overrides Function Delete() As Integer
|
Friend Overrides Function Delete() As Integer
|
||||||
If Count > 0 Then
|
If Count > 0 Then
|
||||||
|
Dim f As SFile
|
||||||
If MsgBoxE({$"Collection may contain data{vbCr}Do you really want to delete collection and all of it files?", "Collection deleting"},
|
If MsgBoxE({$"Collection may contain data{vbCr}Do you really want to delete collection and all of it files?", "Collection deleting"},
|
||||||
MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
|
MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
|
||||||
|
f = Collections(0).File.CutPath(IIf(DataMerging, 1, 2)).PathWithSeparator
|
||||||
Settings.Users.Remove(Me)
|
Settings.Users.Remove(Me)
|
||||||
Collections.ForEach(Sub(c) c.Delete())
|
Collections.ForEach(Sub(c) c.Delete())
|
||||||
Downloader.UserRemove(Me)
|
Downloader.UserRemove(Me)
|
||||||
ImageHandler(Me, False)
|
ImageHandler(Me, False)
|
||||||
Collections.ListClearDispose
|
Collections.ListClearDispose
|
||||||
Dispose(False)
|
Dispose(False)
|
||||||
|
If f.Exists(SFO.Path, False) Then f.Delete(SFO.Path, True, False, EDP.SendInLog)
|
||||||
Return 2
|
Return 2
|
||||||
Else
|
Else
|
||||||
If DataMerging Then
|
If DataMerging Then
|
||||||
@@ -390,10 +429,10 @@ Namespace API
|
|||||||
End If
|
End If
|
||||||
If MsgBoxE({$"Do you want to delete collection only?{vbCr}Users will not be deleted", "Collection deleting"},
|
If MsgBoxE({$"Do you want to delete collection only?{vbCr}Users will not be deleted", "Collection deleting"},
|
||||||
MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
|
MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
|
||||||
Dim f As SFile = Collections(0).File.CutPath(2)
|
f = Collections(0).File.CutPath(2)
|
||||||
Settings.Users.Remove(Me)
|
Settings.Users.Remove(Me)
|
||||||
Collections.ForEach(Sub(c)
|
Collections.ForEach(Sub(c)
|
||||||
c.MoveFiles(String.Empty, False)
|
c.MoveFiles(String.Empty)
|
||||||
ImageHandler(c)
|
ImageHandler(c)
|
||||||
End Sub)
|
End Sub)
|
||||||
Collections.Clear()
|
Collections.Clear()
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
Imports PersonalUtilities.Forms
|
' 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.Toolbars
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
Imports PersonalUtilities.Forms.Controls
|
Imports PersonalUtilities.Forms.Controls
|
||||||
Imports PersonalUtilities.Forms.Controls.Base
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
@@ -11,20 +19,26 @@ Imports CmbDefaultButtons = PersonalUtilities.Forms.Controls.Base.ActionButton.D
|
|||||||
Imports RButton = PersonalUtilities.Tools.RangeSwitcherButton.Types
|
Imports RButton = PersonalUtilities.Tools.RangeSwitcherButton.Types
|
||||||
Friend Class ChannelViewForm : Implements IChannelLimits
|
Friend Class ChannelViewForm : Implements IChannelLimits
|
||||||
Friend Event OnUsersAdded(ByVal StartIndex As Integer)
|
Friend Event OnUsersAdded(ByVal StartIndex As Integer)
|
||||||
|
Friend Event OnDownloadDone(ByVal Message As String)
|
||||||
#Region "Appended user structure"
|
#Region "Appended user structure"
|
||||||
Private Structure PendingUser
|
Private Structure PendingUser
|
||||||
Friend ID As String
|
Friend ID As String
|
||||||
Friend File As SFile
|
Friend File As SFile
|
||||||
Friend Sub New(ByVal _ID As String, Optional ByVal _File As SFile = Nothing)
|
Friend Channel As Channel
|
||||||
|
Friend Sub New(ByVal _ID As String, ByRef _Channel As Channel, Optional ByVal _File As SFile = Nothing)
|
||||||
ID = _ID
|
ID = _ID
|
||||||
|
Channel = _Channel
|
||||||
If Settings.FromChannelCopyImageToUser Then File = _File
|
If Settings.FromChannelCopyImageToUser Then File = _File
|
||||||
End Sub
|
End Sub
|
||||||
Public Shared Widening Operator CType(ByVal _ID As String) As PendingUser
|
Public Shared Widening Operator CType(ByVal _ID As String) As PendingUser
|
||||||
Return New PendingUser(_ID, False)
|
Return New PendingUser(_ID, Nothing)
|
||||||
End Operator
|
End Operator
|
||||||
Public Shared Widening Operator CType(ByVal u As PendingUser) As String
|
Public Shared Widening Operator CType(ByVal u As PendingUser) As String
|
||||||
Return u.ToString
|
Return u.ToString
|
||||||
End Operator
|
End Operator
|
||||||
|
Friend Sub ChannelUserAdded(Optional ByVal IsAdded As Boolean = True)
|
||||||
|
If Not Channel Is Nothing Then Channel.UserAdded(IsAdded)
|
||||||
|
End Sub
|
||||||
Public Overrides Function ToString() As String
|
Public Overrides Function ToString() As String
|
||||||
Return ID
|
Return ID
|
||||||
End Function
|
End Function
|
||||||
@@ -45,6 +59,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
Private WithEvents OPT_LIMITS_COUNT As RadioButton
|
Private WithEvents OPT_LIMITS_COUNT As RadioButton
|
||||||
Private WithEvents OPT_LIMITS_POST As RadioButton
|
Private WithEvents OPT_LIMITS_POST As RadioButton
|
||||||
Private WithEvents OPT_LIMITS_DATE As RadioButton
|
Private WithEvents OPT_LIMITS_DATE As RadioButton
|
||||||
|
Private WithEvents BTT_SHOW_STATS As ToolStripButton
|
||||||
#End Region
|
#End Region
|
||||||
Private ReadOnly CProvider As ANumbers
|
Private ReadOnly CProvider As ANumbers
|
||||||
Private ReadOnly CProgress As MyProgress
|
Private ReadOnly CProgress As MyProgress
|
||||||
@@ -70,7 +85,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
Private Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount
|
Private Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount
|
||||||
Get
|
Get
|
||||||
If OPT_LIMITS_COUNT.Checked Then
|
If OPT_LIMITS_COUNT.Checked Then
|
||||||
Return AConvert(Of Integer)(TXT_LIMIT.Text, Nothing)
|
Return AConvert(Of Integer)(TXT_LIMIT.Text, AModes.Var, Nothing)
|
||||||
Else
|
Else
|
||||||
Return Nothing
|
Return Nothing
|
||||||
End If
|
End If
|
||||||
@@ -92,7 +107,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
Private Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate
|
Private Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate
|
||||||
Get
|
Get
|
||||||
If OPT_LIMITS_DATE.Checked Then
|
If OPT_LIMITS_DATE.Checked Then
|
||||||
Return AConvert(Of Date)(TXT_LIMIT.Value, Nothing)
|
Return AConvert(Of Date)(TXT_LIMIT.Value, AModes.Var, Nothing)
|
||||||
Else
|
Else
|
||||||
Return Nothing
|
Return Nothing
|
||||||
End If
|
End If
|
||||||
@@ -126,7 +141,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
InitializeComponent()
|
InitializeComponent()
|
||||||
MyDefs = New DefaultFormProps
|
MyDefs = New DefaultFormProps
|
||||||
CProgress = New MyProgress(ToolbarBOTTOM, PR_CN, LBL_STATUS, "Downloading data") With {.PerformMod = 10, .DropCurrentProgressOnTotalChange = False}
|
CProgress = New MyProgress(ToolbarBOTTOM, PR_CN, LBL_STATUS, "Downloading data") With {.PerformMod = 10, .DropCurrentProgressOnTotalChange = False}
|
||||||
CProvider = New ANumbers(ANumbers.Modes.USA) With {.GroupSize = 3, .DecimalDigits = 0}
|
CProvider = New ANumbers With {.FormatOptions = ANumbers.Options.GroupIntegral}
|
||||||
LimitProvider = New ADateTime("dd.MM.yyyy HH:mm")
|
LimitProvider = New ADateTime("dd.MM.yyyy HH:mm")
|
||||||
PendingUsers = New List(Of PendingUser)
|
PendingUsers = New List(Of PendingUser)
|
||||||
|
|
||||||
@@ -141,7 +156,8 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
}
|
}
|
||||||
CMB_CHANNELS.Buttons.AddRange({CmbDefaultButtons.Refresh, CmbDefaultButtons.Add, CmbDefaultButtons.Delete,
|
CMB_CHANNELS.Buttons.AddRange({CmbDefaultButtons.Refresh, CmbDefaultButtons.Add, CmbDefaultButtons.Delete,
|
||||||
New ActionButton(CmbDefaultButtons.Up) With {.ToolTipText = "Previous item (F1)"},
|
New ActionButton(CmbDefaultButtons.Up) With {.ToolTipText = "Previous item (F1)"},
|
||||||
New ActionButton(CmbDefaultButtons.Down) With {.ToolTipText = "Next item (F4)"}})
|
New ActionButton(CmbDefaultButtons.Down) With {.ToolTipText = "Next item (F4)"},
|
||||||
|
CmbDefaultButtons.Info})
|
||||||
TXT_LIMIT = New TextBoxExtended With {
|
TXT_LIMIT = New TextBoxExtended With {
|
||||||
.CaptionText = "Limit",
|
.CaptionText = "Limit",
|
||||||
.Margin = New Padding(2),
|
.Margin = New Padding(2),
|
||||||
@@ -160,6 +176,9 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
OPT_LIMITS_DATE = New RadioButton With {.Text = "Date", .BackColor = Color.Transparent, .Margin = New Padding(2)}
|
OPT_LIMITS_DATE = New RadioButton With {.Text = "Date", .BackColor = Color.Transparent, .Margin = New Padding(2)}
|
||||||
CH_HIDE_EXISTS_USERS = New CheckBox With {.Text = "Hide exists users", .BackColor = Color.Transparent, .Margin = New Padding(2),
|
CH_HIDE_EXISTS_USERS = New CheckBox With {.Text = "Hide exists users", .BackColor = Color.Transparent, .Margin = New Padding(2),
|
||||||
.Checked = Settings.ChannelsHideExistsUser}
|
.Checked = Settings.ChannelsHideExistsUser}
|
||||||
|
BTT_SHOW_STATS = New ToolStripButton With {.Text = "Info", .Image = PersonalUtilities.My.Resources.InfoPic_32,
|
||||||
|
.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText, .Alignment = ToolStripItemAlignment.Right,
|
||||||
|
.AutoToolTip = True, .ToolTipText = "Show channels statistic"}
|
||||||
|
|
||||||
TT_MAIN.SetToolTip(CH_HIDE_EXISTS_USERS, "Hide users which already exists in collection")
|
TT_MAIN.SetToolTip(CH_HIDE_EXISTS_USERS, "Hide users which already exists in collection")
|
||||||
TT_MAIN.SetToolTip(OPT_LIMITS_COUNT, "Total posts count limit")
|
TT_MAIN.SetToolTip(OPT_LIMITS_COUNT, "Total posts count limit")
|
||||||
@@ -174,8 +193,9 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
TXT_LIMIT.GetControlHost,
|
TXT_LIMIT.GetControlHost,
|
||||||
LBL_LIMIT_TEXT,
|
LBL_LIMIT_TEXT,
|
||||||
New ToolStripSeparator,
|
New ToolStripSeparator,
|
||||||
New ToolStripControlHost(CH_HIDE_EXISTS_USERS)})
|
New ToolStripControlHost(CH_HIDE_EXISTS_USERS),
|
||||||
MyRange = New RangeSwitcher(Of UserPost) With {.Selector = Function(p) Not Settings.UserExists(Sites.Reddit, p.UserID)}
|
BTT_SHOW_STATS})
|
||||||
|
MyRange = New RangeSwitcher(Of UserPost) With {.Selector = SelectorExpression}
|
||||||
With MyRange
|
With MyRange
|
||||||
.Limit = ImagesInRow * ImagesRows
|
.Limit = ImagesInRow * ImagesRows
|
||||||
.InsertButtons(ToolbarTOP, {RButton.Previous, RButton.Next}, 5)
|
.InsertButtons(ToolbarTOP, {RButton.Previous, RButton.Next}, 5)
|
||||||
@@ -184,7 +204,6 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
.BindForm(Me)
|
.BindForm(Me)
|
||||||
.LabelNumbersProvider = CProvider
|
.LabelNumbersProvider = CProvider
|
||||||
.UpdateControls()
|
.UpdateControls()
|
||||||
.Selector = SelectorExpression
|
|
||||||
End With
|
End With
|
||||||
AddHandler Settings.ChannelsImagesColumns.OnValueChanged, AddressOf ImagesCountChanged
|
AddHandler Settings.ChannelsImagesColumns.OnValueChanged, AddressOf ImagesCountChanged
|
||||||
AddHandler Settings.ChannelsImagesRows.OnValueChanged, AddressOf ImagesCountChanged
|
AddHandler Settings.ChannelsImagesRows.OnValueChanged, AddressOf ImagesCountChanged
|
||||||
@@ -217,6 +236,8 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
OPT_LIMITS_COUNT.Dispose()
|
OPT_LIMITS_COUNT.Dispose()
|
||||||
OPT_LIMITS_POST.Dispose()
|
OPT_LIMITS_POST.Dispose()
|
||||||
LBL_LIMIT_TEXT.Dispose()
|
LBL_LIMIT_TEXT.Dispose()
|
||||||
|
BTT_SHOW_STATS.Dispose()
|
||||||
|
MyRange.Dispose()
|
||||||
PendingUsers.Clear()
|
PendingUsers.Clear()
|
||||||
MyDefs.Dispose()
|
MyDefs.Dispose()
|
||||||
End Sub
|
End Sub
|
||||||
@@ -258,9 +279,11 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
#Region "Images refill methods"
|
#Region "Images refill methods"
|
||||||
Private Sub AppendPendingUsers()
|
Private Sub AppendPendingUsers()
|
||||||
If LIST_POSTS.CheckedIndices.Count > 0 Then
|
If LIST_POSTS.CheckedIndices.Count > 0 Then
|
||||||
|
Dim c As Channel = GetCurrentChannel(False)
|
||||||
|
Dim lp As New ListAddParams(LAP.NotContainsOnly) With {.OnAddAction = Sub(ByVal u As PendingUser) u.ChannelUserAdded()}
|
||||||
PendingUsers.ListAddList((From p As ListViewItem In LIST_POSTS.Items
|
PendingUsers.ListAddList((From p As ListViewItem In LIST_POSTS.Items
|
||||||
Where p.Checked
|
Where p.Checked
|
||||||
Select New PendingUser(p.Text, GetPostBySelected(CStr(p.Tag)).CachedFile)), LNC)
|
Select New PendingUser(p.Text, c, GetPostBySelected(CStr(p.Tag)).CachedFile)), lp)
|
||||||
Dim a As Action = Sub() BTT_ADD_USERS.Text = $"Add ({PendingUsers.Count.ToString(CProvider)})"
|
Dim a As Action = Sub() BTT_ADD_USERS.Text = $"Add ({PendingUsers.Count.ToString(CProvider)})"
|
||||||
If ToolbarTOP.InvokeRequired Then ToolbarTOP.Invoke(a) Else a.Invoke
|
If ToolbarTOP.InvokeRequired Then ToolbarTOP.Invoke(a) Else a.Invoke
|
||||||
End If
|
End If
|
||||||
@@ -316,6 +339,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
TXT_LIMIT.Enabled = False
|
TXT_LIMIT.Enabled = False
|
||||||
CH_HIDE_EXISTS_USERS.Enabled = False
|
CH_HIDE_EXISTS_USERS.Enabled = False
|
||||||
CMB_CHANNELS.Enabled(True) = False
|
CMB_CHANNELS.Enabled(True) = False
|
||||||
|
BTT_SHOW_STATS.Enabled = False
|
||||||
MyRange.EnableButton(RButton.Previous, False)
|
MyRange.EnableButton(RButton.Previous, False)
|
||||||
MyRange.EnableButton(RButton.Next, False)
|
MyRange.EnableButton(RButton.Next, False)
|
||||||
End If
|
End If
|
||||||
@@ -329,6 +353,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
_CollectionDownloading = True
|
_CollectionDownloading = True
|
||||||
Settings.Channels.SetLimit(Me)
|
Settings.Channels.SetLimit(Me)
|
||||||
Await Task.Run(Sub() Settings.Channels.DownloadData(Token, CH_HIDE_EXISTS_USERS.Checked, CProgress))
|
Await Task.Run(Sub() Settings.Channels.DownloadData(Token, CH_HIDE_EXISTS_USERS.Checked, CProgress))
|
||||||
|
RaiseEvent OnDownloadDone("All channels downloaded")
|
||||||
Token.ThrowIfCancellationRequested()
|
Token.ThrowIfCancellationRequested()
|
||||||
c = GetCurrentChannel()
|
c = GetCurrentChannel()
|
||||||
Else
|
Else
|
||||||
@@ -337,6 +362,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
InvokeToken.Invoke()
|
InvokeToken.Invoke()
|
||||||
c.SetLimit(Me)
|
c.SetLimit(Me)
|
||||||
Await Task.Run(Sub() c.DownloadData(Token, CH_HIDE_EXISTS_USERS.Checked, CProgress))
|
Await Task.Run(Sub() c.DownloadData(Token, CH_HIDE_EXISTS_USERS.Checked, CProgress))
|
||||||
|
RaiseEvent OnDownloadDone($"Channel [{c.Name}] downloaded")
|
||||||
Token.ThrowIfCancellationRequested()
|
Token.ThrowIfCancellationRequested()
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
@@ -369,6 +395,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
TXT_LIMIT.Enabled = True
|
TXT_LIMIT.Enabled = True
|
||||||
CH_HIDE_EXISTS_USERS.Enabled = True
|
CH_HIDE_EXISTS_USERS.Enabled = True
|
||||||
CMB_CHANNELS.Enabled(True) = True
|
CMB_CHANNELS.Enabled(True) = True
|
||||||
|
BTT_SHOW_STATS.Enabled = True
|
||||||
CMB_CHANNELS_ActionOnCheckedChange(CMB_CHANNELS.Checked)
|
CMB_CHANNELS_ActionOnCheckedChange(CMB_CHANNELS.Checked)
|
||||||
With MyRange
|
With MyRange
|
||||||
.EnableButton(RButton.Previous, .Count > 0 AndAlso .CurrentIndex > 0)
|
.EnableButton(RButton.Previous, .Count > 0 AndAlso .CurrentIndex > 0)
|
||||||
@@ -416,7 +443,11 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
If Not Settings.UsersList.Contains(.ElementAt(i)) Then
|
If Not Settings.UsersList.Contains(.ElementAt(i)) Then
|
||||||
f = PendingUsers(i).File
|
f = PendingUsers(i).File
|
||||||
Settings.UpdateUsersList(.ElementAt(i))
|
Settings.UpdateUsersList(.ElementAt(i))
|
||||||
Settings.Users.Add(New UserData(.ElementAt(i), False) With {.Temporary = True, .CreatedByChannel = True})
|
Settings.Users.Add(New UserData(.ElementAt(i), False) With {
|
||||||
|
.Temporary = Settings.ChannelsDefaultTemporary,
|
||||||
|
.CreatedByChannel = True,
|
||||||
|
.ReadyForDownload = Settings.ChannelsDefaultReadyForDownload
|
||||||
|
})
|
||||||
With Settings.Users.Last
|
With Settings.Users.Last
|
||||||
.Labels.Add(CannelsLabelName)
|
.Labels.Add(CannelsLabelName)
|
||||||
.UpdateUserInformation()
|
.UpdateUserInformation()
|
||||||
@@ -512,12 +543,13 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
If Not c Is Nothing Then MyRange.ChangeSource(c, EDP.SendInLog)
|
If Not c Is Nothing Then MyRange.ChangeSource(c, EDP.SendInLog)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub CMB_CHANNELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_CHANNELS.ActionOnButtonClick
|
Private Sub CMB_CHANNELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_CHANNELS.ActionOnButtonClick
|
||||||
|
Dim c As Channel
|
||||||
Select Case Sender.DefaultButton
|
Select Case Sender.DefaultButton
|
||||||
Case CmbDefaultButtons.Refresh : RefillChannels()
|
Case CmbDefaultButtons.Refresh : RefillChannels()
|
||||||
Case CmbDefaultButtons.Add : AddNewChannel()
|
Case CmbDefaultButtons.Add : AddNewChannel()
|
||||||
Case CmbDefaultButtons.Delete
|
Case CmbDefaultButtons.Delete
|
||||||
Try
|
Try
|
||||||
Dim c As Channel = GetCurrentChannel()
|
c = GetCurrentChannel()
|
||||||
If Not c Is Nothing AndAlso MsgBoxE($"Do you really want to delete channel [{c}]?", MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = 0 Then
|
If Not c Is Nothing AndAlso MsgBoxE($"Do you really want to delete channel [{c}]?", MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = 0 Then
|
||||||
Settings.Channels.Remove(c)
|
Settings.Channels.Remove(c)
|
||||||
RefillChannels()
|
RefillChannels()
|
||||||
@@ -527,6 +559,13 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
End Try
|
End Try
|
||||||
Case CmbDefaultButtons.Up : ChangeComboIndex(-1)
|
Case CmbDefaultButtons.Up : ChangeComboIndex(-1)
|
||||||
Case CmbDefaultButtons.Down : ChangeComboIndex(1)
|
Case CmbDefaultButtons.Down : ChangeComboIndex(1)
|
||||||
|
Case CmbDefaultButtons.Info
|
||||||
|
Try
|
||||||
|
c = GetCurrentChannel()
|
||||||
|
If Not c Is Nothing Then MsgBoxE({c.GetChannelStats(True), "Channel statistics"})
|
||||||
|
Catch info_ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.LogMessageValue, info_ex, "Error on trying to show channel info")
|
||||||
|
End Try
|
||||||
End Select
|
End Select
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub CMB_CHANNELS_ActionOnCheckedChange(ByVal Mode As Boolean) Handles CMB_CHANNELS.ActionOnCheckedChange
|
Private Sub CMB_CHANNELS_ActionOnCheckedChange(ByVal Mode As Boolean) Handles CMB_CHANNELS.ActionOnCheckedChange
|
||||||
@@ -560,6 +599,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
End Sub
|
End Sub
|
||||||
Private Sub ChangeComboIndex(ByVal Appender As Integer)
|
Private Sub ChangeComboIndex(ByVal Appender As Integer)
|
||||||
Try
|
Try
|
||||||
|
AppendPendingUsers()
|
||||||
Dim _ComboUpEnabled As Boolean = False
|
Dim _ComboUpEnabled As Boolean = False
|
||||||
Dim _ComboDownEnabled As Boolean = False
|
Dim _ComboDownEnabled As Boolean = False
|
||||||
If CMB_CHANNELS.Count > 0 Then
|
If CMB_CHANNELS.Count > 0 Then
|
||||||
@@ -589,6 +629,12 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
MyRange.Update()
|
MyRange.Update()
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub BTT_SHOW_STATS_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_STATS.Click
|
||||||
|
Using f As New ChannelsStatsForm
|
||||||
|
f.ShowDialog()
|
||||||
|
If f.DeletedChannels > 0 Then RefillChannels()
|
||||||
|
End Using
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "CONTEXT"
|
#Region "CONTEXT"
|
||||||
Private Sub BTT_C_OPEN_USER_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_USER.Click
|
Private Sub BTT_C_OPEN_USER_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_USER.Click
|
||||||
@@ -621,10 +667,14 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
|||||||
Dim u$ = GetPostBySelected().UserID
|
Dim u$ = GetPostBySelected().UserID
|
||||||
If Not u.IsEmptyString Then
|
If Not u.IsEmptyString Then
|
||||||
Dim uRemoved As Boolean = False
|
Dim uRemoved As Boolean = False
|
||||||
If PendingUsers.Contains(u) Then PendingUsers.Remove(u) : uRemoved = True
|
Dim i% = PendingUsers.IndexOf(u)
|
||||||
|
If i >= 0 Then
|
||||||
|
PendingUsers(i).ChannelUserAdded(False)
|
||||||
|
PendingUsers.RemoveAt(i)
|
||||||
|
uRemoved = True
|
||||||
|
End If
|
||||||
With LIST_POSTS
|
With LIST_POSTS
|
||||||
If .Items.Count > 0 Then
|
If .Items.Count > 0 Then
|
||||||
Dim i%
|
|
||||||
Dim a As Action = Sub() .Items(i).Checked = False
|
Dim a As Action = Sub() .Items(i).Checked = False
|
||||||
For i = 0 To .Items.Count - 1
|
For i = 0 To .Items.Count - 1
|
||||||
If .Items(i).Text = u And .Items(i).Checked Then
|
If .Items(i).Text = u And .Items(i).Checked Then
|
||||||
|
|||||||
112
SCrawler/Channels/ChannelsStatsForm.Designer.vb
generated
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
' 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
|
||||||
|
|
||||||
|
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||||
|
Partial Friend Class ChannelsStatsForm : Inherits System.Windows.Forms.Form
|
||||||
|
<System.Diagnostics.DebuggerNonUserCode()>
|
||||||
|
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
|
||||||
|
<System.Diagnostics.DebuggerStepThrough()>
|
||||||
|
Private Sub InitializeComponent()
|
||||||
|
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(ChannelsStatsForm))
|
||||||
|
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 ListColumn1 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
|
Dim ListColumn2 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
|
Me.CMB_CHANNELS = New PersonalUtilities.Forms.Controls.ComboBoxExtended()
|
||||||
|
CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
||||||
|
CONTAINER_MAIN.ContentPanel.SuspendLayout()
|
||||||
|
CONTAINER_MAIN.SuspendLayout()
|
||||||
|
CType(Me.CMB_CHANNELS, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
Me.SuspendLayout()
|
||||||
|
'
|
||||||
|
'CONTAINER_MAIN
|
||||||
|
'
|
||||||
|
'
|
||||||
|
'CONTAINER_MAIN.ContentPanel
|
||||||
|
'
|
||||||
|
CONTAINER_MAIN.ContentPanel.Controls.Add(Me.CMB_CHANNELS)
|
||||||
|
CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(384, 261)
|
||||||
|
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(384, 261)
|
||||||
|
CONTAINER_MAIN.TabIndex = 0
|
||||||
|
CONTAINER_MAIN.TopToolStripPanelVisible = False
|
||||||
|
'
|
||||||
|
'CMB_CHANNELS
|
||||||
|
'
|
||||||
|
ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton1.Index = 0
|
||||||
|
ActionButton1.Name = "BTT_COMBOBOX_ARROW"
|
||||||
|
ActionButton1.Visible = False
|
||||||
|
ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton2.Index = 1
|
||||||
|
ActionButton2.Name = "BTT_CLEAR"
|
||||||
|
ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton3.Index = 2
|
||||||
|
ActionButton3.Name = "BTT_DELETE"
|
||||||
|
Me.CMB_CHANNELS.Buttons.Add(ActionButton1)
|
||||||
|
Me.CMB_CHANNELS.Buttons.Add(ActionButton2)
|
||||||
|
Me.CMB_CHANNELS.Buttons.Add(ActionButton3)
|
||||||
|
Me.CMB_CHANNELS.ClearTextByButtonClear = False
|
||||||
|
ListColumn1.DisplayMember = True
|
||||||
|
ListColumn1.Name = "COL_INFO"
|
||||||
|
ListColumn1.Text = "Information"
|
||||||
|
ListColumn1.Width = -2
|
||||||
|
ListColumn2.Name = "COL_VALUE"
|
||||||
|
ListColumn2.Text = "Channel"
|
||||||
|
ListColumn2.ValueMember = True
|
||||||
|
ListColumn2.Visible = False
|
||||||
|
Me.CMB_CHANNELS.Columns.Add(ListColumn1)
|
||||||
|
Me.CMB_CHANNELS.Columns.Add(ListColumn2)
|
||||||
|
Me.CMB_CHANNELS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CMB_CHANNELS.ListCheckBoxes = True
|
||||||
|
Me.CMB_CHANNELS.ListDropDownStyle = PersonalUtilities.Forms.Controls.ComboBoxExtended.ListMode.Simple
|
||||||
|
Me.CMB_CHANNELS.ListGridVisible = True
|
||||||
|
Me.CMB_CHANNELS.ListMultiSelect = True
|
||||||
|
Me.CMB_CHANNELS.Location = New System.Drawing.Point(0, 0)
|
||||||
|
Me.CMB_CHANNELS.Name = "CMB_CHANNELS"
|
||||||
|
Me.CMB_CHANNELS.Size = New System.Drawing.Size(386, 262)
|
||||||
|
Me.CMB_CHANNELS.TabIndex = 0
|
||||||
|
'
|
||||||
|
'ChannelsStatsForm
|
||||||
|
'
|
||||||
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
|
Me.ClientSize = New System.Drawing.Size(384, 261)
|
||||||
|
Me.Controls.Add(CONTAINER_MAIN)
|
||||||
|
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
|
||||||
|
Me.KeyPreview = True
|
||||||
|
Me.MinimizeBox = False
|
||||||
|
Me.MinimumSize = New System.Drawing.Size(400, 300)
|
||||||
|
Me.Name = "ChannelsStatsForm"
|
||||||
|
Me.ShowInTaskbar = False
|
||||||
|
Me.Text = "Channels statistics"
|
||||||
|
CONTAINER_MAIN.ContentPanel.ResumeLayout(False)
|
||||||
|
CONTAINER_MAIN.ResumeLayout(False)
|
||||||
|
CONTAINER_MAIN.PerformLayout()
|
||||||
|
CType(Me.CMB_CHANNELS, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
Me.ResumeLayout(False)
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
Private WithEvents CMB_CHANNELS As PersonalUtilities.Forms.Controls.ComboBoxExtended
|
||||||
|
End Class
|
||||||
@@ -117,19 +117,98 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<metadata name="TP_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="CONTAINER_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
<data name="ActionButton1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t
|
||||||
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL
|
||||||
WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP
|
GlAKCkhEC4KgQlsLQkqhKi/lrYWWlxaw3dLddrerz/Q89+7dc2fbfTn3npf5fJJv2rS758z85nnOzJz5
|
||||||
aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+
|
nZktAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
cMaRN0UdBBkAAAAASUVORK5CYII=
|
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
|
||||||
|
AAAASUVORK5CYII=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton2.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton2.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
@@ -142,68 +221,31 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="ActionButton3.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton3.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
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
|
|
||||||
AAAASUVORK5CYII=
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="ActionButton4.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
|
||||||
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
|
||||||
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
|
||||||
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
84
SCrawler/Channels/ChannelsStatsForm.vb
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
' 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.ComponentModel
|
||||||
|
Imports PersonalUtilities.Forms
|
||||||
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
|
Friend Class ChannelsStatsForm : Implements IOkCancelDeleteToolbar
|
||||||
|
Private ReadOnly MyDefs As DefaultFormProps
|
||||||
|
Friend Property DeletedChannels As Integer = 0
|
||||||
|
Friend Sub New()
|
||||||
|
InitializeComponent()
|
||||||
|
MyDefs = New DefaultFormProps
|
||||||
|
End Sub
|
||||||
|
Private Sub ChannelsStatsForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||||
|
Try
|
||||||
|
With MyDefs
|
||||||
|
.MyViewInitialize(Me, Settings.Design)
|
||||||
|
.AddOkCancelToolbar()
|
||||||
|
.DelegateClosingChecker()
|
||||||
|
.MyOkCancel.EnableDelete = False
|
||||||
|
If Settings.Channels.Count > 0 Then
|
||||||
|
RefillList()
|
||||||
|
Else
|
||||||
|
MsgBoxE("Channels not found", vbExclamation)
|
||||||
|
End If
|
||||||
|
.AppendDetectors()
|
||||||
|
.EndLoaderOperations()
|
||||||
|
End With
|
||||||
|
Catch ex As Exception
|
||||||
|
MyDefs.InvokeLoaderError(ex)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub ChannelsStatsForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
|
||||||
|
MyDefs.Dispose()
|
||||||
|
End Sub
|
||||||
|
Private Sub RefillList()
|
||||||
|
CMB_CHANNELS.Items.Clear()
|
||||||
|
If Settings.Channels.Count > 0 Then
|
||||||
|
CMB_CHANNELS.BeginUpdate()
|
||||||
|
CMB_CHANNELS.Items.AddRange(Settings.Channels.Select(Function(c) New ListItem({$"[{c.ID}]: {c.GetChannelStats(False)}", c.ID})))
|
||||||
|
CMB_CHANNELS.EndUpdate()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
||||||
|
MyDefs.CloseForm()
|
||||||
|
End Sub
|
||||||
|
Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
||||||
|
MyDefs.CloseForm(DialogResult.Cancel)
|
||||||
|
End Sub
|
||||||
|
Private Sub ToolbarBttDelete() Implements IOkCancelDeleteToolbar.ToolbarBttDelete
|
||||||
|
Try
|
||||||
|
Dim c As List(Of String) = CMB_CHANNELS.Items.CheckedItems.Select(Function(cc) CStr(cc.Value(1))).ListIfNothing
|
||||||
|
If c.ListExists Then
|
||||||
|
If MsgBoxE({$"The following channels will be deleted:{vbCr}{c.ListToString(, vbCr)}", "Deleting channels"}, vbExclamation,,, {"Confirm", "Cancel"}) = 0 Then
|
||||||
|
For Each CID$ In c : Settings.Channels.Remove(Settings.Channels.Find(CID)) : Next
|
||||||
|
MyMainLOG = $"Deleted channels:{vbNewLine}{c.ListToString(, vbNewLine)}"
|
||||||
|
MsgBoxE("Channels deleted")
|
||||||
|
DeletedChannels += c.Count
|
||||||
|
c.Clear()
|
||||||
|
MyDefs.ChangesDetected = False
|
||||||
|
RefillList()
|
||||||
|
Else
|
||||||
|
MsgBoxE("Operation canceled")
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
MsgBoxE("No one channel checked", vbExclamation)
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Deleting channels")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub CMB_CHANNELS_ActionOnChangeDetected(ByVal c As Boolean) Handles CMB_CHANNELS.ActionOnChangeDetected
|
||||||
|
If Not MyDefs.Initializing Then MyDefs.MyOkCancel.EnableDelete = CMB_CHANNELS.ListCheckedIndexes.Count > 0
|
||||||
|
End Sub
|
||||||
|
Private Sub CMB_CHANNELS_ActionOnButtonClearClick() Handles CMB_CHANNELS.ActionOnButtonClearClick
|
||||||
|
CMB_CHANNELS.ListCheckedIndexes = Nothing
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
BIN
SCrawler/Content/Icons/BookmarkIcon_32.ico
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
SCrawler/Content/Icons/InstagramIcon.ico
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
SCrawler/Content/Icons/SettingsIcon.ico
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
SCrawler/Content/Pictures/BookmarkBlack_16.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
SCrawler/Content/Pictures/HeartPic_32.png
Normal file
|
After Width: | Height: | Size: 525 B |
BIN
SCrawler/Content/Pictures/InstagramPic76.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
SCrawler/Content/Pictures/SettingsPic_16.bmp
Normal file
|
After Width: | Height: | Size: 824 B |
BIN
SCrawler/Content/Pictures/TwitterPic400.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
336
SCrawler/DownloadSavedPostsForm.Designer.vb
generated
Normal file
@@ -0,0 +1,336 @@
|
|||||||
|
' 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
|
||||||
|
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||||
|
Partial Friend Class DownloadSavedPostsForm : Inherits System.Windows.Forms.Form
|
||||||
|
<System.Diagnostics.DebuggerNonUserCode()>
|
||||||
|
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
|
||||||
|
<System.Diagnostics.DebuggerStepThrough()>
|
||||||
|
Private Sub InitializeComponent()
|
||||||
|
Me.components = New System.ComponentModel.Container()
|
||||||
|
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim TP_BUTTONS As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim TP_REDDIT As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim TP_REDDIT_PR As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim TP_INST As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim TP_INST_PR As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(DownloadSavedPostsForm))
|
||||||
|
Dim TT_MAIN As System.Windows.Forms.ToolTip
|
||||||
|
Me.BTT_DOWN_ALL = New System.Windows.Forms.Button()
|
||||||
|
Me.BTT_STOP_ALL = New System.Windows.Forms.Button()
|
||||||
|
Me.BTT_REDDIT_START = New System.Windows.Forms.Button()
|
||||||
|
Me.BTT_REDDIT_STOP = New System.Windows.Forms.Button()
|
||||||
|
Me.PR_REDDIT = New System.Windows.Forms.ProgressBar()
|
||||||
|
Me.BTT_REDDIT_OPEN = New System.Windows.Forms.Button()
|
||||||
|
Me.LBL_REDDIT = New System.Windows.Forms.Label()
|
||||||
|
Me.BTT_INST_START = New System.Windows.Forms.Button()
|
||||||
|
Me.BTT_INST_STOP = New System.Windows.Forms.Button()
|
||||||
|
Me.PR_INST = New System.Windows.Forms.ProgressBar()
|
||||||
|
Me.BTT_INST_OPEN = New System.Windows.Forms.Button()
|
||||||
|
Me.LBL_INST = New System.Windows.Forms.Label()
|
||||||
|
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TP_BUTTONS = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TP_REDDIT = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TP_REDDIT_PR = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TP_INST = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TP_INST_PR = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TT_MAIN = New System.Windows.Forms.ToolTip(Me.components)
|
||||||
|
TP_MAIN.SuspendLayout()
|
||||||
|
TP_BUTTONS.SuspendLayout()
|
||||||
|
TP_REDDIT.SuspendLayout()
|
||||||
|
TP_REDDIT_PR.SuspendLayout()
|
||||||
|
TP_INST.SuspendLayout()
|
||||||
|
TP_INST_PR.SuspendLayout()
|
||||||
|
Me.SuspendLayout()
|
||||||
|
'
|
||||||
|
'TP_MAIN
|
||||||
|
'
|
||||||
|
TP_MAIN.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Inset
|
||||||
|
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_BUTTONS, 0, 0)
|
||||||
|
TP_MAIN.Controls.Add(TP_REDDIT, 0, 1)
|
||||||
|
TP_MAIN.Controls.Add(TP_INST, 0, 2)
|
||||||
|
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 = 3
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_MAIN.Size = New System.Drawing.Size(484, 156)
|
||||||
|
TP_MAIN.TabIndex = 0
|
||||||
|
'
|
||||||
|
'TP_BUTTONS
|
||||||
|
'
|
||||||
|
TP_BUTTONS.ColumnCount = 2
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
|
||||||
|
TP_BUTTONS.Controls.Add(Me.BTT_DOWN_ALL, 0, 0)
|
||||||
|
TP_BUTTONS.Controls.Add(Me.BTT_STOP_ALL, 1, 0)
|
||||||
|
TP_BUTTONS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_BUTTONS.Location = New System.Drawing.Point(2, 2)
|
||||||
|
TP_BUTTONS.Margin = New System.Windows.Forms.Padding(0)
|
||||||
|
TP_BUTTONS.Name = "TP_BUTTONS"
|
||||||
|
TP_BUTTONS.RowCount = 1
|
||||||
|
TP_BUTTONS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_BUTTONS.Size = New System.Drawing.Size(480, 30)
|
||||||
|
TP_BUTTONS.TabIndex = 0
|
||||||
|
'
|
||||||
|
'BTT_DOWN_ALL
|
||||||
|
'
|
||||||
|
Me.BTT_DOWN_ALL.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_DOWN_ALL.Location = New System.Drawing.Point(3, 3)
|
||||||
|
Me.BTT_DOWN_ALL.Name = "BTT_DOWN_ALL"
|
||||||
|
Me.BTT_DOWN_ALL.Size = New System.Drawing.Size(234, 24)
|
||||||
|
Me.BTT_DOWN_ALL.TabIndex = 0
|
||||||
|
Me.BTT_DOWN_ALL.Text = "Download ALL"
|
||||||
|
Me.BTT_DOWN_ALL.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'BTT_STOP_ALL
|
||||||
|
'
|
||||||
|
Me.BTT_STOP_ALL.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_STOP_ALL.Location = New System.Drawing.Point(243, 3)
|
||||||
|
Me.BTT_STOP_ALL.Name = "BTT_STOP_ALL"
|
||||||
|
Me.BTT_STOP_ALL.Size = New System.Drawing.Size(234, 24)
|
||||||
|
Me.BTT_STOP_ALL.TabIndex = 1
|
||||||
|
Me.BTT_STOP_ALL.Text = "Stop ALL"
|
||||||
|
Me.BTT_STOP_ALL.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'TP_REDDIT
|
||||||
|
'
|
||||||
|
TP_REDDIT.ColumnCount = 1
|
||||||
|
TP_REDDIT.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_REDDIT.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
|
||||||
|
TP_REDDIT.Controls.Add(TP_REDDIT_PR, 0, 0)
|
||||||
|
TP_REDDIT.Controls.Add(Me.LBL_REDDIT, 0, 1)
|
||||||
|
TP_REDDIT.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_REDDIT.Location = New System.Drawing.Point(2, 34)
|
||||||
|
TP_REDDIT.Margin = New System.Windows.Forms.Padding(0)
|
||||||
|
TP_REDDIT.Name = "TP_REDDIT"
|
||||||
|
TP_REDDIT.RowCount = 2
|
||||||
|
TP_REDDIT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_REDDIT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_REDDIT.Size = New System.Drawing.Size(480, 59)
|
||||||
|
TP_REDDIT.TabIndex = 1
|
||||||
|
'
|
||||||
|
'TP_REDDIT_PR
|
||||||
|
'
|
||||||
|
TP_REDDIT_PR.ColumnCount = 4
|
||||||
|
TP_REDDIT_PR.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
|
TP_REDDIT_PR.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
|
TP_REDDIT_PR.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
|
TP_REDDIT_PR.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_REDDIT_PR.Controls.Add(Me.BTT_REDDIT_START, 0, 0)
|
||||||
|
TP_REDDIT_PR.Controls.Add(Me.BTT_REDDIT_STOP, 1, 0)
|
||||||
|
TP_REDDIT_PR.Controls.Add(Me.PR_REDDIT, 3, 0)
|
||||||
|
TP_REDDIT_PR.Controls.Add(Me.BTT_REDDIT_OPEN, 2, 0)
|
||||||
|
TP_REDDIT_PR.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_REDDIT_PR.Location = New System.Drawing.Point(0, 0)
|
||||||
|
TP_REDDIT_PR.Margin = New System.Windows.Forms.Padding(0)
|
||||||
|
TP_REDDIT_PR.Name = "TP_REDDIT_PR"
|
||||||
|
TP_REDDIT_PR.RowCount = 1
|
||||||
|
TP_REDDIT_PR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_REDDIT_PR.Size = New System.Drawing.Size(480, 29)
|
||||||
|
TP_REDDIT_PR.TabIndex = 0
|
||||||
|
'
|
||||||
|
'BTT_REDDIT_START
|
||||||
|
'
|
||||||
|
Me.BTT_REDDIT_START.BackgroundImage = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||||
|
Me.BTT_REDDIT_START.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
|
||||||
|
Me.BTT_REDDIT_START.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_REDDIT_START.Location = New System.Drawing.Point(3, 3)
|
||||||
|
Me.BTT_REDDIT_START.Name = "BTT_REDDIT_START"
|
||||||
|
Me.BTT_REDDIT_START.Size = New System.Drawing.Size(24, 23)
|
||||||
|
Me.BTT_REDDIT_START.TabIndex = 0
|
||||||
|
TT_MAIN.SetToolTip(Me.BTT_REDDIT_START, "Start downloading saved Reddit posts")
|
||||||
|
Me.BTT_REDDIT_START.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'BTT_REDDIT_STOP
|
||||||
|
'
|
||||||
|
Me.BTT_REDDIT_STOP.BackgroundImage = Global.SCrawler.My.Resources.Resources.Delete
|
||||||
|
Me.BTT_REDDIT_STOP.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
|
||||||
|
Me.BTT_REDDIT_STOP.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_REDDIT_STOP.Enabled = False
|
||||||
|
Me.BTT_REDDIT_STOP.Location = New System.Drawing.Point(33, 3)
|
||||||
|
Me.BTT_REDDIT_STOP.Name = "BTT_REDDIT_STOP"
|
||||||
|
Me.BTT_REDDIT_STOP.Size = New System.Drawing.Size(24, 23)
|
||||||
|
Me.BTT_REDDIT_STOP.TabIndex = 1
|
||||||
|
TT_MAIN.SetToolTip(Me.BTT_REDDIT_STOP, "Stop downloading saved Reddit posts")
|
||||||
|
Me.BTT_REDDIT_STOP.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'PR_REDDIT
|
||||||
|
'
|
||||||
|
Me.PR_REDDIT.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.PR_REDDIT.Location = New System.Drawing.Point(93, 3)
|
||||||
|
Me.PR_REDDIT.Name = "PR_REDDIT"
|
||||||
|
Me.PR_REDDIT.Size = New System.Drawing.Size(384, 23)
|
||||||
|
Me.PR_REDDIT.TabIndex = 2
|
||||||
|
'
|
||||||
|
'BTT_REDDIT_OPEN
|
||||||
|
'
|
||||||
|
Me.BTT_REDDIT_OPEN.BackgroundImage = CType(resources.GetObject("BTT_REDDIT_OPEN.BackgroundImage"), System.Drawing.Image)
|
||||||
|
Me.BTT_REDDIT_OPEN.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
|
||||||
|
Me.BTT_REDDIT_OPEN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_REDDIT_OPEN.Location = New System.Drawing.Point(63, 3)
|
||||||
|
Me.BTT_REDDIT_OPEN.Name = "BTT_REDDIT_OPEN"
|
||||||
|
Me.BTT_REDDIT_OPEN.Size = New System.Drawing.Size(24, 23)
|
||||||
|
Me.BTT_REDDIT_OPEN.TabIndex = 3
|
||||||
|
Me.BTT_REDDIT_OPEN.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'LBL_REDDIT
|
||||||
|
'
|
||||||
|
Me.LBL_REDDIT.AutoSize = True
|
||||||
|
Me.LBL_REDDIT.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.LBL_REDDIT.Location = New System.Drawing.Point(3, 29)
|
||||||
|
Me.LBL_REDDIT.Name = "LBL_REDDIT"
|
||||||
|
Me.LBL_REDDIT.Size = New System.Drawing.Size(474, 30)
|
||||||
|
Me.LBL_REDDIT.TabIndex = 1
|
||||||
|
Me.LBL_REDDIT.Text = "Reddit"
|
||||||
|
Me.LBL_REDDIT.TextAlign = System.Drawing.ContentAlignment.TopCenter
|
||||||
|
'
|
||||||
|
'TP_INST
|
||||||
|
'
|
||||||
|
TP_INST.ColumnCount = 1
|
||||||
|
TP_INST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_INST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
|
||||||
|
TP_INST.Controls.Add(TP_INST_PR, 0, 0)
|
||||||
|
TP_INST.Controls.Add(Me.LBL_INST, 0, 1)
|
||||||
|
TP_INST.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_INST.Location = New System.Drawing.Point(2, 95)
|
||||||
|
TP_INST.Margin = New System.Windows.Forms.Padding(0)
|
||||||
|
TP_INST.Name = "TP_INST"
|
||||||
|
TP_INST.RowCount = 2
|
||||||
|
TP_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_INST.Size = New System.Drawing.Size(480, 59)
|
||||||
|
TP_INST.TabIndex = 2
|
||||||
|
'
|
||||||
|
'TP_INST_PR
|
||||||
|
'
|
||||||
|
TP_INST_PR.ColumnCount = 4
|
||||||
|
TP_INST_PR.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
|
TP_INST_PR.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
|
TP_INST_PR.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
|
TP_INST_PR.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_INST_PR.Controls.Add(Me.BTT_INST_START, 0, 0)
|
||||||
|
TP_INST_PR.Controls.Add(Me.BTT_INST_STOP, 1, 0)
|
||||||
|
TP_INST_PR.Controls.Add(Me.PR_INST, 3, 0)
|
||||||
|
TP_INST_PR.Controls.Add(Me.BTT_INST_OPEN, 2, 0)
|
||||||
|
TP_INST_PR.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_INST_PR.Location = New System.Drawing.Point(0, 0)
|
||||||
|
TP_INST_PR.Margin = New System.Windows.Forms.Padding(0)
|
||||||
|
TP_INST_PR.Name = "TP_INST_PR"
|
||||||
|
TP_INST_PR.RowCount = 1
|
||||||
|
TP_INST_PR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_INST_PR.Size = New System.Drawing.Size(480, 29)
|
||||||
|
TP_INST_PR.TabIndex = 0
|
||||||
|
'
|
||||||
|
'BTT_INST_START
|
||||||
|
'
|
||||||
|
Me.BTT_INST_START.BackgroundImage = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||||
|
Me.BTT_INST_START.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
|
||||||
|
Me.BTT_INST_START.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_INST_START.Location = New System.Drawing.Point(3, 3)
|
||||||
|
Me.BTT_INST_START.Name = "BTT_INST_START"
|
||||||
|
Me.BTT_INST_START.Size = New System.Drawing.Size(24, 23)
|
||||||
|
Me.BTT_INST_START.TabIndex = 0
|
||||||
|
TT_MAIN.SetToolTip(Me.BTT_INST_START, "Start downloading saved Instagram posts")
|
||||||
|
Me.BTT_INST_START.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'BTT_INST_STOP
|
||||||
|
'
|
||||||
|
Me.BTT_INST_STOP.BackgroundImage = Global.SCrawler.My.Resources.Resources.Delete
|
||||||
|
Me.BTT_INST_STOP.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
|
||||||
|
Me.BTT_INST_STOP.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_INST_STOP.Enabled = False
|
||||||
|
Me.BTT_INST_STOP.Location = New System.Drawing.Point(33, 3)
|
||||||
|
Me.BTT_INST_STOP.Name = "BTT_INST_STOP"
|
||||||
|
Me.BTT_INST_STOP.Size = New System.Drawing.Size(24, 23)
|
||||||
|
Me.BTT_INST_STOP.TabIndex = 1
|
||||||
|
TT_MAIN.SetToolTip(Me.BTT_INST_STOP, "Stop downloading saved Instagram posts")
|
||||||
|
Me.BTT_INST_STOP.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'PR_INST
|
||||||
|
'
|
||||||
|
Me.PR_INST.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.PR_INST.Location = New System.Drawing.Point(93, 3)
|
||||||
|
Me.PR_INST.Name = "PR_INST"
|
||||||
|
Me.PR_INST.Size = New System.Drawing.Size(384, 23)
|
||||||
|
Me.PR_INST.TabIndex = 2
|
||||||
|
'
|
||||||
|
'BTT_INST_OPEN
|
||||||
|
'
|
||||||
|
Me.BTT_INST_OPEN.BackgroundImage = CType(resources.GetObject("BTT_INST_OPEN.BackgroundImage"), System.Drawing.Image)
|
||||||
|
Me.BTT_INST_OPEN.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom
|
||||||
|
Me.BTT_INST_OPEN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_INST_OPEN.Location = New System.Drawing.Point(63, 3)
|
||||||
|
Me.BTT_INST_OPEN.Name = "BTT_INST_OPEN"
|
||||||
|
Me.BTT_INST_OPEN.Size = New System.Drawing.Size(24, 23)
|
||||||
|
Me.BTT_INST_OPEN.TabIndex = 3
|
||||||
|
Me.BTT_INST_OPEN.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'LBL_INST
|
||||||
|
'
|
||||||
|
Me.LBL_INST.AutoSize = True
|
||||||
|
Me.LBL_INST.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.LBL_INST.Location = New System.Drawing.Point(3, 29)
|
||||||
|
Me.LBL_INST.Name = "LBL_INST"
|
||||||
|
Me.LBL_INST.Size = New System.Drawing.Size(474, 30)
|
||||||
|
Me.LBL_INST.TabIndex = 1
|
||||||
|
Me.LBL_INST.Text = "Instagram"
|
||||||
|
Me.LBL_INST.TextAlign = System.Drawing.ContentAlignment.TopCenter
|
||||||
|
'
|
||||||
|
'DownloadSavedPostsForm
|
||||||
|
'
|
||||||
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
|
Me.ClientSize = New System.Drawing.Size(484, 156)
|
||||||
|
Me.Controls.Add(TP_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(500, 195)
|
||||||
|
Me.MinimumSize = New System.Drawing.Size(500, 195)
|
||||||
|
Me.Name = "DownloadSavedPostsForm"
|
||||||
|
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
||||||
|
Me.Text = "Saved posts"
|
||||||
|
TP_MAIN.ResumeLayout(False)
|
||||||
|
TP_BUTTONS.ResumeLayout(False)
|
||||||
|
TP_REDDIT.ResumeLayout(False)
|
||||||
|
TP_REDDIT.PerformLayout()
|
||||||
|
TP_REDDIT_PR.ResumeLayout(False)
|
||||||
|
TP_INST.ResumeLayout(False)
|
||||||
|
TP_INST.PerformLayout()
|
||||||
|
TP_INST_PR.ResumeLayout(False)
|
||||||
|
Me.ResumeLayout(False)
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
Private WithEvents BTT_DOWN_ALL As Button
|
||||||
|
Private WithEvents BTT_STOP_ALL As Button
|
||||||
|
Private WithEvents BTT_REDDIT_START As Button
|
||||||
|
Private WithEvents BTT_REDDIT_STOP As Button
|
||||||
|
Private WithEvents PR_REDDIT As ProgressBar
|
||||||
|
Private WithEvents LBL_REDDIT As Label
|
||||||
|
Private WithEvents BTT_INST_START As Button
|
||||||
|
Private WithEvents BTT_INST_STOP As Button
|
||||||
|
Private WithEvents PR_INST As ProgressBar
|
||||||
|
Private WithEvents LBL_INST As Label
|
||||||
|
Private WithEvents BTT_REDDIT_OPEN As Button
|
||||||
|
Private WithEvents BTT_INST_OPEN As Button
|
||||||
|
End Class
|
||||||
492
SCrawler/DownloadSavedPostsForm.resx
Normal file
@@ -0,0 +1,492 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="TP_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TP_BUTTONS.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TP_REDDIT.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TP_REDDIT_PR.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TP_INST.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TP_INST_PR.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
|
<data name="BTT_INST_OPEN.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
|
WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP
|
||||||
|
aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+
|
||||||
|
5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8
|
||||||
|
vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB
|
||||||
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="TP_REDDIT_PR.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TT_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TT_MAIN.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="BTT_REDDIT_OPEN.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
|
WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP
|
||||||
|
aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+
|
||||||
|
5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8
|
||||||
|
vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB
|
||||||
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="TT_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TT_MAIN.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
|
V/9RUVH/RUVF/z09Pf89PT3/b29v/8vLy//8/PzB////Pvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA////Pvz8/MHMzMz/b29v/z4+Pv8/Pz//QUFB/0BA
|
||||||
|
QP9AQED/QEBA/0BAQP9BQUH/Pz8//z4+Pv9vb2//zMzM//z8/MH///8+9vb2APb29gAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vb2APb29gD///8+/Pz8wczMzP9vb2//Pj4+/z8/
|
||||||
|
P/9CQkL/QUFB/0FBQf9BQUH/QUFB/0JCQv8/Pz//Pj4+/29vb//MzMz//Pz8wf///z729vYA9vb2AAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29vYA9vb2AP///z78/PzBzMzM/29v
|
||||||
|
b/8+Pj7/Pz8//0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z8/P/8+Pj7/b29v/8zMzP/8/PzB////Pvb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA////Pvz8
|
||||||
|
/MHMzMz/b29v/z4+Pv8/Pz//QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/Pz8//z4+Pv9vb2//zMzM//z8
|
||||||
|
/MH///8+9vb2APb29gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vb2APb2
|
||||||
|
9gD///8+/Pz8wczMzP9vb2//Pj4+/z8/P/9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv8/Pz//Pj4+/29v
|
||||||
|
b//MzMz//Pz8wf///z729vYA9vb2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAD29vYA9vb2AP///z78/PzBzMzM/29vb/8+Pj7/Pz8//0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z8/
|
||||||
|
P/8+Pj7/b29v/8zMzP/8/PzB////Pvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA////Pvz8/MHMzMz/b29v/z4+Pv8/Pz//QkJC/0JCQv9CQkL/QkJC/0JC
|
||||||
|
Qv9CQkL/Pz8//z4+Pv9vb2//zMzM//z8/MH///8+9vb2APb29gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAA9vb2APb29gD///8+/Pz8wczMzP9vb2//Pj4+/z8/P/9CQkL/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv8/Pz//Pj4+/29vb//MzMz//Pz8wf///z729vYA9vb2AAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29vYA9vb2AP///z78/PzBzMzM/29vb/8+Pj7/Pz8//0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC/z8/P/8+Pj7/b29v/8zMzP/8/PzB////Pvb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA////Pvz8/MHMzMz/b29v/z4+
|
||||||
|
Pv8/Pz//QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/Pz8//z4+Pv9vb2//zMzM//z8/MH///8+9vb2APb2
|
||||||
|
9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vb2APb29gD///8+/Pz8wczM
|
||||||
|
zP9vb2//Pj4+/z8/P/9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv8/Pz//Pj4+/29vb//MzMz//Pz8wf//
|
||||||
|
/z729vYA9vb2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29vYA9vb2AP//
|
||||||
|
/z78/PzBzMzM/29vb/8+Pj7/Pz8//0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z8/P/8+Pj7/b29v/8zM
|
||||||
|
zP/8/PzB////Pvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA////Pvz8/MHMzMz/b29v/z4+Pv8/Pz//QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/Pz8//z4+
|
||||||
|
Pv9vb2//zMzM//z8/MH///8+9vb2APb29gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAA9vb2APb29gD///8+/Pz8wczMzP9vb2//Pj4+/z8/P/9CQkL/QkJC/0JCQv9CQkL/QkJC/0JC
|
||||||
|
Qv8/Pz//Pj4+/29vb//MzMz//Pz8wf///z729vYA9vb2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAD29vYA9vb2AP///z78/PzBy8vL/21tbf87Ozv/PT09/z8/P/8/Pz//Pz8//z8/
|
||||||
|
P/8/Pz//Pz8//z09Pf87Ozv/bW1t/8vLy//8/PzB////Pvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA////Pvz8/MHLy8v/bGxs/zk5Of87Ozv/Pj4+/z4+
|
||||||
|
Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Ozs7/zk5Of9sbGz/y8vL//z8/MH///8+9vb2APb29gAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vb2APb29gD+/v4++vr6wdbW1v+RkZH/bGxs/21t
|
||||||
|
bf9vb2//b29v/29vb/9vb2//b29v/29vb/9tbW3/bGxs/5GRkf/W1tb/+vr6wf7+/j729vYA9vb2AAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29vYA9vb2APn5+T739/fB7Ozs/9bW
|
||||||
|
1v/Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/1tbW/+zs7P/39/fB+fn5Pvb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Lvb2
|
||||||
|
9pH39/fD+vr6wfz8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/6+vrB9/f3w/b2
|
||||||
|
9pH29vYu9vb2APb29gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vb2APb2
|
||||||
|
9gD19fUP9vb2Lvj4+D79/f09////PP///zz///88////PP///zz///88////PP///zz///88////PP39
|
||||||
|
/T34+Pg+9vb2LvX19Q/29vYA9vb2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gfgf/4H
|
||||||
|
4H/+AAB//gAAf/4AAH/+AAB//gAAf/4AAH/+AAB//gAAf/4AAH/+AAB//gAAf/4AAH/+AAB//gAAf/4A
|
||||||
|
AH/+AAB//gAAf/4AAH/+AAB//gAAf/4AAH/+AAB//gAAf/4AAH/+AAB//gAAf/4AAH/+AAB//////ygA
|
||||||
|
AAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Afb29gX29vYK9vb2Dvb29hD29vYQ9vb2Dvb2
|
||||||
|
9gr29vYF9vb2Afb29gD29vYAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Afb29gX29vYK9vb2Dvb2
|
||||||
|
9hD29vYQ9vb2Dvb29gr29vYF9vb2Afb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2BPb29hr29vY29vb2S/b2
|
||||||
|
9lT29vZU9vb2S/b29jb29vYa9vb2BPb29gD29vYAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2BPb2
|
||||||
|
9hr29vY29vb2S/b29lT29vZU9vb2S/b29jb29vYa9vb2BPb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Cfb2
|
||||||
|
9jf29vZy9vb2n/b29rL29vay9vb2n/b29nL29vY39vb2Cfb29gD29vYAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2Cfb29jf29vZy9vb2n/b29rL29vay9vb2n/b29nL29vY39vb2Cfb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2Dfb29k729vaj9vb24/b29v729vb+9vb25Pb29qj29vZX9vb2G/b29gf29vYJ9vb2Dvb2
|
||||||
|
9g729vYO9vb2Dvb29gn29vYH9vb2G/b29lf29vao9vb25Pb29v729vb+9vb24/b29qP29vZO9vb2Dfb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA9vb2Dvb29lL29vat9vb28ff39//4+Pj/+fn59fn5+cf5+fmK+Pj4XPf3
|
||||||
|
90339/dO9vb2Uvb29lL29vZS9vb2Uvf390739/dN+Pj4XPn5+Yr5+fnH+fn59fj4+P/39/f/9vb28fb2
|
||||||
|
9q329vZS9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dvb29lL29vat9vb28fj4+P/5+fn/+vr6+vr6
|
||||||
|
+uT5+fnH+Pj4sff396r29var9vb2rfb29q329vat9vb2rfb29qv39/eq+Pj4sfn5+cf6+vrk+vr6+vn5
|
||||||
|
+f/4+Pj/9vb28fb29q329vZS9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dvf391L29vat9vb28fPz
|
||||||
|
8//w8PD/7+/v/u/v7/ry8vL19PT08vX19fD29vbx9vb28fb29vH29vbx9vb28fb29vH19fXw9PT08vLy
|
||||||
|
8vXv7+/67+/v/vDw8P/z8/P/9vb28fb29q339/dS9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dvn5
|
||||||
|
+VL4+Pit8/Pz8efn5//W1tb/zMzM/9LS0v/h4eH/7e3t//Pz8//29vb/9/f3//j4+P/4+Pj/9/f3//b2
|
||||||
|
9v/z8/P/7e3t/+Hh4f/S0tL/zMzM/9bW1v/n5+f/8/Pz8fj4+K35+flS9vb2Dvb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2Dv39/VL7+/ut8PDw8dbW1v+zs7P/np6e/6qqqv/Hx8f/4eHh/+7u7v/09PT/+Pj4//r6
|
||||||
|
+v/6+vr/+Pj4//T09P/u7u7/4eHh/8fHx/+qqqr/np6e/7Ozs//W1tb/8PDw8fv7+639/f1S9vb2Dvb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L9/f2t7u7u8cjIyP+Wlpb/eHh4/4WFhf+pqan/ysrK/9zc
|
||||||
|
3P/o6Oj/7+/v//Pz8//z8/P/7+/v/+jo6P/c3Nz/ysrK/6mpqf+FhYX/eHh4/5aWlv/IyMj/7u7u8f39
|
||||||
|
/a3///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L+/v6t7Ozs8cLCwv+IiIj/YmJi/2dn
|
||||||
|
Z/+FhYX/oqKi/7i4uP/Ly8v/2NjY/97e3v/e3t7/2NjY/8vLy/+4uLj/oqKi/4WFhf9nZ2f/YmJi/4iI
|
||||||
|
iP/CwsL/7Ozs8f7+/q3///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L+/v6t7Ozs8b+/
|
||||||
|
v/+Dg4P/VVVV/09PT/9dXV3/cnJy/4qKiv+kpKT/uLi4/8DAwP/AwMD/uLi4/6SkpP+Kior/cnJy/11d
|
||||||
|
Xf9PT0//VVVV/4ODg/+/v7//7Ozs8f7+/q3///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv//
|
||||||
|
/1L///+t7Ozs8b6+vv+AgID/Tk5O/z4+Pv9BQUH/Tk5O/2VlZf+CgoL/l5eX/6Ghof+hoaH/l5eX/4KC
|
||||||
|
gv9lZWX/Tk5O/0FBQf8+Pj7/Tk5O/4CAgP++vr7/7Ozs8f///63///9S9vb2Dvb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2Dv///1L///+t6+vr8b29vf9+fn7/S0tL/zg4OP84ODj/QUFB/1FRUf9oaGj/eHh4/39/
|
||||||
|
f/9/f3//eHh4/2hoaP9RUVH/QUFB/zg4OP84ODj/S0tL/35+fv+9vb3/6+vr8f///63///9S9vb2Dvb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9+fn7/S0tL/zo6Ov86Ojr/QUFB/0hI
|
||||||
|
SP9TU1P/W1tb/19fX/9fX1//W1tb/1NTU/9ISEj/QUFB/zo6Ov86Ojr/S0tL/35+fv++vr7/6+vr8f//
|
||||||
|
/63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8
|
||||||
|
PP8+Pj7/QkJC/0RERP9FRUX/R0dH/0dHR/9HR0f/R0dH/0VFRf9ERET/QkJC/z4+Pv88PDz/TExM/39/
|
||||||
|
f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+
|
||||||
|
vv9/f3//TExM/zw8PP8+Pj7/QkJC/0FBQf9AQED/Pz8//z8/P/8/Pz//Pz8//0BAQP9BQUH/QkJC/z4+
|
||||||
|
Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv//
|
||||||
|
/1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0FBQf9BQUH/QEBA/0BAQP9AQED/QEBA/0FB
|
||||||
|
Qf9BQUH/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f//
|
||||||
|
/63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8
|
||||||
|
PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/
|
||||||
|
f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+
|
||||||
|
vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+
|
||||||
|
Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv//
|
||||||
|
/1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f//
|
||||||
|
/63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8
|
||||||
|
PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/
|
||||||
|
f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+
|
||||||
|
vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+
|
||||||
|
Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv//
|
||||||
|
/1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f//
|
||||||
|
/63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8
|
||||||
|
PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/
|
||||||
|
f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+
|
||||||
|
vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+
|
||||||
|
Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv//
|
||||||
|
/1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/f/++vr7/6+vr8f//
|
||||||
|
/63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+vv9/f3//TExM/zw8
|
||||||
|
PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+Pv88PDz/TExM/39/
|
||||||
|
f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L///+t6+vr8b6+
|
||||||
|
vv9/f3//TExM/zw8PP8+Pj7/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC/z4+
|
||||||
|
Pv88PDz/TExM/39/f/++vr7/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv//
|
||||||
|
/1L///+t6+vr8by8vP98fHz/SEhI/zg4OP86Ojr/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+/z4+
|
||||||
|
Pv8+Pj7/Pj4+/zo6Ov84ODj/SEhI/3x8fP+8vLz/6+vr8f///63///9S9vb2Dvb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2Dv///1L///+t6+vr8by8vP97e3v/RkZG/zY2Nv84ODj/PDw8/zw8PP88PDz/PDw8/zw8
|
||||||
|
PP88PDz/PDw8/zw8PP88PDz/PDw8/zg4OP82Njb/RkZG/3t7e/+8vLz/6+vr8f///63///9S9vb2Dvb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA9vb2Dv///1L+/v6t7Ozs8cHBwf+FhYX/VVVV/0ZGRv9ISEj/TExM/0xM
|
||||||
|
TP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0hISP9GRkb/VVVV/4WFhf/BwcH/7Ozs8f7+
|
||||||
|
/q3///9S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dv7+/lL8/Pyt7+/v8dHR0f+np6f/hYWF/3t7
|
||||||
|
e/98fHz/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3x8fP97e3v/hYWF/6en
|
||||||
|
p//R0dH/7+/v8fz8/K3+/v5S9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dvr6+lL5+fmt8/Pz8eTk
|
||||||
|
5P/R0dH/wcHB/7y8vP+8vLz/vr6+/76+vv++vr7/vr6+/76+vv++vr7/vr6+/76+vv++vr7/vr6+/7y8
|
||||||
|
vP+8vLz/wcHB/9HR0f/k5OT/8/Pz8fn5+a36+vpS9vb2Dvb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Dff3
|
||||||
|
90739/ej9fX14/Pz8/nv7+/27Ozs8evr6/Hr6+vx6+vr8evr6/Hr6+vx6+vr8evr6/Hr6+vx6+vr8evr
|
||||||
|
6/Hr6+vx6+vr8evr6/Hr6+vx7Ozs8e/v7/bz8/P59fX14/f396P39/dO9vb2Dfb29gD29vYAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9gD29vYA9vb2CfX19Tf29vZy9/f3n/n5+a78/Pyt/v7+qf///6n///+p////qf///6n///+p////qf//
|
||||||
|
/6n///+p////qf///6n///+p////qf///6n///+p/v7+qfz8/K35+fmu9/f3n/b29nL19fU39vb2Cfb2
|
||||||
|
9gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29gD29vYA9vb2BPX19Rr29vY29/f3S/n5+VL8/PxS////UP///1D///9Q////UP//
|
||||||
|
/1D///9Q////UP///1D///9Q////UP///1D///9Q////UP///1D///9Q////UPz8/FL5+flS9/f3S/b2
|
||||||
|
9jb19fUa9vb2BPb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29gD29vYA9vb2Afb29gX29vYK9vb2Dvb29g/29vYP9vb2D/b2
|
||||||
|
9g/29vYP9vb2D/b29g/29vYP9vb2D/b29g/29vYP9vb2D/b29g/29vYP9vb2D/b29g/29vYP9vb2D/b2
|
||||||
|
9g/29vYP9vb2Dvb29gr29vYF9vb2Afb29gD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAD///////8AAP/AD/AD/wAA/8AP8AP/AAD/wA/wA/8AAP/AAAAD/wAA/8AAAAP/
|
||||||
|
AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/A
|
||||||
|
AAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/
|
||||||
|
AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/A
|
||||||
|
AAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/
|
||||||
|
AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/A
|
||||||
|
AAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA////////AAAoAAAAEAAAACAAAAABACAAAAAAAAAE
|
||||||
|
AADDDgAAww4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29vb/9vb2/wAAAAAAAAAAAAAAAAAA
|
||||||
|
AAD29vb/9vb2/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vb2//b29v/29vb/9vb2//b2
|
||||||
|
9v/29vb/9vb2//b29v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29v9kZGT/1NTU//b2
|
||||||
|
9v/29vb/1NTU/2RkZP/29vb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29vb/QkJC/0JC
|
||||||
|
Qv+cnJz/nJyc/0JCQv9CQkL/9vb2/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vb2/0JC
|
||||||
|
Qv9CQkL/QkJC/0JCQv9CQkL/QkJC//b29v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb2
|
||||||
|
9v9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv/29vb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAD29vb/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/9vb2/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAA9vb2/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC//b29v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAPb29v9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv/29vb/AAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAD29vb/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/9vb2/wAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAA9vb2/0JCQv9CQkL/QkJC/0JCQv9CQkL/QkJC//b29v8AAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPb29v9CQkL/QkJC/0JCQv9CQkL/QkJC/0JCQv/29vb/AAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29vb/QkJC/0JCQv9CQkL/QkJC/0JCQv9CQkL/9vb2/wAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2
|
||||||
|
9v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AADzzwAA8A8AAPAPAADwDwAA8A8AAPAPAADwDwAA8A8AAPAP
|
||||||
|
AADwDwAA8A8AAPAPAADwDwAA8A8AAP//AAA=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
157
SCrawler/DownloadSavedPostsForm.vb
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
' 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.ComponentModel
|
||||||
|
Imports System.Threading
|
||||||
|
Imports PersonalUtilities.Forms
|
||||||
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
|
Imports SCrawler.API
|
||||||
|
Imports Job = SCrawler.TDownloader.Job
|
||||||
|
Friend Class DownloadSavedPostsForm
|
||||||
|
Friend Event OnDownloadDone(ByVal Message As String)
|
||||||
|
Private MyView As FormsView
|
||||||
|
Private ReadOnly ProgressReddit As MyProgress
|
||||||
|
Private ReadOnly ProgressInstgram As MyProgress
|
||||||
|
Private JobReddit As Job
|
||||||
|
Private JobInstagram As Job
|
||||||
|
Friend ReadOnly Property Working As Boolean
|
||||||
|
Get
|
||||||
|
Return JobReddit Or JobInstagram
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
#Region "Start and Stop functions"
|
||||||
|
Friend Overloads Sub [Stop]()
|
||||||
|
[Stop](Sites.Reddit)
|
||||||
|
[Stop](Sites.Instagram)
|
||||||
|
End Sub
|
||||||
|
Private Overloads Sub [Stop](ByVal Site As Sites)
|
||||||
|
Select Case Site
|
||||||
|
Case Sites.Reddit : If JobReddit Then JobReddit.Stop()
|
||||||
|
Case Sites.Instagram : If JobInstagram Then JobInstagram.Stop()
|
||||||
|
End Select
|
||||||
|
End Sub
|
||||||
|
Private Overloads Sub [Start]()
|
||||||
|
Start(Sites.Reddit)
|
||||||
|
Start(Sites.Instagram)
|
||||||
|
End Sub
|
||||||
|
Private Overloads Sub [Start](ByVal Site As Sites)
|
||||||
|
Select Case Site
|
||||||
|
Case Sites.Reddit : If Not JobReddit Then JobReddit.Start(New ThreadStart(Sub() DownloadData(Sites.Reddit)))
|
||||||
|
Case Sites.Instagram
|
||||||
|
If Not JobInstagram Then
|
||||||
|
If Not Downloader.Working(Sites.Instagram) Then
|
||||||
|
Downloader.InstagramSavedPostsDownloading = True
|
||||||
|
JobInstagram.Start(New ThreadStart(Sub() DownloadData(Sites.Instagram)))
|
||||||
|
Else
|
||||||
|
MsgBoxE({$"Downloading Instagram profiles still works.{vbCr}Wait for this to be done before starting.{vbCr}Operation canceled",
|
||||||
|
"Instagram saved posts"}, MsgBoxStyle.Critical)
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End Select
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Form functions"
|
||||||
|
Friend Sub New()
|
||||||
|
InitializeComponent()
|
||||||
|
ProgressReddit = New MyProgress(PR_REDDIT, LBL_REDDIT)
|
||||||
|
ProgressInstgram = New MyProgress(PR_INST, LBL_INST)
|
||||||
|
JobReddit = New Job(ProgressReddit) With {.Site = Sites.Reddit}
|
||||||
|
JobInstagram = New Job(ProgressInstgram) With {.Site = Sites.Instagram}
|
||||||
|
End Sub
|
||||||
|
Private Sub DownloadSavedPostsForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||||
|
MyView = New FormsView(Me) With {.LocationOnly = True}
|
||||||
|
MyView.ImportFromXML(Settings.Design)
|
||||||
|
MyView.SetMeSize()
|
||||||
|
End Sub
|
||||||
|
Private Sub DownloadSavedPostsForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
|
||||||
|
e.Cancel = True
|
||||||
|
Hide()
|
||||||
|
End Sub
|
||||||
|
Private Sub DownloadSavedPostsForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
||||||
|
[Stop]()
|
||||||
|
MyView.Dispose(Settings.Design)
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Controls"
|
||||||
|
Private Sub BTT_DOWN_ALL_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_ALL.Click
|
||||||
|
Start()
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_STOP_ALL_Click(sender As Object, e As EventArgs) Handles BTT_STOP_ALL.Click
|
||||||
|
[Stop]()
|
||||||
|
End Sub
|
||||||
|
#Region "Reddit"
|
||||||
|
Private Sub BTT_REDDIT_START_Click(sender As Object, e As EventArgs) Handles BTT_REDDIT_START.Click
|
||||||
|
Start(Sites.Reddit)
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_REDDIT_STOP_Click(sender As Object, e As EventArgs) Handles BTT_REDDIT_STOP.Click
|
||||||
|
[Stop](Sites.Reddit)
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_REDDIT_OPEN_Click(sender As Object, e As EventArgs) Handles BTT_REDDIT_OPEN.Click
|
||||||
|
OpenPath(Reddit.ProfileSaved.DataPath)
|
||||||
|
End Sub
|
||||||
|
Private Sub LBL_REDDIT_DoubleClick(sender As Object, e As EventArgs) Handles LBL_REDDIT.DoubleClick
|
||||||
|
OpenPath(Reddit.ProfileSaved.DataPath)
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Instagram"
|
||||||
|
Private Sub BTT_INST_START_Click(sender As Object, e As EventArgs) Handles BTT_INST_START.Click
|
||||||
|
Start(Sites.Instagram)
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_INST_STOP_Click(sender As Object, e As EventArgs) Handles BTT_INST_STOP.Click
|
||||||
|
[Stop](Sites.Instagram)
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_INST_OPEN_Click(sender As Object, e As EventArgs) Handles BTT_INST_OPEN.Click
|
||||||
|
OpenPath(Instagram.ProfileSaved.DataPath)
|
||||||
|
End Sub
|
||||||
|
Private Sub LBL_INST_DoubleClick(sender As Object, e As EventArgs) Handles LBL_INST.DoubleClick
|
||||||
|
OpenPath(Instagram.ProfileSaved.DataPath)
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#End Region
|
||||||
|
Private Sub DownloadData(ByVal Site As Sites)
|
||||||
|
Dim btte As Action(Of Button, Boolean) = Sub(b, e) If b.InvokeRequired Then b.Invoke(Sub() b.Enabled = e) Else b.Enabled = e
|
||||||
|
Try
|
||||||
|
Select Case Site
|
||||||
|
Case Sites.Reddit
|
||||||
|
btte(BTT_REDDIT_START, False)
|
||||||
|
btte(BTT_REDDIT_STOP, True)
|
||||||
|
JobReddit.Progress.InformationTemporary = "Reddit downloading started"
|
||||||
|
JobReddit.Start()
|
||||||
|
Reddit.ProfileSaved.Download(JobReddit.Progress, JobReddit)
|
||||||
|
Case Sites.Instagram
|
||||||
|
btte(BTT_INST_START, False)
|
||||||
|
btte(BTT_INST_STOP, True)
|
||||||
|
JobInstagram.Progress.InformationTemporary = "Instagram downloading started"
|
||||||
|
JobInstagram.Start()
|
||||||
|
Instagram.ProfileSaved.Download(JobInstagram.Progress, JobInstagram)
|
||||||
|
End Select
|
||||||
|
RaiseEvent OnDownloadDone($"Downloading saved {Site} posts is completed")
|
||||||
|
Catch ex As Exception
|
||||||
|
Select Case Site
|
||||||
|
Case Sites.Reddit : JobReddit.Progress.InformationTemporary = "Reddit downloading error"
|
||||||
|
Case Sites.Instagram : JobInstagram.Progress.InformationTemporary = "Instagram downloading error"
|
||||||
|
End Select
|
||||||
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, {$"{Site} saved posts downloading error", "Saved posts"})
|
||||||
|
Finally
|
||||||
|
Select Case Site
|
||||||
|
Case Sites.Reddit
|
||||||
|
JobReddit.Stopped()
|
||||||
|
btte(BTT_REDDIT_START, True)
|
||||||
|
btte(BTT_REDDIT_STOP, False)
|
||||||
|
Case Sites.Instagram
|
||||||
|
JobInstagram.Stopped()
|
||||||
|
btte(BTT_INST_START, True)
|
||||||
|
btte(BTT_INST_STOP, False)
|
||||||
|
Downloader.InstagramSavedPostsDownloading = False
|
||||||
|
End Select
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub OpenPath(ByVal f As SFile)
|
||||||
|
If f.Exists(SFO.Path, False) Then f.Open(SFO.Path)
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
25
SCrawler/DownloadedInfoForm.Designer.vb
generated
@@ -14,6 +14,7 @@ Partial Friend Class DownloadedInfoForm : Inherits System.Windows.Forms.Form
|
|||||||
<System.Diagnostics.DebuggerStepThrough()>
|
<System.Diagnostics.DebuggerStepThrough()>
|
||||||
Private Sub InitializeComponent()
|
Private Sub InitializeComponent()
|
||||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(DownloadedInfoForm))
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(DownloadedInfoForm))
|
||||||
|
Dim SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||||
Me.ToolbarTOP = New System.Windows.Forms.ToolStrip()
|
Me.ToolbarTOP = New System.Windows.Forms.ToolStrip()
|
||||||
Me.MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton()
|
Me.MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton()
|
||||||
Me.MENU_VIEW_SESSION = New System.Windows.Forms.ToolStripMenuItem()
|
Me.MENU_VIEW_SESSION = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
@@ -21,13 +22,15 @@ Partial Friend Class DownloadedInfoForm : Inherits System.Windows.Forms.Form
|
|||||||
Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.ToolbarBOTTOM = New System.Windows.Forms.StatusStrip()
|
Me.ToolbarBOTTOM = New System.Windows.Forms.StatusStrip()
|
||||||
Me.LIST_DOWN = New System.Windows.Forms.ListBox()
|
Me.LIST_DOWN = New System.Windows.Forms.ListBox()
|
||||||
|
Me.BTT_CLEAR = New System.Windows.Forms.ToolStripButton()
|
||||||
|
SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.ToolbarTOP.SuspendLayout()
|
Me.ToolbarTOP.SuspendLayout()
|
||||||
Me.SuspendLayout()
|
Me.SuspendLayout()
|
||||||
'
|
'
|
||||||
'ToolbarTOP
|
'ToolbarTOP
|
||||||
'
|
'
|
||||||
Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
|
Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
|
||||||
Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_VIEW, Me.BTT_REFRESH})
|
Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_VIEW, Me.BTT_REFRESH, SEP_1, Me.BTT_CLEAR})
|
||||||
Me.ToolbarTOP.Location = New System.Drawing.Point(0, 0)
|
Me.ToolbarTOP.Location = New System.Drawing.Point(0, 0)
|
||||||
Me.ToolbarTOP.Name = "ToolbarTOP"
|
Me.ToolbarTOP.Name = "ToolbarTOP"
|
||||||
Me.ToolbarTOP.Size = New System.Drawing.Size(554, 25)
|
Me.ToolbarTOP.Size = New System.Drawing.Size(554, 25)
|
||||||
@@ -48,7 +51,7 @@ Partial Friend Class DownloadedInfoForm : Inherits System.Windows.Forms.Form
|
|||||||
'
|
'
|
||||||
Me.MENU_VIEW_SESSION.AutoToolTip = True
|
Me.MENU_VIEW_SESSION.AutoToolTip = True
|
||||||
Me.MENU_VIEW_SESSION.Name = "MENU_VIEW_SESSION"
|
Me.MENU_VIEW_SESSION.Name = "MENU_VIEW_SESSION"
|
||||||
Me.MENU_VIEW_SESSION.Size = New System.Drawing.Size(180, 22)
|
Me.MENU_VIEW_SESSION.Size = New System.Drawing.Size(113, 22)
|
||||||
Me.MENU_VIEW_SESSION.Text = "Session"
|
Me.MENU_VIEW_SESSION.Text = "Session"
|
||||||
Me.MENU_VIEW_SESSION.ToolTipText = "Show downloaded users by this session"
|
Me.MENU_VIEW_SESSION.ToolTipText = "Show downloaded users by this session"
|
||||||
'
|
'
|
||||||
@@ -56,7 +59,7 @@ Partial Friend Class DownloadedInfoForm : Inherits System.Windows.Forms.Form
|
|||||||
'
|
'
|
||||||
Me.MENU_VIEW_ALL.AutoToolTip = True
|
Me.MENU_VIEW_ALL.AutoToolTip = True
|
||||||
Me.MENU_VIEW_ALL.Name = "MENU_VIEW_ALL"
|
Me.MENU_VIEW_ALL.Name = "MENU_VIEW_ALL"
|
||||||
Me.MENU_VIEW_ALL.Size = New System.Drawing.Size(180, 22)
|
Me.MENU_VIEW_ALL.Size = New System.Drawing.Size(113, 22)
|
||||||
Me.MENU_VIEW_ALL.Text = "All"
|
Me.MENU_VIEW_ALL.Text = "All"
|
||||||
Me.MENU_VIEW_ALL.ToolTipText = "Show all users (sorted by latest download)"
|
Me.MENU_VIEW_ALL.ToolTipText = "Show all users (sorted by latest download)"
|
||||||
'
|
'
|
||||||
@@ -85,6 +88,21 @@ Partial Friend Class DownloadedInfoForm : Inherits System.Windows.Forms.Form
|
|||||||
Me.LIST_DOWN.Size = New System.Drawing.Size(554, 364)
|
Me.LIST_DOWN.Size = New System.Drawing.Size(554, 364)
|
||||||
Me.LIST_DOWN.TabIndex = 2
|
Me.LIST_DOWN.TabIndex = 2
|
||||||
'
|
'
|
||||||
|
'SEP_1
|
||||||
|
'
|
||||||
|
SEP_1.Name = "SEP_1"
|
||||||
|
SEP_1.Size = New System.Drawing.Size(6, 25)
|
||||||
|
'
|
||||||
|
'BTT_CLEAR
|
||||||
|
'
|
||||||
|
Me.BTT_CLEAR.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
|
||||||
|
Me.BTT_CLEAR.Image = CType(resources.GetObject("BTT_CLEAR.Image"), System.Drawing.Image)
|
||||||
|
Me.BTT_CLEAR.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
|
Me.BTT_CLEAR.Name = "BTT_CLEAR"
|
||||||
|
Me.BTT_CLEAR.Size = New System.Drawing.Size(38, 22)
|
||||||
|
Me.BTT_CLEAR.Text = "Clear"
|
||||||
|
Me.BTT_CLEAR.ToolTipText = "Clear info list"
|
||||||
|
'
|
||||||
'DownloadedInfoForm
|
'DownloadedInfoForm
|
||||||
'
|
'
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
@@ -112,4 +130,5 @@ Partial Friend Class DownloadedInfoForm : Inherits System.Windows.Forms.Form
|
|||||||
Private WithEvents BTT_REFRESH As ToolStripButton
|
Private WithEvents BTT_REFRESH As ToolStripButton
|
||||||
Private WithEvents ToolbarBOTTOM As StatusStrip
|
Private WithEvents ToolbarBOTTOM As StatusStrip
|
||||||
Private WithEvents LIST_DOWN As ListBox
|
Private WithEvents LIST_DOWN As ListBox
|
||||||
|
Private WithEvents BTT_CLEAR As ToolStripButton
|
||||||
End Class
|
End Class
|
||||||
@@ -134,6 +134,24 @@
|
|||||||
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
|
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
|
||||||
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
|
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
|
||||||
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
|
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="BTT_CLEAR.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||||
|
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
|
||||||
|
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
|
||||||
|
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
|
||||||
|
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
|
||||||
|
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
|
||||||
|
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
|
||||||
|
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
|
||||||
|
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
|
||||||
|
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
|
||||||
|
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<metadata name="ToolbarBOTTOM.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="ToolbarBOTTOM.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
Imports System.ComponentModel
|
' 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.ComponentModel
|
||||||
Imports PersonalUtilities.Forms
|
Imports PersonalUtilities.Forms
|
||||||
Imports SCrawler.API.Base
|
Imports SCrawler.API.Base
|
||||||
Friend Class DownloadedInfoForm
|
Friend Class DownloadedInfoForm
|
||||||
@@ -37,6 +45,7 @@ Friend Class DownloadedInfoForm
|
|||||||
MyView.ImportFromXML(Settings.Design)
|
MyView.ImportFromXML(Settings.Design)
|
||||||
MyView.SetMeSize()
|
MyView.SetMeSize()
|
||||||
End If
|
End If
|
||||||
|
BTT_CLEAR.Visible = ViewMode = ViewModes.Session
|
||||||
RefillList()
|
RefillList()
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
End Try
|
End Try
|
||||||
@@ -54,8 +63,8 @@ Friend Class DownloadedInfoForm
|
|||||||
End Sub
|
End Sub
|
||||||
Private Class UsersDateOrder : Implements IComparer(Of IUserData)
|
Private Class UsersDateOrder : Implements IComparer(Of IUserData)
|
||||||
Friend Function Compare(ByVal x As IUserData, ByVal y As IUserData) As Integer Implements IComparer(Of IUserData).Compare
|
Friend Function Compare(ByVal x As IUserData, ByVal y As IUserData) As Integer Implements IComparer(Of IUserData).Compare
|
||||||
Dim xv& = If(DirectCast(x, UserDataBase).LastUpdated.HasValue, DirectCast(x, UserDataBase).LastUpdated.Value.Ticks, 0)
|
Dim xv& = If(DirectCast(x.Self, UserDataBase).LastUpdated.HasValue, DirectCast(x.Self, UserDataBase).LastUpdated.Value.Ticks, 0)
|
||||||
Dim yv& = If(DirectCast(y, UserDataBase).LastUpdated.HasValue, DirectCast(y, UserDataBase).LastUpdated.Value.Ticks, 0)
|
Dim yv& = If(DirectCast(y.Self, UserDataBase).LastUpdated.HasValue, DirectCast(y.Self, UserDataBase).LastUpdated.Value.Ticks, 0)
|
||||||
Return xv.CompareTo(yv) * -1
|
Return xv.CompareTo(yv) * -1
|
||||||
End Function
|
End Function
|
||||||
End Class
|
End Class
|
||||||
@@ -96,17 +105,25 @@ Friend Class DownloadedInfoForm
|
|||||||
MENU_VIEW_SESSION.Checked = True
|
MENU_VIEW_SESSION.Checked = True
|
||||||
MENU_VIEW_ALL.Checked = False
|
MENU_VIEW_ALL.Checked = False
|
||||||
ViewMode = ViewModes.Session
|
ViewMode = ViewModes.Session
|
||||||
|
BTT_CLEAR.Visible = True
|
||||||
RefillList()
|
RefillList()
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub MENU_VIEW_ALL_Click(sender As Object, e As EventArgs) Handles MENU_VIEW_ALL.Click
|
Private Sub MENU_VIEW_ALL_Click(sender As Object, e As EventArgs) Handles MENU_VIEW_ALL.Click
|
||||||
MENU_VIEW_SESSION.Checked = False
|
MENU_VIEW_SESSION.Checked = False
|
||||||
MENU_VIEW_ALL.Checked = True
|
MENU_VIEW_ALL.Checked = True
|
||||||
ViewMode = ViewModes.All
|
ViewMode = ViewModes.All
|
||||||
|
BTT_CLEAR.Visible = False
|
||||||
RefillList()
|
RefillList()
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click
|
Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click
|
||||||
RefillList()
|
RefillList()
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub BTT_CLEAR_Click(sender As Object, e As EventArgs) Handles BTT_CLEAR.Click
|
||||||
|
If LIST_DOWN.Items.Count > 0 Then
|
||||||
|
Downloader.Downloaded.Clear()
|
||||||
|
RefillList()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
Private _LatestSelected As Integer = -1
|
Private _LatestSelected As Integer = -1
|
||||||
Private Sub LIST_DOWN_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_DOWN.SelectedIndexChanged
|
Private Sub LIST_DOWN_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_DOWN.SelectedIndexChanged
|
||||||
_LatestSelected = LIST_DOWN.SelectedIndex
|
_LatestSelected = LIST_DOWN.SelectedIndex
|
||||||
@@ -114,7 +131,7 @@ Friend Class DownloadedInfoForm
|
|||||||
Private Sub LIST_DOWN_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles LIST_DOWN.MouseDoubleClick
|
Private Sub LIST_DOWN_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles LIST_DOWN.MouseDoubleClick
|
||||||
Try
|
Try
|
||||||
If _LatestSelected >= 0 AndAlso _LatestSelected <= _TempUsersList.Count - 1 AndAlso
|
If _LatestSelected >= 0 AndAlso _LatestSelected <= _TempUsersList.Count - 1 AndAlso
|
||||||
Not DirectCast(_TempUsersList(_LatestSelected), UserDataBase).Disposed Then _TempUsersList(_LatestSelected).OpenFolder()
|
Not DirectCast(_TempUsersList(_LatestSelected).Self, UserDataBase).Disposed Then _TempUsersList(_LatestSelected).OpenFolder()
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
Imports System.ComponentModel
|
' 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
|
||||||
Imports PersonalUtilities.Forms.Controls.Base
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
Imports PersonalUtilities.Forms.Toolbars
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
@@ -20,50 +27,40 @@ Namespace Editors
|
|||||||
Try
|
Try
|
||||||
With MyDefs
|
With MyDefs
|
||||||
.MyViewInitialize(Me, Settings.Design)
|
.MyViewInitialize(Me, Settings.Design)
|
||||||
.MyOkCancel = New OkCancelToolbar(Me, Me, CONTAINER_MAIN.BottomToolStripPanel)
|
.AddOkCancelToolbar()
|
||||||
.MyOkCancel.AddThisToolbar()
|
.DelegateClosingChecker()
|
||||||
Collections.ListAddList((From c In Settings.Users Where c.IsCollection Select c.CollectionName), LAP.NotContainsOnly, EDP.ThrowException)
|
Collections.ListAddList((From c In Settings.Users Where c.IsCollection Select c.CollectionName), LAP.NotContainsOnly, EDP.ThrowException)
|
||||||
If Collections.ListExists Then CMB_COLLECTIONS.Items.AddRange(From c In Collections Select New Controls.Base.ListItem(c))
|
If Collections.ListExists Then Collections.Sort() : CMB_COLLECTIONS.Items.AddRange(From c In Collections Select New ListItem(c))
|
||||||
If Not Collection.IsEmptyString And Collections.Contains(Collection) Then CMB_COLLECTIONS.SelectedIndex = Collections.IndexOf(Collection)
|
If Not Collection.IsEmptyString And Collections.Contains(Collection) Then CMB_COLLECTIONS.SelectedIndex = Collections.IndexOf(Collection)
|
||||||
End With
|
End With
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
MyDefs.InvokeLoaderError(ex)
|
MyDefs.InvokeLoaderError(ex)
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub CollectionEditorForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
|
Private Sub CollectionEditorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
||||||
If Not BeforeCloseChecker(MyDefs.ChangesDetected) Then
|
Collections.Clear()
|
||||||
e.Cancel = True
|
|
||||||
Else
|
|
||||||
Collections.Clear()
|
|
||||||
MyDefs.Dispose()
|
|
||||||
End If
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub CollectionEditorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
Private Sub CollectionEditorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
||||||
If e.KeyCode = Keys.Insert Then
|
If e.KeyCode = Keys.Insert Then AddNewCollection() : e.Handled = True Else e.Handled = False
|
||||||
AddNewCollection()
|
|
||||||
e.Handled = True
|
|
||||||
Else
|
|
||||||
e.Handled = False
|
|
||||||
End If
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
||||||
If CMB_COLLECTIONS.SelectedIndex >= 0 Then
|
If CMB_COLLECTIONS.SelectedIndex >= 0 Then
|
||||||
Collection = CMB_COLLECTIONS.Value.ToString
|
Collection = CMB_COLLECTIONS.Value.ToString
|
||||||
MyDefs.ChangesDetected = False
|
MyDefs.CloseForm()
|
||||||
DialogResult = DialogResult.OK
|
|
||||||
Close()
|
|
||||||
Else
|
Else
|
||||||
MsgBoxE("Collection does not selected", MsgBoxStyle.Exclamation)
|
MsgBoxE("Collection not selected", MsgBoxStyle.Exclamation)
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
||||||
MyDefs.ChangesDetected = False
|
MyDefs.CloseForm(DialogResult.Cancel)
|
||||||
DialogResult = DialogResult.Cancel
|
|
||||||
Close()
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub CMB_COLLECTIONS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_COLLECTIONS.ActionOnButtonClick
|
Private Sub CMB_COLLECTIONS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_COLLECTIONS.ActionOnButtonClick
|
||||||
If Sender.DefaultButton = ActionButton.DefaultButtons.Add Then AddNewCollection()
|
If Sender.DefaultButton = ActionButton.DefaultButtons.Add Then AddNewCollection()
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub CMB_COLLECTIONS_ActionOnListDoubleClick(ByVal _Item As ListViewItem) Handles CMB_COLLECTIONS.ActionOnListDoubleClick
|
||||||
|
_Item.Selected = True
|
||||||
|
ToolbarBttOK()
|
||||||
|
End Sub
|
||||||
Private Sub AddNewCollection()
|
Private Sub AddNewCollection()
|
||||||
Dim c$ = InputBoxE("Enter new collection name:", "Collection name")
|
Dim c$ = InputBoxE("Enter new collection name:", "Collection name")
|
||||||
If Not c.IsEmptyString Then
|
If Not c.IsEmptyString Then
|
||||||
|
|||||||
1090
SCrawler/Editors/GlobalSettingsForm.Designer.vb
generated
@@ -1,9 +1,49 @@
|
|||||||
Imports PersonalUtilities.Forms
|
' 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.Controls.Base
|
||||||
Imports PersonalUtilities.Forms.Toolbars
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
Namespace Editors
|
Namespace Editors
|
||||||
Friend Class GlobalSettingsForm : Implements IOkCancelToolbar
|
Friend Class GlobalSettingsForm : Implements IOkCancelToolbar
|
||||||
Private ReadOnly MyDefs As DefaultFormProps(Of FieldsChecker)
|
Private ReadOnly MyDefs As DefaultFormProps(Of FieldsChecker)
|
||||||
|
#Region "Checkers declarations"
|
||||||
|
Private Class SavedPostsChecker : Implements ICustomProvider
|
||||||
|
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 Not ACheck(Value) OrElse CStr(Value).Contains("/") Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Value
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat
|
||||||
|
Throw New NotImplementedException()
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
Private Class InstaTimersChecker : Implements ICustomProvider
|
||||||
|
Private ReadOnly _LowestValue As Integer
|
||||||
|
Friend Sub New(ByVal LowestValue As Integer)
|
||||||
|
_LowestValue = LowestValue
|
||||||
|
End Sub
|
||||||
|
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 ACheck(Of Integer)(Value) AndAlso CInt(Value) >= _LowestValue 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
|
||||||
|
#End Region
|
||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
InitializeComponent()
|
InitializeComponent()
|
||||||
MyDefs = New DefaultFormProps(Of FieldsChecker)
|
MyDefs = New DefaultFormProps(Of FieldsChecker)
|
||||||
@@ -15,34 +55,110 @@ Namespace Editors
|
|||||||
.AddOkCancelToolbar()
|
.AddOkCancelToolbar()
|
||||||
.DelegateClosingChecker()
|
.DelegateClosingChecker()
|
||||||
With Settings
|
With Settings
|
||||||
|
'Basis
|
||||||
TXT_GLOBAL_PATH.Text = .GlobalPath.Value
|
TXT_GLOBAL_PATH.Text = .GlobalPath.Value
|
||||||
TXT_IMAGE_LARGE.Value = .MaxLargeImageHeigh.Value
|
TXT_IMAGE_LARGE.Value = .MaxLargeImageHeigh.Value
|
||||||
TXT_IMAGE_SMALL.Value = .MaxSmallImageHeigh.Value
|
TXT_IMAGE_SMALL.Value = .MaxSmallImageHeigh.Value
|
||||||
TXT_COLLECTIONS_PATH.Text = .CollectionsPath
|
TXT_COLLECTIONS_PATH.Text = .CollectionsPath
|
||||||
|
TXT_MAX_JOBS_USERS.Value = .MaxUsersJobsCount.Value
|
||||||
|
TXT_MAX_JOBS_CHANNELS.Value = .ChannelsMaxJobsCount.Value
|
||||||
|
CH_CHECK_VER_START.Checked = .CheckUpdatesAtStart
|
||||||
|
TXT_IMGUR_CLIENT_ID.Text = .ImgurClientID
|
||||||
|
'Defaults
|
||||||
CH_SEPARATE_VIDEO_FOLDER.Checked = .SeparateVideoFolder.Value
|
CH_SEPARATE_VIDEO_FOLDER.Checked = .SeparateVideoFolder.Value
|
||||||
CH_DEF_TEMP.Checked = .DefaultTemporary.Value
|
CH_DEF_TEMP.Checked = .DefaultTemporary
|
||||||
TXT_CHANNELS_COLUMNS.Value = .ChannelsImagesColumns.Value
|
CH_DOWN_IMAGES.Checked = .DefaultDownloadImages
|
||||||
|
CH_DOWN_VIDEOS.Checked = .DefaultDownloadVideos
|
||||||
|
'Channels
|
||||||
TXT_CHANNELS_ROWS.Value = .ChannelsImagesRows.Value
|
TXT_CHANNELS_ROWS.Value = .ChannelsImagesRows.Value
|
||||||
|
TXT_CHANNELS_COLUMNS.Value = .ChannelsImagesColumns.Value
|
||||||
TXT_CHANNEL_USER_POST_LIMIT.Value = .FromChannelDownloadTop.Value
|
TXT_CHANNEL_USER_POST_LIMIT.Value = .FromChannelDownloadTop.Value
|
||||||
TXT_CHANNEL_USER_POST_LIMIT.Checked = .FromChannelDownloadTopUse.Value
|
TXT_CHANNEL_USER_POST_LIMIT.Checked = .FromChannelDownloadTopUse.Value
|
||||||
CH_COPY_CHANNEL_USER_IMAGE.Checked = .FromChannelCopyImageToUser
|
CH_COPY_CHANNEL_USER_IMAGE.Checked = .FromChannelCopyImageToUser
|
||||||
CH_CHECK_VER_START.Checked = .CheckUpdatesAtStart
|
CH_CHANNELS_USERS_TEMP.Checked = .ChannelsDefaultTemporary
|
||||||
TXT_MAX_JOBS_USERS.Value = .MaxUsersJobsCount.Value
|
'Channels filenames
|
||||||
TXT_MAX_JOBS_CHANNELS.Value = .ChannelsMaxJobsCount.Value
|
CH_FILE_NAME_CHANGE.Checked = .FileReplaceNameByDate Or .FileAddDateToFileName Or .FileAddTimeToFileName
|
||||||
|
OPT_FILE_NAME_REPLACE.Checked = .FileReplaceNameByDate
|
||||||
|
OPT_FILE_NAME_ADD_DATE.Checked = Not .FileReplaceNameByDate
|
||||||
|
CH_FILE_DATE.Checked = .FileAddDateToFileName
|
||||||
|
CH_FILE_TIME.Checked = .FileAddTimeToFileName
|
||||||
|
OPT_FILE_DATE_START.Checked = Not .FileDateTimePositionEnd
|
||||||
|
OPT_FILE_DATE_END.Checked = .FileDateTimePositionEnd
|
||||||
|
'Other program settings
|
||||||
|
CH_EXIT_CONFIRM.Checked = .ExitConfirm
|
||||||
|
CH_CLOSE_TO_TRAY.Checked = .CloseToTray
|
||||||
|
CH_SHOW_NOTIFY.Checked = .ShowNotifications
|
||||||
|
'Reddit
|
||||||
|
With .Site(Sites.Reddit)
|
||||||
|
SetChecker(DEFS_REDDIT, Sites.Reddit)
|
||||||
|
CH_REDDIT_USER_MEDIA.Checked = .GetUserMediaOnly
|
||||||
|
TXT_REDDIT_SAVED_POSTS_USER.Text = .SavedPostsUserName
|
||||||
|
TXT_REDDIT_SAVED_POSTS_PATH.Text = .SavedPostsPath(False)
|
||||||
|
End With
|
||||||
|
'Twitter
|
||||||
|
With .Site(Sites.Twitter)
|
||||||
|
SetChecker(DEFS_TWITTER, Sites.Twitter)
|
||||||
|
CH_TWITTER_USER_MEDIA.Checked = .GetUserMediaOnly
|
||||||
|
End With
|
||||||
|
'Instagram
|
||||||
|
With .Site(Sites.Instagram)
|
||||||
|
SetChecker(DEFS_INST, Sites.Instagram)
|
||||||
|
TXT_REQ_WAIT_TIMER.Text = .RequestsWaitTimer
|
||||||
|
TXT_REQ_COUNT.Text = .RequestsWaitTimerTaskCount
|
||||||
|
TXT_LIMIT_TIMER.Text = .SleepTimerOnPostsLimit
|
||||||
|
TXT_INST_SAVED_POSTS_USER.Text = .SavedPostsUserName
|
||||||
|
TXT_INST_SAVED_POSTS_PATH.Text = .SavedPostsPath(False)
|
||||||
|
End With
|
||||||
|
'RedGifs
|
||||||
|
SetChecker(DEFS_REDGIFS, Sites.RedGifs)
|
||||||
End With
|
End With
|
||||||
.MyFieldsChecker = New FieldsChecker
|
.MyFieldsChecker = New FieldsChecker
|
||||||
With .MyFieldsChecker
|
With .MyFieldsChecker
|
||||||
.AddControl(Of String)(TXT_GLOBAL_PATH, TXT_GLOBAL_PATH.CaptionText)
|
.AddControl(Of String)(TXT_GLOBAL_PATH, TXT_GLOBAL_PATH.CaptionText)
|
||||||
.AddControl(Of String)(TXT_COLLECTIONS_PATH, TXT_COLLECTIONS_PATH.CaptionText)
|
.AddControl(Of String)(TXT_COLLECTIONS_PATH, TXT_COLLECTIONS_PATH.CaptionText)
|
||||||
|
.AddControl(Of String)(TXT_REDDIT_SAVED_POSTS_USER, TXT_REDDIT_SAVED_POSTS_USER.CaptionText, True, New SavedPostsChecker)
|
||||||
|
.AddControl(Of Integer)(TXT_REQ_WAIT_TIMER, TXT_REQ_WAIT_TIMER.CaptionText,, New InstaTimersChecker(100))
|
||||||
|
.AddControl(Of Integer)(TXT_REQ_COUNT, TXT_REQ_COUNT.CaptionText,, New InstaTimersChecker(1))
|
||||||
|
.AddControl(Of Integer)(TXT_LIMIT_TIMER, TXT_LIMIT_TIMER.CaptionText,, New InstaTimersChecker(10000))
|
||||||
.EndLoaderOperations()
|
.EndLoaderOperations()
|
||||||
End With
|
End With
|
||||||
.AppendDetectors()
|
.AppendDetectors()
|
||||||
.EndLoaderOperations()
|
.EndLoaderOperations()
|
||||||
|
ChangeFileNameChangersEnabling()
|
||||||
End With
|
End With
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
MyDefs.InvokeLoaderError(ex)
|
MyDefs.InvokeLoaderError(ex)
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Overloads Sub SetChecker(ByRef CH As SiteDefaults, ByVal s As Sites)
|
||||||
|
With Settings(s)
|
||||||
|
SetChecker(CH.MyTemporary, .Temporary)
|
||||||
|
SetChecker(CH.MyImagesDown, .DownloadImages)
|
||||||
|
SetChecker(CH.MyVideosDown, .DownloadVideos)
|
||||||
|
End With
|
||||||
|
End Sub
|
||||||
|
Private Overloads Sub SetChecker(ByRef State As CheckState, ByVal Prop As XML.Base.XMLValue(Of Boolean))
|
||||||
|
If Prop.ValueF.Exists Then
|
||||||
|
State = If(Prop.Value, CheckState.Checked, CheckState.Unchecked)
|
||||||
|
Else
|
||||||
|
State = CheckState.Indeterminate
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Overloads Sub SetPropByChecker(ByRef CH As SiteDefaults, ByVal s As Sites)
|
||||||
|
With Settings(s)
|
||||||
|
SetPropByChecker(CH.MyTemporary, .Temporary)
|
||||||
|
SetPropByChecker(CH.MyTemporary, .Temporary)
|
||||||
|
SetPropByChecker(CH.MyImagesDown, .DownloadImages)
|
||||||
|
SetPropByChecker(CH.MyVideosDown, .DownloadVideos)
|
||||||
|
End With
|
||||||
|
End Sub
|
||||||
|
Private Overloads Sub SetPropByChecker(ByVal State As CheckState, ByRef Prop As XML.Base.XMLValue(Of Boolean))
|
||||||
|
Select Case State
|
||||||
|
Case CheckState.Checked : Prop.Value = True
|
||||||
|
Case CheckState.Unchecked : Prop.Value = False
|
||||||
|
Case CheckState.Indeterminate : Prop.ValueF = Nothing
|
||||||
|
End Select
|
||||||
|
End Sub
|
||||||
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
||||||
If MyDefs.MyFieldsChecker.AllParamsOK Then
|
If MyDefs.MyFieldsChecker.AllParamsOK Then
|
||||||
With Settings
|
With Settings
|
||||||
@@ -66,20 +182,74 @@ Namespace Editors
|
|||||||
Case 2 : Exit Sub
|
Case 2 : Exit Sub
|
||||||
End Select
|
End Select
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
If CH_FILE_NAME_CHANGE.Checked And (Not CH_FILE_DATE.Checked And Not CH_FILE_TIME.Checked) Then
|
||||||
|
MsgBoxE({"You must select at least one option (Date and/or Time) if you want to change file names by date or disable file names changes",
|
||||||
|
"File name options"}, vbCritical)
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
.BeginUpdate()
|
.BeginUpdate()
|
||||||
|
'Basis
|
||||||
.GlobalPath.Value = TXT_GLOBAL_PATH.Text
|
.GlobalPath.Value = TXT_GLOBAL_PATH.Text
|
||||||
.MaxLargeImageHeigh.Value = CInt(TXT_IMAGE_LARGE.Value)
|
.MaxLargeImageHeigh.Value = CInt(TXT_IMAGE_LARGE.Value)
|
||||||
.MaxSmallImageHeigh.Value = CInt(TXT_IMAGE_SMALL.Value)
|
.MaxSmallImageHeigh.Value = CInt(TXT_IMAGE_SMALL.Value)
|
||||||
.SeparateVideoFolder.Value = CH_SEPARATE_VIDEO_FOLDER.Checked
|
|
||||||
.CollectionsPath.Value = TXT_COLLECTIONS_PATH.Text
|
.CollectionsPath.Value = TXT_COLLECTIONS_PATH.Text
|
||||||
|
.MaxUsersJobsCount.Value = CInt(TXT_MAX_JOBS_USERS.Value)
|
||||||
|
.ChannelsMaxJobsCount.Value = TXT_MAX_JOBS_CHANNELS.Value
|
||||||
|
.CheckUpdatesAtStart.Value = CH_CHECK_VER_START.Checked
|
||||||
|
.ImgurClientID.Value = TXT_IMGUR_CLIENT_ID.Text
|
||||||
|
'Defaults
|
||||||
|
.SeparateVideoFolder.Value = CH_SEPARATE_VIDEO_FOLDER.Checked
|
||||||
.DefaultTemporary.Value = CH_DEF_TEMP.Checked
|
.DefaultTemporary.Value = CH_DEF_TEMP.Checked
|
||||||
|
.DefaultDownloadImages.Value = CH_DOWN_IMAGES.Checked
|
||||||
|
.DefaultDownloadVideos.Value = CH_DOWN_VIDEOS.Checked
|
||||||
|
'Channels
|
||||||
.ChannelsImagesRows.Value = CInt(TXT_CHANNELS_ROWS.Value)
|
.ChannelsImagesRows.Value = CInt(TXT_CHANNELS_ROWS.Value)
|
||||||
.ChannelsImagesColumns.Value = CInt(TXT_CHANNELS_COLUMNS.Value)
|
.ChannelsImagesColumns.Value = CInt(TXT_CHANNELS_COLUMNS.Value)
|
||||||
.FromChannelDownloadTopUse.Value = TXT_CHANNEL_USER_POST_LIMIT.Checked
|
|
||||||
.FromChannelDownloadTop.Value = CInt(TXT_CHANNEL_USER_POST_LIMIT.Value)
|
.FromChannelDownloadTop.Value = CInt(TXT_CHANNEL_USER_POST_LIMIT.Value)
|
||||||
|
.FromChannelDownloadTopUse.Value = TXT_CHANNEL_USER_POST_LIMIT.Checked
|
||||||
.FromChannelCopyImageToUser.Value = CH_COPY_CHANNEL_USER_IMAGE.Checked
|
.FromChannelCopyImageToUser.Value = CH_COPY_CHANNEL_USER_IMAGE.Checked
|
||||||
.CheckUpdatesAtStart.Value = CH_CHECK_VER_START.Checked
|
.ChannelsDefaultTemporary.Value = CH_CHANNELS_USERS_TEMP.Checked
|
||||||
.MaxUsersJobsCount.Value = CInt(TXT_MAX_JOBS_USERS.Value)
|
'Other program settings
|
||||||
|
.ExitConfirm.Value = CH_EXIT_CONFIRM.Checked
|
||||||
|
.CloseToTray.Value = CH_CLOSE_TO_TRAY.Checked
|
||||||
|
.ShowNotifications.Value = CH_SHOW_NOTIFY.Checked
|
||||||
|
|
||||||
|
If CH_FILE_NAME_CHANGE.Checked Then
|
||||||
|
.FileReplaceNameByDate.Value = OPT_FILE_NAME_REPLACE.Checked
|
||||||
|
.FileAddDateToFileName.Value = CH_FILE_DATE.Checked
|
||||||
|
.FileAddTimeToFileName.Value = CH_FILE_TIME.Checked
|
||||||
|
.FileDateTimePositionEnd.Value = OPT_FILE_DATE_END.Checked
|
||||||
|
Else
|
||||||
|
.FileAddDateToFileName.Value = False
|
||||||
|
.FileAddTimeToFileName.Value = False
|
||||||
|
.FileReplaceNameByDate.Value = False
|
||||||
|
End If
|
||||||
|
'Reddit
|
||||||
|
With .Site(Sites.Reddit)
|
||||||
|
SetPropByChecker(DEFS_REDDIT, Sites.Reddit)
|
||||||
|
.GetUserMediaOnly.Value = CH_REDDIT_USER_MEDIA.Checked
|
||||||
|
.SavedPostsUserName.Value = TXT_REDDIT_SAVED_POSTS_USER.Text
|
||||||
|
.SavedPostsPath = TXT_REDDIT_SAVED_POSTS_PATH.Text
|
||||||
|
End With
|
||||||
|
'Twitter
|
||||||
|
With .Site(Sites.Twitter)
|
||||||
|
SetPropByChecker(DEFS_TWITTER, Sites.Twitter)
|
||||||
|
.GetUserMediaOnly.Value = CH_TWITTER_USER_MEDIA.Checked
|
||||||
|
End With
|
||||||
|
'Instagram
|
||||||
|
With .Site(Sites.Instagram)
|
||||||
|
SetPropByChecker(DEFS_INST, Sites.Instagram)
|
||||||
|
.RequestsWaitTimer.Value = AConvert(Of Integer)(TXT_REQ_WAIT_TIMER.Text)
|
||||||
|
.RequestsWaitTimerTaskCount.Value = AConvert(Of Integer)(TXT_REQ_COUNT.Text)
|
||||||
|
.SleepTimerOnPostsLimit.Value = AConvert(Of Integer)(TXT_LIMIT_TIMER.Text)
|
||||||
|
.SavedPostsUserName.Value = TXT_INST_SAVED_POSTS_USER.Text
|
||||||
|
.SavedPostsPath = TXT_INST_SAVED_POSTS_PATH.Text
|
||||||
|
End With
|
||||||
|
'RedGifs
|
||||||
|
SetPropByChecker(DEFS_REDGIFS, Sites.RedGifs)
|
||||||
|
|
||||||
.EndUpdate()
|
.EndUpdate()
|
||||||
End With
|
End With
|
||||||
MyDefs.CloseForm()
|
MyDefs.CloseForm()
|
||||||
@@ -100,5 +270,39 @@ Namespace Editors
|
|||||||
Private Sub TXT_MAX_JOBS_CHANNELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_MAX_JOBS_CHANNELS.ActionOnButtonClick
|
Private Sub TXT_MAX_JOBS_CHANNELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_MAX_JOBS_CHANNELS.ActionOnButtonClick
|
||||||
If Sender.DefaultButton = ActionButton.DefaultButtons.Refresh Then TXT_MAX_JOBS_CHANNELS.Value = SettingsCLS.DefaultMaxDownloadingTasks
|
If Sender.DefaultButton = ActionButton.DefaultButtons.Refresh Then TXT_MAX_JOBS_CHANNELS.Value = SettingsCLS.DefaultMaxDownloadingTasks
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub CH_FILE_NAME_CHANGE_CheckedChanged(sender As Object, e As EventArgs) Handles CH_FILE_NAME_CHANGE.CheckedChanged
|
||||||
|
ChangeFileNameChangersEnabling()
|
||||||
|
End Sub
|
||||||
|
Private Sub OPT_FILE_NAME_REPLACE_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_FILE_NAME_REPLACE.CheckedChanged
|
||||||
|
ChangePositionControlsEnabling()
|
||||||
|
End Sub
|
||||||
|
Private Sub OPT_FILE_NAME_ADD_DATE_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_FILE_NAME_ADD_DATE.CheckedChanged
|
||||||
|
ChangePositionControlsEnabling()
|
||||||
|
End Sub
|
||||||
|
Private Sub ChangePositionControlsEnabling()
|
||||||
|
Dim b As Boolean = OPT_FILE_NAME_ADD_DATE.Checked And OPT_FILE_NAME_ADD_DATE.Enabled
|
||||||
|
OPT_FILE_DATE_START.Enabled = b
|
||||||
|
OPT_FILE_DATE_END.Enabled = b
|
||||||
|
End Sub
|
||||||
|
Private Sub ChangeFileNameChangersEnabling()
|
||||||
|
Dim b As Boolean = CH_FILE_NAME_CHANGE.Checked
|
||||||
|
OPT_FILE_NAME_REPLACE.Enabled = b
|
||||||
|
OPT_FILE_NAME_ADD_DATE.Enabled = b
|
||||||
|
CH_FILE_DATE.Enabled = b
|
||||||
|
CH_FILE_TIME.Enabled = b
|
||||||
|
ChangePositionControlsEnabling()
|
||||||
|
End Sub
|
||||||
|
Private Sub TXT_REDDIT_SAVED_POSTS_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_REDDIT_SAVED_POSTS_PATH.ActionOnButtonClick
|
||||||
|
If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then
|
||||||
|
Dim f As SFile = SFile.SelectPath
|
||||||
|
If Not f.IsEmptyString Then TXT_REDDIT_SAVED_POSTS_PATH.Text = f
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub TXT_INST_SAVED_POSTS_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_INST_SAVED_POSTS_PATH.ActionOnButtonClick
|
||||||
|
If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then
|
||||||
|
Dim f As SFile = SFile.SelectPath
|
||||||
|
If Not f.IsEmptyString Then TXT_INST_SAVED_POSTS_PATH.Text = f
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
36
SCrawler/Editors/LabelsForm.Designer.vb
generated
@@ -13,10 +13,10 @@ Partial Friend Class LabelsForm : Inherits System.Windows.Forms.Form
|
|||||||
Private components As System.ComponentModel.IContainer
|
Private components As System.ComponentModel.IContainer
|
||||||
<System.Diagnostics.DebuggerStepThrough()>
|
<System.Diagnostics.DebuggerStepThrough()>
|
||||||
Private Sub InitializeComponent()
|
Private Sub InitializeComponent()
|
||||||
Dim ActionButton4 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(LabelsForm))
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(LabelsForm))
|
||||||
Dim ActionButton5 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 ActionButton6 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()
|
||||||
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
||||||
Me.CMB_LABELS = New PersonalUtilities.Forms.Controls.ComboBoxExtended()
|
Me.CMB_LABELS = New PersonalUtilities.Forms.Controls.ComboBoxExtended()
|
||||||
Me.CONTAINER_MAIN.ContentPanel.SuspendLayout()
|
Me.CONTAINER_MAIN.ContentPanel.SuspendLayout()
|
||||||
@@ -42,21 +42,21 @@ Partial Friend Class LabelsForm : Inherits System.Windows.Forms.Form
|
|||||||
'
|
'
|
||||||
'CMB_LABELS
|
'CMB_LABELS
|
||||||
'
|
'
|
||||||
ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image)
|
ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton4.Index = 0
|
ActionButton1.Index = 0
|
||||||
ActionButton4.Name = "BTT_COMBOBOX_ARROW"
|
ActionButton1.Name = "BTT_COMBOBOX_ARROW"
|
||||||
ActionButton4.Visible = False
|
ActionButton1.Visible = False
|
||||||
ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image)
|
ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton5.Index = 1
|
ActionButton2.Index = 1
|
||||||
ActionButton5.Name = "BTT_ADD"
|
ActionButton2.Name = "BTT_ADD"
|
||||||
ActionButton5.ToolTipText = "Add new label (Insert)"
|
ActionButton2.ToolTipText = "Add new label (Insert)"
|
||||||
ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image)
|
ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton6.Index = 2
|
ActionButton3.Index = 2
|
||||||
ActionButton6.Name = "BTT_CLEAR"
|
ActionButton3.Name = "BTT_CLEAR"
|
||||||
ActionButton6.ToolTipText = "Clear checked labels"
|
ActionButton3.ToolTipText = "Clear checked labels"
|
||||||
Me.CMB_LABELS.Buttons.Add(ActionButton4)
|
Me.CMB_LABELS.Buttons.Add(ActionButton1)
|
||||||
Me.CMB_LABELS.Buttons.Add(ActionButton5)
|
Me.CMB_LABELS.Buttons.Add(ActionButton2)
|
||||||
Me.CMB_LABELS.Buttons.Add(ActionButton6)
|
Me.CMB_LABELS.Buttons.Add(ActionButton3)
|
||||||
Me.CMB_LABELS.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.CMB_LABELS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.CMB_LABELS.ListCheckBoxes = True
|
Me.CMB_LABELS.ListCheckBoxes = True
|
||||||
Me.CMB_LABELS.ListDropDownStyle = PersonalUtilities.Forms.Controls.ComboBoxExtended.ListMode.Simple
|
Me.CMB_LABELS.ListDropDownStyle = PersonalUtilities.Forms.Controls.ComboBoxExtended.ListMode.Simple
|
||||||
|
|||||||
@@ -118,7 +118,7 @@
|
|||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
<data name="ActionButton4.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t
|
iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t
|
||||||
3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL
|
3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL
|
||||||
@@ -208,7 +208,7 @@
|
|||||||
AAAASUVORK5CYII=
|
AAAASUVORK5CYII=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton5.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton2.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
||||||
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE
|
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE
|
||||||
@@ -230,7 +230,7 @@
|
|||||||
0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC
|
0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton6.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton3.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
Imports PersonalUtilities.Forms
|
' 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.Toolbars
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
Imports PersonalUtilities.Forms.Controls
|
Imports PersonalUtilities.Forms.Controls
|
||||||
Imports PersonalUtilities.Forms.Controls.Base
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
@@ -19,21 +27,18 @@ Friend Class LabelsForm : Implements IOkCancelToolbar
|
|||||||
Try
|
Try
|
||||||
With MyDefs
|
With MyDefs
|
||||||
.MyViewInitialize(Me, Settings.Design)
|
.MyViewInitialize(Me, Settings.Design)
|
||||||
.MyOkCancel = New OkCancelToolbar(Me, Me, CONTAINER_MAIN.BottomToolStripPanel)
|
.AddOkCancelToolbar()
|
||||||
.MyOkCancel.AddThisToolbar()
|
|
||||||
.DelegateClosingChecker()
|
.DelegateClosingChecker()
|
||||||
|
|
||||||
If Settings.Labels.Count > 0 Then
|
If Settings.Labels.Count > 0 Then
|
||||||
Dim items As New List(Of Integer)
|
Dim items As New List(Of Integer)
|
||||||
CMB_LABELS.BeginUpdate()
|
CMB_LABELS.BeginUpdate()
|
||||||
For i% = 0 To Settings.Labels.Count - 1
|
For i% = 0 To Settings.Labels.Count - 1
|
||||||
If LabelsList.Contains(Settings.Labels(i)) Then items.Add(i)
|
If LabelsList.Contains(Settings.Labels(i)) Then items.Add(i)
|
||||||
CMB_LABELS.Items.Add(New ListItem(Settings.Labels(i)))
|
CMB_LABELS.Items.Add(Settings.Labels(i))
|
||||||
Next
|
Next
|
||||||
CMB_LABELS.EndUpdate()
|
CMB_LABELS.EndUpdate()
|
||||||
CMB_LABELS.ListCheckedIndexes = items
|
CMB_LABELS.ListCheckedIndexes = items
|
||||||
End If
|
End If
|
||||||
|
|
||||||
.AppendDetectors()
|
.AppendDetectors()
|
||||||
.EndLoaderOperations()
|
.EndLoaderOperations()
|
||||||
End With
|
End With
|
||||||
@@ -52,8 +57,8 @@ Friend Class LabelsForm : Implements IOkCancelToolbar
|
|||||||
If MultiUser Then
|
If MultiUser Then
|
||||||
Dim m As New MMessage("You are changing labels for more one user" & vbNewLine & "What do you want to do?",
|
Dim m As New MMessage("You are changing labels for more one user" & vbNewLine & "What do you want to do?",
|
||||||
"MultiUser labels changing",
|
"MultiUser labels changing",
|
||||||
{New MsgBoxButton("Replace exists") With {.ToolTip = "For each user: all exists labels will be deleted and replaced to these labels"},
|
{New MsgBoxButton("Replace exists") With {.ToolTip = "Per user: all existing labels will be removed and replaced with these labels"},
|
||||||
New MsgBoxButton("Add to exists") With {.ToolTip = "For each user: these labels will be appended to exists labels"},
|
New MsgBoxButton("Add to exists") With {.ToolTip = "Per user: these labels will be add to existing labels"},
|
||||||
New MsgBoxButton("Cancel")},
|
New MsgBoxButton("Cancel")},
|
||||||
MsgBoxStyle.Exclamation)
|
MsgBoxStyle.Exclamation)
|
||||||
Select Case MsgBoxE(m).Index
|
Select Case MsgBoxE(m).Index
|
||||||
@@ -62,11 +67,7 @@ Friend Class LabelsForm : Implements IOkCancelToolbar
|
|||||||
Case 2 : Exit Sub
|
Case 2 : Exit Sub
|
||||||
End Select
|
End Select
|
||||||
End If
|
End If
|
||||||
LabelsList.Clear()
|
LabelsList.ListAddList(CMB_LABELS.Items.CheckedItems.Select(Function(l) CStr(l.Value(0))), LAP.ClearBeforeAdd, LAP.NotContainsOnly)
|
||||||
Dim s As List(Of Integer) = CMB_LABELS.ListCheckedIndexes.ListIfNothing
|
|
||||||
If s.Count > 0 Then
|
|
||||||
For Each i% In s : LabelsList.Add(Settings.Labels(i)) : Next
|
|
||||||
End If
|
|
||||||
If _AnyLabelAdd Then Settings.Labels.Update()
|
If _AnyLabelAdd Then Settings.Labels.Update()
|
||||||
MyDefs.CloseForm()
|
MyDefs.CloseForm()
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
@@ -90,7 +91,7 @@ Friend Class LabelsForm : Implements IOkCancelToolbar
|
|||||||
Else
|
Else
|
||||||
Settings.Labels.Add(nl)
|
Settings.Labels.Add(nl)
|
||||||
_AnyLabelAdd = True
|
_AnyLabelAdd = True
|
||||||
CMB_LABELS.Items.Add(New ListItem(nl))
|
CMB_LABELS.Items.Add(nl)
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||
134
SCrawler/Editors/RedditEditorForm.Designer.vb
generated
@@ -1,134 +0,0 @@
|
|||||||
Namespace Editors
|
|
||||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
|
||||||
Partial Friend Class RedditEditorForm : Inherits System.Windows.Forms.Form
|
|
||||||
<System.Diagnostics.DebuggerNonUserCode()>
|
|
||||||
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
|
|
||||||
<System.Diagnostics.DebuggerStepThrough()>
|
|
||||||
Private Sub InitializeComponent()
|
|
||||||
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
|
||||||
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(RedditEditorForm))
|
|
||||||
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()
|
|
||||||
Me.TXT_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
|
||||||
Me.TXT_COOKIES = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
|
||||||
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
|
||||||
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
|
||||||
TP_MAIN.SuspendLayout()
|
|
||||||
CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).BeginInit()
|
|
||||||
CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).BeginInit()
|
|
||||||
Me.CONTAINER_MAIN.ContentPanel.SuspendLayout()
|
|
||||||
Me.CONTAINER_MAIN.SuspendLayout()
|
|
||||||
Me.SuspendLayout()
|
|
||||||
'
|
|
||||||
'TP_MAIN
|
|
||||||
'
|
|
||||||
TP_MAIN.ColumnCount = 1
|
|
||||||
TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
|
||||||
TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
|
|
||||||
TP_MAIN.Controls.Add(Me.TXT_PATH, 0, 0)
|
|
||||||
TP_MAIN.Controls.Add(Me.TXT_COOKIES, 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 = 2
|
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
|
||||||
TP_MAIN.Size = New System.Drawing.Size(524, 80)
|
|
||||||
TP_MAIN.TabIndex = 0
|
|
||||||
'
|
|
||||||
'TXT_PATH
|
|
||||||
'
|
|
||||||
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 Reddit files"
|
|
||||||
Me.TXT_PATH.Dock = System.Windows.Forms.DockStyle.Fill
|
|
||||||
Me.TXT_PATH.Location = New System.Drawing.Point(3, 3)
|
|
||||||
Me.TXT_PATH.Name = "TXT_PATH"
|
|
||||||
Me.TXT_PATH.Size = New System.Drawing.Size(518, 22)
|
|
||||||
Me.TXT_PATH.TabIndex = 0
|
|
||||||
'
|
|
||||||
'TXT_COOKIES
|
|
||||||
'
|
|
||||||
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
|
|
||||||
Me.TXT_COOKIES.Location = New System.Drawing.Point(3, 43)
|
|
||||||
Me.TXT_COOKIES.Name = "TXT_COOKIES"
|
|
||||||
Me.TXT_COOKIES.Size = New System.Drawing.Size(518, 22)
|
|
||||||
Me.TXT_COOKIES.TabIndex = 1
|
|
||||||
Me.TXT_COOKIES.TextBoxReadOnly = True
|
|
||||||
'
|
|
||||||
'CONTAINER_MAIN
|
|
||||||
'
|
|
||||||
'
|
|
||||||
'CONTAINER_MAIN.ContentPanel
|
|
||||||
'
|
|
||||||
Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN)
|
|
||||||
Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(524, 80)
|
|
||||||
Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
|
||||||
Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False
|
|
||||||
Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0)
|
|
||||||
Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN"
|
|
||||||
Me.CONTAINER_MAIN.RightToolStripPanelVisible = False
|
|
||||||
Me.CONTAINER_MAIN.Size = New System.Drawing.Size(524, 80)
|
|
||||||
Me.CONTAINER_MAIN.TabIndex = 0
|
|
||||||
Me.CONTAINER_MAIN.TopToolStripPanelVisible = False
|
|
||||||
'
|
|
||||||
'RedditEditorForm
|
|
||||||
'
|
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
|
||||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
|
||||||
Me.ClientSize = New System.Drawing.Size(524, 80)
|
|
||||||
Me.Controls.Add(Me.CONTAINER_MAIN)
|
|
||||||
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
|
||||||
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
|
|
||||||
Me.KeyPreview = True
|
|
||||||
Me.MaximizeBox = False
|
|
||||||
Me.MaximumSize = New System.Drawing.Size(540, 119)
|
|
||||||
Me.MinimizeBox = False
|
|
||||||
Me.MinimumSize = New System.Drawing.Size(540, 119)
|
|
||||||
Me.Name = "RedditEditorForm"
|
|
||||||
Me.ShowInTaskbar = False
|
|
||||||
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
|
||||||
Me.Text = "Reddit"
|
|
||||||
TP_MAIN.ResumeLayout(False)
|
|
||||||
CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).EndInit()
|
|
||||||
CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).EndInit()
|
|
||||||
Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False)
|
|
||||||
Me.CONTAINER_MAIN.ResumeLayout(False)
|
|
||||||
Me.CONTAINER_MAIN.PerformLayout()
|
|
||||||
Me.ResumeLayout(False)
|
|
||||||
|
|
||||||
End Sub
|
|
||||||
Private WithEvents CONTAINER_MAIN As ToolStripContainer
|
|
||||||
Private WithEvents TXT_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended
|
|
||||||
Private WithEvents TXT_COOKIES As PersonalUtilities.Forms.Controls.TextBoxExtended
|
|
||||||
End Class
|
|
||||||
End Namespace
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
Imports PersonalUtilities.Forms
|
|
||||||
Imports PersonalUtilities.Forms.Controls
|
|
||||||
Imports PersonalUtilities.Forms.Controls.Base
|
|
||||||
Imports PersonalUtilities.Forms.Toolbars
|
|
||||||
Imports PersonalUtilities.Tools.WEB
|
|
||||||
Namespace Editors
|
|
||||||
Friend Class RedditEditorForm : Implements IOkCancelToolbar
|
|
||||||
Private ReadOnly MyDefs As DefaultFormProps
|
|
||||||
Friend Sub New()
|
|
||||||
InitializeComponent()
|
|
||||||
MyDefs = New DefaultFormProps
|
|
||||||
End Sub
|
|
||||||
Private Sub RedditEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
|
||||||
Try
|
|
||||||
With MyDefs
|
|
||||||
.MyViewInitialize(Me, Settings.Design, True)
|
|
||||||
.AddOkCancelToolbar()
|
|
||||||
.DelegateClosingChecker()
|
|
||||||
With Settings.Site(Sites.Reddit)
|
|
||||||
TXT_PATH.Text = .Path
|
|
||||||
If .Responser.Cookies Is Nothing Then .Responser.Cookies = New CookieKeeper(.Responser.CookiesDomain)
|
|
||||||
End With
|
|
||||||
SetCookieText()
|
|
||||||
TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector)
|
|
||||||
.EndLoaderOperations()
|
|
||||||
End With
|
|
||||||
Catch ex As Exception
|
|
||||||
MyDefs.InvokeLoaderError(ex)
|
|
||||||
End Try
|
|
||||||
End Sub
|
|
||||||
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
|
||||||
With Settings.Site(Sites.Reddit)
|
|
||||||
If TXT_PATH.IsEmptyString Then .Path = Nothing Else .Path = TXT_PATH.Text
|
|
||||||
.Update()
|
|
||||||
End With
|
|
||||||
MyDefs.CloseForm()
|
|
||||||
End Sub
|
|
||||||
Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
|
||||||
MyDefs.CloseForm(DialogResult.Cancel)
|
|
||||||
End Sub
|
|
||||||
Private Sub TXT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_PATH.ActionOnButtonClick
|
|
||||||
If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then
|
|
||||||
Dim f As SFile = SFile.SelectPath(Settings.Site(Sites.Reddit).Path)
|
|
||||||
If Not f.IsEmptyString Then TXT_PATH.Text = f
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
Private Sub TXT_COOKIES_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_COOKIES.ActionOnButtonClick
|
|
||||||
If Sender.DefaultButton = ActionButton.DefaultButtons.Edit Then
|
|
||||||
Using f As New CookieListForm(Settings.Site(Sites.Reddit).Responser.Cookies) : f.ShowDialog() : End Using
|
|
||||||
SetCookieText()
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
Private Sub TXT_COOKIES_ActionOnButtonClearClick() Handles TXT_COOKIES.ActionOnButtonClearClick
|
|
||||||
With Settings.Site(Sites.Reddit).Responser
|
|
||||||
If Not .Cookies Is Nothing Then .Cookies.Dispose()
|
|
||||||
.Cookies = New CookieKeeper(.CookiesDomain)
|
|
||||||
End With
|
|
||||||
SetCookieText()
|
|
||||||
End Sub
|
|
||||||
Private Sub SetCookieText()
|
|
||||||
Dim c% = 0
|
|
||||||
With Settings.Site(Sites.Reddit).Responser
|
|
||||||
If Not .Cookies Is Nothing Then c = .Cookies.Count
|
|
||||||
End With
|
|
||||||
TXT_COOKIES.Text = $"{c} cookies"
|
|
||||||
End Sub
|
|
||||||
End Class
|
|
||||||
End Namespace
|
|
||||||
102
SCrawler/Editors/SiteDefaults.vb
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
' 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.ComponentModel
|
||||||
|
Namespace Editors
|
||||||
|
Public Class SiteDefaults : Inherits TableLayoutPanel
|
||||||
|
Private ReadOnly CH_TEMP As CheckBox
|
||||||
|
Private ReadOnly CH_IMG As CheckBox
|
||||||
|
Private ReadOnly CH_VID As CheckBox
|
||||||
|
Public Sub New()
|
||||||
|
InitCheckBox(CH_TEMP, "Temporary")
|
||||||
|
InitCheckBox(CH_IMG, "Download images")
|
||||||
|
InitCheckBox(CH_VID, "Download videos")
|
||||||
|
End Sub
|
||||||
|
Private Sub InitCheckBox(ByRef CH As CheckBox, ByVal Caption As String)
|
||||||
|
CH = New CheckBox With {.Text = Caption, .Dock = DockStyle.Fill, .UseVisualStyleBackColor = True,
|
||||||
|
.ThreeState = True, .CheckState = CheckState.Indeterminate}
|
||||||
|
AddHandler CH.CheckedChanged, AddressOf Checker_CheckedChanged
|
||||||
|
AddHandler CH.CheckStateChanged, AddressOf Checker_CheckedChanged
|
||||||
|
End Sub
|
||||||
|
Private Sub SiteDefaults_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
||||||
|
CH_TEMP.Dispose()
|
||||||
|
CH_IMG.Dispose()
|
||||||
|
CH_VID.Dispose()
|
||||||
|
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 = 4
|
||||||
|
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.Percent, 100))
|
||||||
|
End If
|
||||||
|
Controls.Add(CH_TEMP, 0, 0)
|
||||||
|
Controls.Add(CH_IMG, 0, 1)
|
||||||
|
Controls.Add(CH_VID, 0, 2)
|
||||||
|
End Sub
|
||||||
|
Private _BaseControlsPadding As New Padding(0)
|
||||||
|
<Browsable(True), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
|
||||||
|
Category("Values"), DisplayName("Controls padding"), Description("Base controls padding")>
|
||||||
|
Public Property BaseControlsPadding As Padding
|
||||||
|
Get
|
||||||
|
Return _BaseControlsPadding
|
||||||
|
End Get
|
||||||
|
Set(ByVal p As Padding)
|
||||||
|
_BaseControlsPadding = p
|
||||||
|
CH_TEMP.Padding = p
|
||||||
|
CH_IMG.Padding = p
|
||||||
|
CH_VID.Padding = p
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Function ShouldSerializeBaseControlsPadding() As Boolean
|
||||||
|
Return Not _BaseControlsPadding.Equals(New Padding(0))
|
||||||
|
End Function
|
||||||
|
<Browsable(False), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
|
||||||
|
Public Property ChangesDetected As Boolean = False
|
||||||
|
Private Sub Checker_CheckedChanged(sender As Object, e As EventArgs)
|
||||||
|
ChangesDetected = True
|
||||||
|
End Sub
|
||||||
|
<Browsable(True), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
|
||||||
|
Category("Values"), DefaultValue(CheckState.Indeterminate), DisplayName("Temporary"), Description("Temporary profile")>
|
||||||
|
Public Property MyTemporary As CheckState
|
||||||
|
Get
|
||||||
|
Return CH_TEMP.CheckState
|
||||||
|
End Get
|
||||||
|
Set(ByVal s As CheckState)
|
||||||
|
CH_TEMP.CheckState = s
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
<Browsable(True), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
|
||||||
|
Category("Values"), DefaultValue(CheckState.Indeterminate), DisplayName("Images"), Description("Download images")>
|
||||||
|
Public Property MyImagesDown As CheckState
|
||||||
|
Get
|
||||||
|
Return CH_IMG.CheckState
|
||||||
|
End Get
|
||||||
|
Set(ByVal s As CheckState)
|
||||||
|
CH_IMG.CheckState = s
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
<Browsable(True), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
|
||||||
|
Category("Values"), DefaultValue(CheckState.Indeterminate), DisplayName("Videos"), Description("Download videos")>
|
||||||
|
Public Property MyVideosDown As CheckState
|
||||||
|
Get
|
||||||
|
Return CH_VID.CheckState
|
||||||
|
End Get
|
||||||
|
Set(ByVal s As CheckState)
|
||||||
|
CH_VID.CheckState = s
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
Namespace Editors
|
Namespace Editors
|
||||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||||
Partial Friend Class TwitterEditorForm : Inherits System.Windows.Forms.Form
|
Partial Friend Class SiteEditorForm : Inherits System.Windows.Forms.Form
|
||||||
<System.Diagnostics.DebuggerNonUserCode()>
|
<System.Diagnostics.DebuggerNonUserCode()>
|
||||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||||
Try
|
Try
|
||||||
@@ -14,21 +14,20 @@
|
|||||||
Private components As System.ComponentModel.IContainer
|
Private components As System.ComponentModel.IContainer
|
||||||
<System.Diagnostics.DebuggerStepThrough()>
|
<System.Diagnostics.DebuggerStepThrough()>
|
||||||
Private Sub InitializeComponent()
|
Private Sub InitializeComponent()
|
||||||
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
|
||||||
Dim ActionButton1 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(TwitterEditorForm))
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(SiteEditorForm))
|
||||||
Dim ActionButton2 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 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 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 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()
|
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_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.TXT_COOKIES = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_COOKIES = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.TXT_TOKEN = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_TOKEN = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.TXT_AUTH = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_AUTH = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
||||||
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
Me.TP_MAIN.SuspendLayout()
|
||||||
TP_MAIN.SuspendLayout()
|
|
||||||
CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
CType(Me.TXT_TOKEN, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.TXT_TOKEN, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
@@ -39,23 +38,23 @@
|
|||||||
'
|
'
|
||||||
'TP_MAIN
|
'TP_MAIN
|
||||||
'
|
'
|
||||||
TP_MAIN.ColumnCount = 1
|
Me.TP_MAIN.ColumnCount = 1
|
||||||
TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
Me.TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
|
Me.TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
|
||||||
TP_MAIN.Controls.Add(Me.TXT_PATH, 0, 0)
|
Me.TP_MAIN.Controls.Add(Me.TXT_PATH, 0, 0)
|
||||||
TP_MAIN.Controls.Add(Me.TXT_COOKIES, 0, 1)
|
Me.TP_MAIN.Controls.Add(Me.TXT_COOKIES, 0, 1)
|
||||||
TP_MAIN.Controls.Add(Me.TXT_TOKEN, 0, 2)
|
Me.TP_MAIN.Controls.Add(Me.TXT_TOKEN, 0, 2)
|
||||||
TP_MAIN.Controls.Add(Me.TXT_AUTH, 0, 3)
|
Me.TP_MAIN.Controls.Add(Me.TXT_AUTH, 0, 3)
|
||||||
TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
TP_MAIN.Location = New System.Drawing.Point(0, 0)
|
Me.TP_MAIN.Location = New System.Drawing.Point(0, 0)
|
||||||
TP_MAIN.Name = "TP_MAIN"
|
Me.TP_MAIN.Name = "TP_MAIN"
|
||||||
TP_MAIN.RowCount = 4
|
Me.TP_MAIN.RowCount = 4
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||||
TP_MAIN.Size = New System.Drawing.Size(544, 107)
|
Me.TP_MAIN.Size = New System.Drawing.Size(544, 132)
|
||||||
TP_MAIN.TabIndex = 0
|
Me.TP_MAIN.TabIndex = 0
|
||||||
'
|
'
|
||||||
'TXT_PATH
|
'TXT_PATH
|
||||||
'
|
'
|
||||||
@@ -89,7 +88,7 @@
|
|||||||
Me.TXT_COOKIES.CaptionText = "Cookies"
|
Me.TXT_COOKIES.CaptionText = "Cookies"
|
||||||
Me.TXT_COOKIES.ClearTextByButtonClear = False
|
Me.TXT_COOKIES.ClearTextByButtonClear = False
|
||||||
Me.TXT_COOKIES.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TXT_COOKIES.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TXT_COOKIES.Location = New System.Drawing.Point(3, 29)
|
Me.TXT_COOKIES.Location = New System.Drawing.Point(3, 36)
|
||||||
Me.TXT_COOKIES.Name = "TXT_COOKIES"
|
Me.TXT_COOKIES.Name = "TXT_COOKIES"
|
||||||
Me.TXT_COOKIES.Size = New System.Drawing.Size(538, 22)
|
Me.TXT_COOKIES.Size = New System.Drawing.Size(538, 22)
|
||||||
Me.TXT_COOKIES.TabIndex = 1
|
Me.TXT_COOKIES.TabIndex = 1
|
||||||
@@ -105,7 +104,7 @@
|
|||||||
Me.TXT_TOKEN.CaptionToolTipEnabled = True
|
Me.TXT_TOKEN.CaptionToolTipEnabled = True
|
||||||
Me.TXT_TOKEN.CaptionToolTipText = "Set token from [x-csrf-token] response header"
|
Me.TXT_TOKEN.CaptionToolTipText = "Set token from [x-csrf-token] response header"
|
||||||
Me.TXT_TOKEN.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TXT_TOKEN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TXT_TOKEN.Location = New System.Drawing.Point(3, 55)
|
Me.TXT_TOKEN.Location = New System.Drawing.Point(3, 69)
|
||||||
Me.TXT_TOKEN.Name = "TXT_TOKEN"
|
Me.TXT_TOKEN.Name = "TXT_TOKEN"
|
||||||
Me.TXT_TOKEN.Size = New System.Drawing.Size(538, 22)
|
Me.TXT_TOKEN.Size = New System.Drawing.Size(538, 22)
|
||||||
Me.TXT_TOKEN.TabIndex = 2
|
Me.TXT_TOKEN.TabIndex = 2
|
||||||
@@ -121,7 +120,7 @@
|
|||||||
Me.TXT_AUTH.CaptionToolTipText = "Set authorization from [authorization] response header. This field must start fro" &
|
Me.TXT_AUTH.CaptionToolTipText = "Set authorization from [authorization] response header. This field must start fro" &
|
||||||
"m [Bearer] key word"
|
"m [Bearer] key word"
|
||||||
Me.TXT_AUTH.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TXT_AUTH.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TXT_AUTH.Location = New System.Drawing.Point(3, 81)
|
Me.TXT_AUTH.Location = New System.Drawing.Point(3, 102)
|
||||||
Me.TXT_AUTH.Name = "TXT_AUTH"
|
Me.TXT_AUTH.Name = "TXT_AUTH"
|
||||||
Me.TXT_AUTH.Size = New System.Drawing.Size(538, 22)
|
Me.TXT_AUTH.Size = New System.Drawing.Size(538, 22)
|
||||||
Me.TXT_AUTH.TabIndex = 3
|
Me.TXT_AUTH.TabIndex = 3
|
||||||
@@ -131,8 +130,8 @@
|
|||||||
'
|
'
|
||||||
'CONTAINER_MAIN.ContentPanel
|
'CONTAINER_MAIN.ContentPanel
|
||||||
'
|
'
|
||||||
Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN)
|
Me.CONTAINER_MAIN.ContentPanel.Controls.Add(Me.TP_MAIN)
|
||||||
Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(544, 107)
|
Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(544, 132)
|
||||||
Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False
|
Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False
|
||||||
Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0)
|
Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0)
|
||||||
@@ -142,24 +141,23 @@
|
|||||||
Me.CONTAINER_MAIN.TabIndex = 0
|
Me.CONTAINER_MAIN.TabIndex = 0
|
||||||
Me.CONTAINER_MAIN.TopToolStripPanelVisible = False
|
Me.CONTAINER_MAIN.TopToolStripPanelVisible = False
|
||||||
'
|
'
|
||||||
'TwitterEditorForm
|
'SiteEditorForm
|
||||||
'
|
'
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
Me.ClientSize = New System.Drawing.Size(544, 132)
|
Me.ClientSize = New System.Drawing.Size(544, 132)
|
||||||
Me.Controls.Add(Me.CONTAINER_MAIN)
|
Me.Controls.Add(Me.CONTAINER_MAIN)
|
||||||
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
||||||
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
|
|
||||||
Me.KeyPreview = True
|
Me.KeyPreview = True
|
||||||
Me.MaximizeBox = False
|
Me.MaximizeBox = False
|
||||||
Me.MaximumSize = New System.Drawing.Size(560, 171)
|
Me.MaximumSize = New System.Drawing.Size(560, 171)
|
||||||
Me.MinimizeBox = False
|
Me.MinimizeBox = False
|
||||||
Me.MinimumSize = New System.Drawing.Size(560, 171)
|
Me.MinimumSize = New System.Drawing.Size(560, 171)
|
||||||
Me.Name = "TwitterEditorForm"
|
Me.Name = "SiteEditorForm"
|
||||||
Me.ShowInTaskbar = False
|
Me.ShowInTaskbar = False
|
||||||
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
||||||
Me.Text = "Twitter"
|
Me.Text = "Site"
|
||||||
TP_MAIN.ResumeLayout(False)
|
Me.TP_MAIN.ResumeLayout(False)
|
||||||
CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
CType(Me.TXT_TOKEN, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.TXT_TOKEN, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
@@ -176,5 +174,6 @@
|
|||||||
Private WithEvents TXT_COOKIES As PersonalUtilities.Forms.Controls.TextBoxExtended
|
Private WithEvents TXT_COOKIES As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
Private WithEvents TXT_TOKEN As PersonalUtilities.Forms.Controls.TextBoxExtended
|
Private WithEvents TXT_TOKEN As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
Private WithEvents TXT_AUTH As PersonalUtilities.Forms.Controls.TextBoxExtended
|
Private WithEvents TXT_AUTH As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
Private WithEvents TP_MAIN As TableLayoutPanel
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -117,9 +117,6 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<metadata name="TP_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>False</value>
|
|
||||||
</metadata>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
<data name="ActionButton1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
@@ -220,19 +217,6 @@
|
|||||||
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
AAABAAEAICAAAAEAIADLAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAAZJJ
|
|
||||||
REFUeAFiGDZgFMguBPBazwB6BEAUx2PbttHFqmJ2sW1UsbrY6NLFrmL2sW3jbMz9z1rNqvh9wry3QnQ5
|
|
||||||
LMRdRCAez7AVDQ1+3w2lc9+UwXwP4W3wFGIiBhPQANNxDScKDhgDwWIX4XXxCWIjDekQ/EKjgkP2QJCO
|
|
||||||
DcoCRyAKbzAY07Ewd8hRSAHnUMtBeA0kQxQSIXiM6rmD9kKK+I7pKGlRYAzEhQeoX3DQWIiJJ5iFSgYF
|
|
||||||
5kCUHqFy0UHl8QViIQ6nsAjdUBujIUrXzVbncKRCFFIgSheMwtdiClaqh+odNiqwDxKSFWarX0LS16hA
|
|
||||||
SdyHBCwa5c12wk74DwnQMbszW1c8gwRksF2B2uiIdfgL8dETlLQr0CLAw3CM06vblgDCL2kur6VxAuKT
|
|
||||||
CDTT3mSUxDx8hHiQipGqcIMi3XEPopSO6V7DR+ApRCkJU9yElkEvrPVwPniLXprQgbiNLx4PwXjsQGW3
|
|
||||||
9/TTcQfpEIVf2KLa023KtMJSHMMj/IEgFf/xEhexGQNQJmMMQxmMAgBkarVAZoTAyQAAAABJRU5ErkJg
|
|
||||||
gg==
|
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
152
SCrawler/Editors/SiteEditorForm.vb
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
' 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
|
||||||
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
|
Imports PersonalUtilities.Tools.WEB
|
||||||
|
Namespace Editors
|
||||||
|
Friend Class SiteEditorForm : Implements IOkCancelToolbar
|
||||||
|
Private ReadOnly MyDefs As DefaultFormProps(Of FieldsChecker)
|
||||||
|
Private ReadOnly MySite As Sites
|
||||||
|
Friend Sub New(ByVal s As Sites)
|
||||||
|
InitializeComponent()
|
||||||
|
MySite = s
|
||||||
|
MyDefs = New DefaultFormProps(Of FieldsChecker)
|
||||||
|
End Sub
|
||||||
|
Private Sub SiteEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||||
|
Try
|
||||||
|
With MyDefs
|
||||||
|
.MyViewInitialize(Me, Settings.Design, True)
|
||||||
|
.AddOkCancelToolbar()
|
||||||
|
.DelegateClosingChecker()
|
||||||
|
Select Case MySite
|
||||||
|
Case Sites.Reddit : Icon = My.Resources.RedditIcon
|
||||||
|
Case Sites.Twitter : Icon = My.Resources.TwitterIcon
|
||||||
|
Case Sites.Instagram : Icon = My.Resources.InstagramIcon
|
||||||
|
Case Else : ShowIcon = False
|
||||||
|
End Select
|
||||||
|
Text = MySite.ToString
|
||||||
|
|
||||||
|
With Settings(MySite)
|
||||||
|
TXT_PATH.Text = .Path(False)
|
||||||
|
With .Responser
|
||||||
|
If .Cookies Is Nothing Then .Cookies = New CookieKeeper(.CookiesDomain)
|
||||||
|
SetCookieText()
|
||||||
|
If MySite = Sites.Twitter Then
|
||||||
|
TXT_TOKEN.Text = .Headers(API.Base.SiteSettings.Header_Twitter_Token)
|
||||||
|
TXT_AUTH.Text = .Headers(API.Base.SiteSettings.Header_Twitter_Authorization)
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
If MySite = Sites.Instagram Then
|
||||||
|
TXT_TOKEN.Text = .InstaHash
|
||||||
|
TXT_AUTH.Text = .InstaHash_SP
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
|
||||||
|
If MySite = Sites.Twitter Or MySite = Sites.Instagram Then
|
||||||
|
If MySite = Sites.Instagram Then
|
||||||
|
TXT_TOKEN.CaptionText = "Hash"
|
||||||
|
TXT_TOKEN.CaptionToolTipText = "Instagram session hash"
|
||||||
|
TXT_TOKEN.Buttons.Clear()
|
||||||
|
TXT_TOKEN.Buttons.AddRange({ActionButton.DefaultButtons.Refresh, ActionButton.DefaultButtons.Clear})
|
||||||
|
TXT_AUTH.CaptionText = "Hash 2"
|
||||||
|
TXT_AUTH.CaptionToolTipText = "Instagram session hash for saved posts"
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
TXT_AUTH.Visible = False
|
||||||
|
TXT_TOKEN.Visible = False
|
||||||
|
Dim p As PaddingE = PaddingE.GetOf({TP_MAIN})
|
||||||
|
Dim s As New Size(Size.Width, Size.Height - p.Vertical(2) - TXT_AUTH.NeededHeight - TXT_TOKEN.NeededHeight)
|
||||||
|
With TP_MAIN
|
||||||
|
.RowStyles(2).Height = 0
|
||||||
|
.RowStyles(3).Height = 0
|
||||||
|
End With
|
||||||
|
MinimumSize = s
|
||||||
|
Size = s
|
||||||
|
MaximumSize = s
|
||||||
|
End If
|
||||||
|
|
||||||
|
.MyFieldsChecker = New FieldsChecker
|
||||||
|
With .MyFieldsChecker
|
||||||
|
If MySite = Sites.Twitter Or MySite = Sites.Instagram Then
|
||||||
|
.AddControl(Of String)(TXT_TOKEN, TXT_TOKEN.CaptionText)
|
||||||
|
.AddControl(Of String)(TXT_AUTH, TXT_AUTH.CaptionText, MySite = Sites.Instagram)
|
||||||
|
End If
|
||||||
|
.EndLoaderOperations()
|
||||||
|
End With
|
||||||
|
TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector)
|
||||||
|
.EndLoaderOperations()
|
||||||
|
End With
|
||||||
|
Catch ex As Exception
|
||||||
|
MyDefs.InvokeLoaderError(ex)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
||||||
|
If MyDefs.MyFieldsChecker.AllParamsOK Then
|
||||||
|
If MySite = Sites.Instagram Then
|
||||||
|
If Not TXT_TOKEN.IsEmptyString AndAlso Not TXT_AUTH.IsEmptyString AndAlso TXT_TOKEN.Text = TXT_AUTH.Text Then
|
||||||
|
MsgBoxE({"InstaHash for saved posts must be different from InstaHash!", "InstaHash are equal"}, vbCritical)
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
With Settings(MySite)
|
||||||
|
If TXT_PATH.IsEmptyString Then .Path = Nothing Else .Path = TXT_PATH.Text
|
||||||
|
Select Case MySite
|
||||||
|
Case Sites.Twitter
|
||||||
|
With .Responser
|
||||||
|
.Headers(API.Base.SiteSettings.Header_Twitter_Token) = TXT_TOKEN.Text
|
||||||
|
.Headers(API.Base.SiteSettings.Header_Twitter_Authorization) = TXT_AUTH.Text
|
||||||
|
End With
|
||||||
|
Case Sites.Instagram
|
||||||
|
.InstaHash.Value = TXT_TOKEN.Text
|
||||||
|
.InstaHash_SP.Value = TXT_AUTH.Text
|
||||||
|
End Select
|
||||||
|
.Update()
|
||||||
|
End With
|
||||||
|
MyDefs.CloseForm()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
||||||
|
MyDefs.CloseForm(DialogResult.Cancel)
|
||||||
|
End Sub
|
||||||
|
Private Sub TXT_TOKEN_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_TOKEN.ActionOnButtonClick
|
||||||
|
If Sender.DefaultButton = ActionButton.DefaultButtons.Refresh Then
|
||||||
|
With Settings(Sites.Instagram)
|
||||||
|
If .GatherInstaHash() Then
|
||||||
|
.InstaHashUpdateRequired.Value = Not .InstaHash.IsEmptyString
|
||||||
|
TXT_TOKEN.Text = .InstaHash
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub TXT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_PATH.ActionOnButtonClick
|
||||||
|
If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then
|
||||||
|
Dim f As SFile = SFile.SelectPath(Settings(MySite).Path(False))
|
||||||
|
If Not f.IsEmptyString Then TXT_PATH.Text = f
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub TXT_COOKIES_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_COOKIES.ActionOnButtonClick
|
||||||
|
If Sender.DefaultButton = ActionButton.DefaultButtons.Edit Then
|
||||||
|
Using f As New CookieListForm(Settings(MySite).Responser.Cookies) With {.MyDesignXML = Settings.Design} : f.ShowDialog() : End Using
|
||||||
|
SetCookieText()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub TXT_COOKIES_ActionOnButtonClearClick() Handles TXT_COOKIES.ActionOnButtonClearClick
|
||||||
|
With Settings(MySite).Responser
|
||||||
|
If Not .Cookies Is Nothing Then .Cookies.Dispose()
|
||||||
|
.Cookies = New CookieKeeper(.CookiesDomain)
|
||||||
|
End With
|
||||||
|
SetCookieText()
|
||||||
|
End Sub
|
||||||
|
Private Sub SetCookieText()
|
||||||
|
TXT_COOKIES.Text = $"{If(Settings(MySite).Responser.Cookies?.Count, 0)} cookies"
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
107
SCrawler/Editors/SiteSelectionForm.Designer.vb
generated
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
' 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 Editors
|
||||||
|
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||||
|
Partial Friend Class SiteSelectionForm : Inherits System.Windows.Forms.Form
|
||||||
|
<System.Diagnostics.DebuggerNonUserCode()>
|
||||||
|
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
|
||||||
|
<System.Diagnostics.DebuggerStepThrough()>
|
||||||
|
Private Sub InitializeComponent()
|
||||||
|
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(SiteSelectionForm))
|
||||||
|
Dim ListColumn1 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
|
Dim ListColumn2 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
|
Me.CMB_SITES = New PersonalUtilities.Forms.Controls.ComboBoxExtended()
|
||||||
|
CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
||||||
|
CONTAINER_MAIN.ContentPanel.SuspendLayout()
|
||||||
|
CONTAINER_MAIN.SuspendLayout()
|
||||||
|
CType(Me.CMB_SITES, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
Me.SuspendLayout()
|
||||||
|
'
|
||||||
|
'CONTAINER_MAIN
|
||||||
|
'
|
||||||
|
'
|
||||||
|
'CONTAINER_MAIN.ContentPanel
|
||||||
|
'
|
||||||
|
CONTAINER_MAIN.ContentPanel.Controls.Add(Me.CMB_SITES)
|
||||||
|
CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(284, 276)
|
||||||
|
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(284, 276)
|
||||||
|
CONTAINER_MAIN.TabIndex = 0
|
||||||
|
CONTAINER_MAIN.TopToolStripPanelVisible = False
|
||||||
|
'
|
||||||
|
'CMB_SITES
|
||||||
|
'
|
||||||
|
ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton1.Index = 0
|
||||||
|
ActionButton1.Name = "BTT_COMBOBOX_ARROW"
|
||||||
|
ActionButton1.Visible = False
|
||||||
|
Me.CMB_SITES.Buttons.Add(ActionButton1)
|
||||||
|
ListColumn1.DisplayMember = True
|
||||||
|
ListColumn1.Name = "COL_DISPLAY"
|
||||||
|
ListColumn1.Text = "Site"
|
||||||
|
ListColumn1.Width = -1
|
||||||
|
ListColumn2.Name = "COL_VALUE"
|
||||||
|
ListColumn2.Text = "Value"
|
||||||
|
ListColumn2.ValueMember = True
|
||||||
|
ListColumn2.Visible = False
|
||||||
|
Me.CMB_SITES.Columns.Add(ListColumn1)
|
||||||
|
Me.CMB_SITES.Columns.Add(ListColumn2)
|
||||||
|
Me.CMB_SITES.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CMB_SITES.ListCheckBoxes = True
|
||||||
|
Me.CMB_SITES.ListDropDownStyle = PersonalUtilities.Forms.Controls.ComboBoxExtended.ListMode.Simple
|
||||||
|
Me.CMB_SITES.ListGridVisible = True
|
||||||
|
Me.CMB_SITES.ListMultiSelect = True
|
||||||
|
Me.CMB_SITES.Location = New System.Drawing.Point(0, 0)
|
||||||
|
Me.CMB_SITES.Name = "CMB_SITES"
|
||||||
|
Me.CMB_SITES.Size = New System.Drawing.Size(286, 277)
|
||||||
|
Me.CMB_SITES.TabIndex = 0
|
||||||
|
'
|
||||||
|
'SiteSelectionForm
|
||||||
|
'
|
||||||
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
|
Me.ClientSize = New System.Drawing.Size(284, 276)
|
||||||
|
Me.Controls.Add(CONTAINER_MAIN)
|
||||||
|
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
||||||
|
Me.KeyPreview = True
|
||||||
|
Me.MaximizeBox = False
|
||||||
|
Me.MaximumSize = New System.Drawing.Size(300, 315)
|
||||||
|
Me.MinimizeBox = False
|
||||||
|
Me.MinimumSize = New System.Drawing.Size(300, 315)
|
||||||
|
Me.Name = "SiteSelectionForm"
|
||||||
|
Me.ShowIcon = False
|
||||||
|
Me.ShowInTaskbar = False
|
||||||
|
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
||||||
|
Me.Text = "Select Site"
|
||||||
|
CONTAINER_MAIN.ContentPanel.ResumeLayout(False)
|
||||||
|
CONTAINER_MAIN.ResumeLayout(False)
|
||||||
|
CONTAINER_MAIN.PerformLayout()
|
||||||
|
CType(Me.CMB_SITES, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
Me.ResumeLayout(False)
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private WithEvents CMB_SITES As PersonalUtilities.Forms.Controls.ComboBoxExtended
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
214
SCrawler/Editors/SiteSelectionForm.resx
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="CONTAINER_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
|
<data name="ActionButton1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
|
AAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
54
SCrawler/Editors/SiteSelectionForm.vb
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
' 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.Toolbars
|
||||||
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
|
Namespace Editors
|
||||||
|
Friend Class SiteSelectionForm : Implements IOkCancelToolbar
|
||||||
|
Private ReadOnly MyDefs As DefaultFormProps
|
||||||
|
Friend ReadOnly Property SelectedSites As List(Of Sites)
|
||||||
|
Friend Sub New(ByVal s As List(Of Sites))
|
||||||
|
InitializeComponent()
|
||||||
|
SelectedSites.ListAddList(s)
|
||||||
|
If SelectedSites Is Nothing Then SelectedSites = New List(Of Sites)
|
||||||
|
MyDefs = New DefaultFormProps
|
||||||
|
End Sub
|
||||||
|
Private Sub SiteSelectionForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||||
|
With MyDefs
|
||||||
|
.MyViewInitialize(Me, Settings.Design, True)
|
||||||
|
.DelegateClosingChecker()
|
||||||
|
.AddOkCancelToolbar()
|
||||||
|
CMB_SITES.BeginUpdate()
|
||||||
|
Dim sl As List(Of Sites) = ListAddList(Of Sites)(Nothing, [Enum].GetValues(GetType(Sites))).ListWithRemove(Sites.Undefined)
|
||||||
|
CMB_SITES.Items.AddRange(sl.Select(Function(s) New ListItem({s.ToString, CInt(s)})))
|
||||||
|
Dim l As New List(Of Integer)
|
||||||
|
If SelectedSites.Count > 0 Then sl.ForEach(Sub(s) If SelectedSites.Contains(s) Then l.Add(sl.IndexOf(s)))
|
||||||
|
sl.Clear()
|
||||||
|
CMB_SITES.EndUpdate()
|
||||||
|
If l.Count > 0 Then CMB_SITES.ListCheckedIndexes = l : l.Clear()
|
||||||
|
.EndLoaderOperations()
|
||||||
|
.MyOkCancel.EnableOK = True
|
||||||
|
End With
|
||||||
|
End Sub
|
||||||
|
Private Sub SiteSelectionForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
||||||
|
SelectedSites.Clear()
|
||||||
|
End Sub
|
||||||
|
Public Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
||||||
|
Try
|
||||||
|
SelectedSites.ListAddList(CMB_SITES.Items.CheckedItems.Select(Function(i) DirectCast(i.Value(1), Sites)), LAP.ClearBeforeAdd)
|
||||||
|
MyDefs.CloseForm()
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Public Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
||||||
|
MyDefs.CloseForm(DialogResult.Cancel)
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
Imports PersonalUtilities.Forms
|
|
||||||
Imports PersonalUtilities.Forms.Controls
|
|
||||||
Imports PersonalUtilities.Forms.Controls.Base
|
|
||||||
Imports PersonalUtilities.Forms.Toolbars
|
|
||||||
Imports PersonalUtilities.Tools.WEB
|
|
||||||
Namespace Editors
|
|
||||||
Friend Class TwitterEditorForm : Implements IOkCancelToolbar
|
|
||||||
Private ReadOnly MyDefs As DefaultFormProps(Of FieldsChecker)
|
|
||||||
Friend Sub New()
|
|
||||||
InitializeComponent()
|
|
||||||
MyDefs = New DefaultFormProps(Of FieldsChecker)
|
|
||||||
End Sub
|
|
||||||
Private Sub TwitterEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
|
||||||
Try
|
|
||||||
With MyDefs
|
|
||||||
.MyViewInitialize(Me, Settings.Design, True)
|
|
||||||
.AddOkCancelToolbar()
|
|
||||||
.DelegateClosingChecker()
|
|
||||||
With Settings.Site(Sites.Twitter)
|
|
||||||
TXT_PATH.Text = .Path
|
|
||||||
With .Responser
|
|
||||||
If .Cookies Is Nothing Then .Cookies = New CookieKeeper(.CookiesDomain)
|
|
||||||
SetCookieText()
|
|
||||||
TXT_TOKEN.Text = .Headers(API.Base.SiteSettings.Header_Twitter_Token)
|
|
||||||
TXT_AUTH.Text = .Headers(API.Base.SiteSettings.Header_Twitter_Authorization)
|
|
||||||
End With
|
|
||||||
End With
|
|
||||||
.MyFieldsChecker = New FieldsChecker
|
|
||||||
With .MyFieldsChecker
|
|
||||||
.AddControl(Of String)(TXT_TOKEN, TXT_TOKEN.CaptionText)
|
|
||||||
.AddControl(Of String)(TXT_AUTH, TXT_AUTH.CaptionText)
|
|
||||||
.EndLoaderOperations()
|
|
||||||
End With
|
|
||||||
TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector)
|
|
||||||
.EndLoaderOperations()
|
|
||||||
End With
|
|
||||||
Catch ex As Exception
|
|
||||||
MyDefs.InvokeLoaderError(ex)
|
|
||||||
End Try
|
|
||||||
End Sub
|
|
||||||
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
|
||||||
If MyDefs.MyFieldsChecker.AllParamsOK Then
|
|
||||||
With Settings.Site(Sites.Twitter)
|
|
||||||
If TXT_PATH.IsEmptyString Then .Path = Nothing Else .Path = TXT_PATH.Text
|
|
||||||
With .Responser
|
|
||||||
.Headers(API.Base.SiteSettings.Header_Twitter_Token) = TXT_TOKEN.Text
|
|
||||||
.Headers(API.Base.SiteSettings.Header_Twitter_Authorization) = TXT_AUTH.Text
|
|
||||||
End With
|
|
||||||
.Update()
|
|
||||||
End With
|
|
||||||
MyDefs.CloseForm()
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
|
||||||
MyDefs.CloseForm(DialogResult.Cancel)
|
|
||||||
End Sub
|
|
||||||
Private Sub TXT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_PATH.ActionOnButtonClick
|
|
||||||
If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then
|
|
||||||
Dim f As SFile = SFile.SelectPath(Settings.Site(Sites.Twitter).Path)
|
|
||||||
If Not f.IsEmptyString Then TXT_PATH.Text = f
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
Private Sub TXT_COOKIES_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_COOKIES.ActionOnButtonClick
|
|
||||||
If Sender.DefaultButton = ActionButton.DefaultButtons.Edit Then
|
|
||||||
Using f As New CookieListForm(Settings.Site(Sites.Twitter).Responser.Cookies) : f.ShowDialog() : End Using
|
|
||||||
SetCookieText()
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
Private Sub TXT_COOKIES_ActionOnButtonClearClick() Handles TXT_COOKIES.ActionOnButtonClearClick
|
|
||||||
With Settings.Site(Sites.Twitter).Responser
|
|
||||||
If Not .Cookies Is Nothing Then .Cookies.Dispose()
|
|
||||||
.Cookies = New CookieKeeper(.CookiesDomain)
|
|
||||||
End With
|
|
||||||
SetCookieText()
|
|
||||||
End Sub
|
|
||||||
Private Sub SetCookieText()
|
|
||||||
Dim c% = 0
|
|
||||||
With Settings.Site(Sites.Twitter).Responser
|
|
||||||
If Not .Cookies Is Nothing Then c = .Cookies.Count
|
|
||||||
End With
|
|
||||||
TXT_COOKIES.Text = $"{c} cookies"
|
|
||||||
End Sub
|
|
||||||
End Class
|
|
||||||
End Namespace
|
|
||||||
242
SCrawler/Editors/UserCreatorForm.Designer.vb
generated
@@ -16,17 +16,23 @@
|
|||||||
Private Sub InitializeComponent()
|
Private Sub InitializeComponent()
|
||||||
Me.components = New System.ComponentModel.Container()
|
Me.components = New System.ComponentModel.Container()
|
||||||
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
||||||
Dim TP_SITE As System.Windows.Forms.TableLayoutPanel
|
|
||||||
Dim TP_PARAMS As System.Windows.Forms.TableLayoutPanel
|
Dim TP_PARAMS As System.Windows.Forms.TableLayoutPanel
|
||||||
Dim TP_OTHER As System.Windows.Forms.TableLayoutPanel
|
Dim TP_OTHER As System.Windows.Forms.TableLayoutPanel
|
||||||
Dim ActionButton1 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(UserCreatorForm))
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(UserCreatorForm))
|
||||||
Dim ActionButton2 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 ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim TP_DOWN_OPTIONS As System.Windows.Forms.TableLayoutPanel
|
||||||
|
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 TT_MAIN As System.Windows.Forms.ToolTip
|
Dim TT_MAIN As System.Windows.Forms.ToolTip
|
||||||
Me.TXT_USER = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_USER = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
|
Me.TP_SITE = New System.Windows.Forms.TableLayoutPanel()
|
||||||
Me.OPT_REDDIT = New System.Windows.Forms.RadioButton()
|
Me.OPT_REDDIT = New System.Windows.Forms.RadioButton()
|
||||||
Me.OPT_TWITTER = New System.Windows.Forms.RadioButton()
|
Me.OPT_TWITTER = New System.Windows.Forms.RadioButton()
|
||||||
|
Me.CH_IS_CHANNEL = New System.Windows.Forms.CheckBox()
|
||||||
|
Me.OPT_INSTAGRAM = New System.Windows.Forms.RadioButton()
|
||||||
|
Me.OPT_REDGIFS = New System.Windows.Forms.RadioButton()
|
||||||
Me.CH_TEMP = New System.Windows.Forms.CheckBox()
|
Me.CH_TEMP = New System.Windows.Forms.CheckBox()
|
||||||
Me.CH_FAV = New System.Windows.Forms.CheckBox()
|
Me.CH_FAV = New System.Windows.Forms.CheckBox()
|
||||||
Me.CH_PARSE_USER_MEDIA = New System.Windows.Forms.CheckBox()
|
Me.CH_PARSE_USER_MEDIA = New System.Windows.Forms.CheckBox()
|
||||||
@@ -37,21 +43,26 @@
|
|||||||
Me.CH_ADD_BY_LIST = New System.Windows.Forms.CheckBox()
|
Me.CH_ADD_BY_LIST = New System.Windows.Forms.CheckBox()
|
||||||
Me.CH_AUTO_DETECT_SITE = New System.Windows.Forms.CheckBox()
|
Me.CH_AUTO_DETECT_SITE = New System.Windows.Forms.CheckBox()
|
||||||
Me.TXT_LABELS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_LABELS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
|
Me.CH_DOWN_IMAGES = New System.Windows.Forms.CheckBox()
|
||||||
|
Me.CH_DOWN_VIDEOS = New System.Windows.Forms.CheckBox()
|
||||||
|
Me.TXT_SPEC_FOLDER = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
||||||
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
||||||
TP_SITE = New System.Windows.Forms.TableLayoutPanel()
|
|
||||||
TP_PARAMS = New System.Windows.Forms.TableLayoutPanel()
|
TP_PARAMS = New System.Windows.Forms.TableLayoutPanel()
|
||||||
TP_OTHER = New System.Windows.Forms.TableLayoutPanel()
|
TP_OTHER = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TP_DOWN_OPTIONS = New System.Windows.Forms.TableLayoutPanel()
|
||||||
TT_MAIN = New System.Windows.Forms.ToolTip(Me.components)
|
TT_MAIN = New System.Windows.Forms.ToolTip(Me.components)
|
||||||
TP_MAIN.SuspendLayout()
|
TP_MAIN.SuspendLayout()
|
||||||
CType(Me.TXT_USER, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.TXT_USER, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
TP_SITE.SuspendLayout()
|
Me.TP_SITE.SuspendLayout()
|
||||||
TP_PARAMS.SuspendLayout()
|
TP_PARAMS.SuspendLayout()
|
||||||
TP_OTHER.SuspendLayout()
|
TP_OTHER.SuspendLayout()
|
||||||
CType(Me.TXT_DESCR, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.TXT_DESCR, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
CType(Me.TXT_USER_FRIENDLY, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.TXT_USER_FRIENDLY, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
Me.TP_ADD_BY_LIST.SuspendLayout()
|
Me.TP_ADD_BY_LIST.SuspendLayout()
|
||||||
CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
TP_DOWN_OPTIONS.SuspendLayout()
|
||||||
|
CType(Me.TXT_SPEC_FOLDER, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
Me.CONTAINER_MAIN.ContentPanel.SuspendLayout()
|
Me.CONTAINER_MAIN.ContentPanel.SuspendLayout()
|
||||||
Me.CONTAINER_MAIN.SuspendLayout()
|
Me.CONTAINER_MAIN.SuspendLayout()
|
||||||
Me.SuspendLayout()
|
Me.SuspendLayout()
|
||||||
@@ -62,26 +73,30 @@
|
|||||||
TP_MAIN.ColumnCount = 1
|
TP_MAIN.ColumnCount = 1
|
||||||
TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
TP_MAIN.Controls.Add(Me.TXT_USER, 0, 0)
|
TP_MAIN.Controls.Add(Me.TXT_USER, 0, 0)
|
||||||
TP_MAIN.Controls.Add(TP_SITE, 0, 2)
|
TP_MAIN.Controls.Add(Me.TP_SITE, 0, 3)
|
||||||
TP_MAIN.Controls.Add(TP_PARAMS, 0, 3)
|
TP_MAIN.Controls.Add(TP_PARAMS, 0, 4)
|
||||||
TP_MAIN.Controls.Add(TP_OTHER, 0, 4)
|
TP_MAIN.Controls.Add(TP_OTHER, 0, 6)
|
||||||
TP_MAIN.Controls.Add(Me.TXT_DESCR, 0, 7)
|
TP_MAIN.Controls.Add(Me.TXT_DESCR, 0, 9)
|
||||||
TP_MAIN.Controls.Add(Me.TXT_USER_FRIENDLY, 0, 1)
|
TP_MAIN.Controls.Add(Me.TXT_USER_FRIENDLY, 0, 1)
|
||||||
TP_MAIN.Controls.Add(Me.TP_ADD_BY_LIST, 0, 5)
|
TP_MAIN.Controls.Add(Me.TP_ADD_BY_LIST, 0, 7)
|
||||||
TP_MAIN.Controls.Add(Me.TXT_LABELS, 0, 6)
|
TP_MAIN.Controls.Add(Me.TXT_LABELS, 0, 8)
|
||||||
|
TP_MAIN.Controls.Add(TP_DOWN_OPTIONS, 0, 5)
|
||||||
|
TP_MAIN.Controls.Add(Me.TXT_SPEC_FOLDER, 0, 2)
|
||||||
TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
TP_MAIN.Location = New System.Drawing.Point(0, 0)
|
TP_MAIN.Location = New System.Drawing.Point(0, 0)
|
||||||
TP_MAIN.Name = "TP_MAIN"
|
TP_MAIN.Name = "TP_MAIN"
|
||||||
TP_MAIN.RowCount = 8
|
TP_MAIN.RowCount = 10
|
||||||
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, 28.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.Absolute, 28.0!))
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005!))
|
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, 20.0005!))
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66708!))
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005!))
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66708!))
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 19.99851!))
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!))
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66708!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66542!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!))
|
||||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 150.0!))
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 150.0!))
|
||||||
TP_MAIN.Size = New System.Drawing.Size(454, 366)
|
TP_MAIN.Size = New System.Drawing.Size(454, 431)
|
||||||
TP_MAIN.TabIndex = 0
|
TP_MAIN.TabIndex = 0
|
||||||
'
|
'
|
||||||
'TXT_USER
|
'TXT_USER
|
||||||
@@ -97,21 +112,26 @@
|
|||||||
'
|
'
|
||||||
'TP_SITE
|
'TP_SITE
|
||||||
'
|
'
|
||||||
TP_SITE.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single]
|
Me.TP_SITE.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single]
|
||||||
TP_SITE.ColumnCount = 2
|
Me.TP_SITE.ColumnCount = 5
|
||||||
TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
Me.TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
Me.TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
TP_SITE.Controls.Add(Me.OPT_REDDIT, 0, 0)
|
Me.TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
TP_SITE.Controls.Add(Me.OPT_TWITTER, 1, 0)
|
Me.TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
TP_SITE.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
TP_SITE.Location = New System.Drawing.Point(1, 59)
|
Me.TP_SITE.Controls.Add(Me.OPT_REDDIT, 0, 0)
|
||||||
TP_SITE.Margin = New System.Windows.Forms.Padding(0)
|
Me.TP_SITE.Controls.Add(Me.OPT_TWITTER, 2, 0)
|
||||||
TP_SITE.Name = "TP_SITE"
|
Me.TP_SITE.Controls.Add(Me.CH_IS_CHANNEL, 1, 0)
|
||||||
TP_SITE.RowCount = 1
|
Me.TP_SITE.Controls.Add(Me.OPT_INSTAGRAM, 3, 0)
|
||||||
TP_SITE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
Me.TP_SITE.Controls.Add(Me.OPT_REDGIFS, 4, 0)
|
||||||
TP_SITE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29.0!))
|
Me.TP_SITE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
TP_SITE.Size = New System.Drawing.Size(452, 30)
|
Me.TP_SITE.Location = New System.Drawing.Point(1, 88)
|
||||||
TP_SITE.TabIndex = 2
|
Me.TP_SITE.Margin = New System.Windows.Forms.Padding(0)
|
||||||
|
Me.TP_SITE.Name = "TP_SITE"
|
||||||
|
Me.TP_SITE.RowCount = 1
|
||||||
|
Me.TP_SITE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
Me.TP_SITE.Size = New System.Drawing.Size(452, 31)
|
||||||
|
Me.TP_SITE.TabIndex = 3
|
||||||
'
|
'
|
||||||
'OPT_REDDIT
|
'OPT_REDDIT
|
||||||
'
|
'
|
||||||
@@ -119,7 +139,7 @@
|
|||||||
Me.OPT_REDDIT.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.OPT_REDDIT.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.OPT_REDDIT.Location = New System.Drawing.Point(4, 4)
|
Me.OPT_REDDIT.Location = New System.Drawing.Point(4, 4)
|
||||||
Me.OPT_REDDIT.Name = "OPT_REDDIT"
|
Me.OPT_REDDIT.Name = "OPT_REDDIT"
|
||||||
Me.OPT_REDDIT.Size = New System.Drawing.Size(218, 22)
|
Me.OPT_REDDIT.Size = New System.Drawing.Size(83, 23)
|
||||||
Me.OPT_REDDIT.TabIndex = 0
|
Me.OPT_REDDIT.TabIndex = 0
|
||||||
Me.OPT_REDDIT.TabStop = True
|
Me.OPT_REDDIT.TabStop = True
|
||||||
Me.OPT_REDDIT.Text = "Reddit"
|
Me.OPT_REDDIT.Text = "Reddit"
|
||||||
@@ -129,14 +149,49 @@
|
|||||||
'
|
'
|
||||||
Me.OPT_TWITTER.AutoSize = True
|
Me.OPT_TWITTER.AutoSize = True
|
||||||
Me.OPT_TWITTER.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.OPT_TWITTER.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.OPT_TWITTER.Location = New System.Drawing.Point(229, 4)
|
Me.OPT_TWITTER.Location = New System.Drawing.Point(184, 4)
|
||||||
Me.OPT_TWITTER.Name = "OPT_TWITTER"
|
Me.OPT_TWITTER.Name = "OPT_TWITTER"
|
||||||
Me.OPT_TWITTER.Size = New System.Drawing.Size(219, 22)
|
Me.OPT_TWITTER.Size = New System.Drawing.Size(83, 23)
|
||||||
Me.OPT_TWITTER.TabIndex = 1
|
Me.OPT_TWITTER.TabIndex = 1
|
||||||
Me.OPT_TWITTER.TabStop = True
|
Me.OPT_TWITTER.TabStop = True
|
||||||
Me.OPT_TWITTER.Text = "Twitter"
|
Me.OPT_TWITTER.Text = "Twitter"
|
||||||
Me.OPT_TWITTER.UseVisualStyleBackColor = True
|
Me.OPT_TWITTER.UseVisualStyleBackColor = True
|
||||||
'
|
'
|
||||||
|
'CH_IS_CHANNEL
|
||||||
|
'
|
||||||
|
Me.CH_IS_CHANNEL.AutoSize = True
|
||||||
|
Me.CH_IS_CHANNEL.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CH_IS_CHANNEL.Location = New System.Drawing.Point(94, 4)
|
||||||
|
Me.CH_IS_CHANNEL.Name = "CH_IS_CHANNEL"
|
||||||
|
Me.CH_IS_CHANNEL.Size = New System.Drawing.Size(83, 23)
|
||||||
|
Me.CH_IS_CHANNEL.TabIndex = 2
|
||||||
|
Me.CH_IS_CHANNEL.Text = "Channel"
|
||||||
|
Me.CH_IS_CHANNEL.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'OPT_INSTAGRAM
|
||||||
|
'
|
||||||
|
Me.OPT_INSTAGRAM.AutoSize = True
|
||||||
|
Me.OPT_INSTAGRAM.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.OPT_INSTAGRAM.Location = New System.Drawing.Point(274, 4)
|
||||||
|
Me.OPT_INSTAGRAM.Name = "OPT_INSTAGRAM"
|
||||||
|
Me.OPT_INSTAGRAM.Size = New System.Drawing.Size(83, 23)
|
||||||
|
Me.OPT_INSTAGRAM.TabIndex = 3
|
||||||
|
Me.OPT_INSTAGRAM.TabStop = True
|
||||||
|
Me.OPT_INSTAGRAM.Text = "Instagram"
|
||||||
|
Me.OPT_INSTAGRAM.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'OPT_REDGIFS
|
||||||
|
'
|
||||||
|
Me.OPT_REDGIFS.AutoSize = True
|
||||||
|
Me.OPT_REDGIFS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.OPT_REDGIFS.Location = New System.Drawing.Point(364, 4)
|
||||||
|
Me.OPT_REDGIFS.Name = "OPT_REDGIFS"
|
||||||
|
Me.OPT_REDGIFS.Size = New System.Drawing.Size(84, 23)
|
||||||
|
Me.OPT_REDGIFS.TabIndex = 4
|
||||||
|
Me.OPT_REDGIFS.TabStop = True
|
||||||
|
Me.OPT_REDGIFS.Text = "RedGifs"
|
||||||
|
Me.OPT_REDGIFS.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
'TP_PARAMS
|
'TP_PARAMS
|
||||||
'
|
'
|
||||||
TP_PARAMS.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single]
|
TP_PARAMS.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single]
|
||||||
@@ -146,14 +201,14 @@
|
|||||||
TP_PARAMS.Controls.Add(Me.CH_TEMP, 0, 0)
|
TP_PARAMS.Controls.Add(Me.CH_TEMP, 0, 0)
|
||||||
TP_PARAMS.Controls.Add(Me.CH_FAV, 1, 0)
|
TP_PARAMS.Controls.Add(Me.CH_FAV, 1, 0)
|
||||||
TP_PARAMS.Dock = System.Windows.Forms.DockStyle.Fill
|
TP_PARAMS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
TP_PARAMS.Location = New System.Drawing.Point(1, 90)
|
TP_PARAMS.Location = New System.Drawing.Point(1, 120)
|
||||||
TP_PARAMS.Margin = New System.Windows.Forms.Padding(0)
|
TP_PARAMS.Margin = New System.Windows.Forms.Padding(0)
|
||||||
TP_PARAMS.Name = "TP_PARAMS"
|
TP_PARAMS.Name = "TP_PARAMS"
|
||||||
TP_PARAMS.RowCount = 1
|
TP_PARAMS.RowCount = 1
|
||||||
TP_PARAMS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
TP_PARAMS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
TP_PARAMS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29.0!))
|
TP_PARAMS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
TP_PARAMS.Size = New System.Drawing.Size(452, 30)
|
TP_PARAMS.Size = New System.Drawing.Size(452, 31)
|
||||||
TP_PARAMS.TabIndex = 3
|
TP_PARAMS.TabIndex = 4
|
||||||
'
|
'
|
||||||
'CH_TEMP
|
'CH_TEMP
|
||||||
'
|
'
|
||||||
@@ -161,7 +216,7 @@
|
|||||||
Me.CH_TEMP.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.CH_TEMP.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.CH_TEMP.Location = New System.Drawing.Point(4, 4)
|
Me.CH_TEMP.Location = New System.Drawing.Point(4, 4)
|
||||||
Me.CH_TEMP.Name = "CH_TEMP"
|
Me.CH_TEMP.Name = "CH_TEMP"
|
||||||
Me.CH_TEMP.Size = New System.Drawing.Size(218, 22)
|
Me.CH_TEMP.Size = New System.Drawing.Size(218, 23)
|
||||||
Me.CH_TEMP.TabIndex = 0
|
Me.CH_TEMP.TabIndex = 0
|
||||||
Me.CH_TEMP.Text = "Temporary"
|
Me.CH_TEMP.Text = "Temporary"
|
||||||
Me.CH_TEMP.UseVisualStyleBackColor = True
|
Me.CH_TEMP.UseVisualStyleBackColor = True
|
||||||
@@ -172,7 +227,7 @@
|
|||||||
Me.CH_FAV.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.CH_FAV.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.CH_FAV.Location = New System.Drawing.Point(229, 4)
|
Me.CH_FAV.Location = New System.Drawing.Point(229, 4)
|
||||||
Me.CH_FAV.Name = "CH_FAV"
|
Me.CH_FAV.Name = "CH_FAV"
|
||||||
Me.CH_FAV.Size = New System.Drawing.Size(219, 22)
|
Me.CH_FAV.Size = New System.Drawing.Size(219, 23)
|
||||||
Me.CH_FAV.TabIndex = 1
|
Me.CH_FAV.TabIndex = 1
|
||||||
Me.CH_FAV.Text = "Favorite"
|
Me.CH_FAV.Text = "Favorite"
|
||||||
Me.CH_FAV.UseVisualStyleBackColor = True
|
Me.CH_FAV.UseVisualStyleBackColor = True
|
||||||
@@ -186,14 +241,14 @@
|
|||||||
TP_OTHER.Controls.Add(Me.CH_PARSE_USER_MEDIA, 1, 0)
|
TP_OTHER.Controls.Add(Me.CH_PARSE_USER_MEDIA, 1, 0)
|
||||||
TP_OTHER.Controls.Add(Me.CH_READY_FOR_DOWN, 0, 0)
|
TP_OTHER.Controls.Add(Me.CH_READY_FOR_DOWN, 0, 0)
|
||||||
TP_OTHER.Dock = System.Windows.Forms.DockStyle.Fill
|
TP_OTHER.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
TP_OTHER.Location = New System.Drawing.Point(1, 121)
|
TP_OTHER.Location = New System.Drawing.Point(1, 184)
|
||||||
TP_OTHER.Margin = New System.Windows.Forms.Padding(0)
|
TP_OTHER.Margin = New System.Windows.Forms.Padding(0)
|
||||||
TP_OTHER.Name = "TP_OTHER"
|
TP_OTHER.Name = "TP_OTHER"
|
||||||
TP_OTHER.RowCount = 1
|
TP_OTHER.RowCount = 1
|
||||||
TP_OTHER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
TP_OTHER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
TP_OTHER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29.0!))
|
TP_OTHER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
TP_OTHER.Size = New System.Drawing.Size(452, 30)
|
TP_OTHER.Size = New System.Drawing.Size(452, 31)
|
||||||
TP_OTHER.TabIndex = 4
|
TP_OTHER.TabIndex = 6
|
||||||
'
|
'
|
||||||
'CH_PARSE_USER_MEDIA
|
'CH_PARSE_USER_MEDIA
|
||||||
'
|
'
|
||||||
@@ -201,7 +256,7 @@
|
|||||||
Me.CH_PARSE_USER_MEDIA.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.CH_PARSE_USER_MEDIA.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.CH_PARSE_USER_MEDIA.Location = New System.Drawing.Point(229, 4)
|
Me.CH_PARSE_USER_MEDIA.Location = New System.Drawing.Point(229, 4)
|
||||||
Me.CH_PARSE_USER_MEDIA.Name = "CH_PARSE_USER_MEDIA"
|
Me.CH_PARSE_USER_MEDIA.Name = "CH_PARSE_USER_MEDIA"
|
||||||
Me.CH_PARSE_USER_MEDIA.Size = New System.Drawing.Size(219, 22)
|
Me.CH_PARSE_USER_MEDIA.Size = New System.Drawing.Size(219, 23)
|
||||||
Me.CH_PARSE_USER_MEDIA.TabIndex = 0
|
Me.CH_PARSE_USER_MEDIA.TabIndex = 0
|
||||||
Me.CH_PARSE_USER_MEDIA.Text = "Get user media only"
|
Me.CH_PARSE_USER_MEDIA.Text = "Get user media only"
|
||||||
TT_MAIN.SetToolTip(Me.CH_PARSE_USER_MEDIA, "For twitter only!" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "If checked then user media only will be downloaded." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Otherwise" &
|
TT_MAIN.SetToolTip(Me.CH_PARSE_USER_MEDIA, "For twitter only!" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "If checked then user media only will be downloaded." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Otherwise" &
|
||||||
@@ -214,7 +269,7 @@
|
|||||||
Me.CH_READY_FOR_DOWN.Dock = System.Windows.Forms.DockStyle.Fill
|
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.Location = New System.Drawing.Point(4, 4)
|
||||||
Me.CH_READY_FOR_DOWN.Name = "CH_READY_FOR_DOWN"
|
Me.CH_READY_FOR_DOWN.Name = "CH_READY_FOR_DOWN"
|
||||||
Me.CH_READY_FOR_DOWN.Size = New System.Drawing.Size(218, 22)
|
Me.CH_READY_FOR_DOWN.Size = New System.Drawing.Size(218, 23)
|
||||||
Me.CH_READY_FOR_DOWN.TabIndex = 1
|
Me.CH_READY_FOR_DOWN.TabIndex = 1
|
||||||
Me.CH_READY_FOR_DOWN.Text = "Ready for download"
|
Me.CH_READY_FOR_DOWN.Text = "Ready for download"
|
||||||
TT_MAIN.SetToolTip(Me.CH_READY_FOR_DOWN, "Can be downloaded by [Download All]")
|
TT_MAIN.SetToolTip(Me.CH_READY_FOR_DOWN, "Can be downloaded by [Download All]")
|
||||||
@@ -233,11 +288,11 @@
|
|||||||
Me.TXT_DESCR.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TXT_DESCR.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TXT_DESCR.GroupBoxed = True
|
Me.TXT_DESCR.GroupBoxed = True
|
||||||
Me.TXT_DESCR.GroupBoxText = "Description"
|
Me.TXT_DESCR.GroupBoxText = "Description"
|
||||||
Me.TXT_DESCR.Location = New System.Drawing.Point(4, 217)
|
Me.TXT_DESCR.Location = New System.Drawing.Point(4, 282)
|
||||||
Me.TXT_DESCR.Multiline = True
|
Me.TXT_DESCR.Multiline = True
|
||||||
Me.TXT_DESCR.Name = "TXT_DESCR"
|
Me.TXT_DESCR.Name = "TXT_DESCR"
|
||||||
Me.TXT_DESCR.Size = New System.Drawing.Size(446, 145)
|
Me.TXT_DESCR.Size = New System.Drawing.Size(446, 145)
|
||||||
Me.TXT_DESCR.TabIndex = 5
|
Me.TXT_DESCR.TabIndex = 9
|
||||||
'
|
'
|
||||||
'TXT_USER_FRIENDLY
|
'TXT_USER_FRIENDLY
|
||||||
'
|
'
|
||||||
@@ -258,13 +313,13 @@
|
|||||||
Me.TP_ADD_BY_LIST.Controls.Add(Me.CH_ADD_BY_LIST, 0, 0)
|
Me.TP_ADD_BY_LIST.Controls.Add(Me.CH_ADD_BY_LIST, 0, 0)
|
||||||
Me.TP_ADD_BY_LIST.Controls.Add(Me.CH_AUTO_DETECT_SITE, 1, 0)
|
Me.TP_ADD_BY_LIST.Controls.Add(Me.CH_AUTO_DETECT_SITE, 1, 0)
|
||||||
Me.TP_ADD_BY_LIST.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TP_ADD_BY_LIST.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TP_ADD_BY_LIST.Location = New System.Drawing.Point(1, 152)
|
Me.TP_ADD_BY_LIST.Location = New System.Drawing.Point(1, 216)
|
||||||
Me.TP_ADD_BY_LIST.Margin = New System.Windows.Forms.Padding(0)
|
Me.TP_ADD_BY_LIST.Margin = New System.Windows.Forms.Padding(0)
|
||||||
Me.TP_ADD_BY_LIST.Name = "TP_ADD_BY_LIST"
|
Me.TP_ADD_BY_LIST.Name = "TP_ADD_BY_LIST"
|
||||||
Me.TP_ADD_BY_LIST.RowCount = 1
|
Me.TP_ADD_BY_LIST.RowCount = 1
|
||||||
Me.TP_ADD_BY_LIST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
Me.TP_ADD_BY_LIST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
Me.TP_ADD_BY_LIST.Size = New System.Drawing.Size(452, 30)
|
Me.TP_ADD_BY_LIST.Size = New System.Drawing.Size(452, 30)
|
||||||
Me.TP_ADD_BY_LIST.TabIndex = 6
|
Me.TP_ADD_BY_LIST.TabIndex = 7
|
||||||
'
|
'
|
||||||
'CH_ADD_BY_LIST
|
'CH_ADD_BY_LIST
|
||||||
'
|
'
|
||||||
@@ -301,25 +356,84 @@
|
|||||||
Me.TXT_LABELS.CaptionText = "Labels"
|
Me.TXT_LABELS.CaptionText = "Labels"
|
||||||
Me.TXT_LABELS.CaptionWidth = 50.0R
|
Me.TXT_LABELS.CaptionWidth = 50.0R
|
||||||
Me.TXT_LABELS.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TXT_LABELS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TXT_LABELS.Location = New System.Drawing.Point(4, 186)
|
Me.TXT_LABELS.Location = New System.Drawing.Point(4, 250)
|
||||||
Me.TXT_LABELS.Name = "TXT_LABELS"
|
Me.TXT_LABELS.Name = "TXT_LABELS"
|
||||||
Me.TXT_LABELS.Size = New System.Drawing.Size(446, 22)
|
Me.TXT_LABELS.Size = New System.Drawing.Size(446, 22)
|
||||||
Me.TXT_LABELS.TabIndex = 7
|
Me.TXT_LABELS.TabIndex = 8
|
||||||
Me.TXT_LABELS.TextBoxReadOnly = True
|
Me.TXT_LABELS.TextBoxReadOnly = True
|
||||||
'
|
'
|
||||||
|
'TP_DOWN_OPTIONS
|
||||||
|
'
|
||||||
|
TP_DOWN_OPTIONS.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single]
|
||||||
|
TP_DOWN_OPTIONS.ColumnCount = 2
|
||||||
|
TP_DOWN_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_DOWN_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_DOWN_OPTIONS.Controls.Add(Me.CH_DOWN_IMAGES, 0, 0)
|
||||||
|
TP_DOWN_OPTIONS.Controls.Add(Me.CH_DOWN_VIDEOS, 1, 0)
|
||||||
|
TP_DOWN_OPTIONS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_DOWN_OPTIONS.Location = New System.Drawing.Point(1, 152)
|
||||||
|
TP_DOWN_OPTIONS.Margin = New System.Windows.Forms.Padding(0)
|
||||||
|
TP_DOWN_OPTIONS.Name = "TP_DOWN_OPTIONS"
|
||||||
|
TP_DOWN_OPTIONS.RowCount = 1
|
||||||
|
TP_DOWN_OPTIONS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_DOWN_OPTIONS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
|
TP_DOWN_OPTIONS.Size = New System.Drawing.Size(452, 31)
|
||||||
|
TP_DOWN_OPTIONS.TabIndex = 5
|
||||||
|
'
|
||||||
|
'CH_DOWN_IMAGES
|
||||||
|
'
|
||||||
|
Me.CH_DOWN_IMAGES.AutoSize = True
|
||||||
|
Me.CH_DOWN_IMAGES.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CH_DOWN_IMAGES.Location = New System.Drawing.Point(4, 4)
|
||||||
|
Me.CH_DOWN_IMAGES.Name = "CH_DOWN_IMAGES"
|
||||||
|
Me.CH_DOWN_IMAGES.Size = New System.Drawing.Size(218, 23)
|
||||||
|
Me.CH_DOWN_IMAGES.TabIndex = 0
|
||||||
|
Me.CH_DOWN_IMAGES.Text = "Download Images"
|
||||||
|
Me.CH_DOWN_IMAGES.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'CH_DOWN_VIDEOS
|
||||||
|
'
|
||||||
|
Me.CH_DOWN_VIDEOS.AutoSize = True
|
||||||
|
Me.CH_DOWN_VIDEOS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CH_DOWN_VIDEOS.Location = New System.Drawing.Point(229, 4)
|
||||||
|
Me.CH_DOWN_VIDEOS.Name = "CH_DOWN_VIDEOS"
|
||||||
|
Me.CH_DOWN_VIDEOS.Size = New System.Drawing.Size(219, 23)
|
||||||
|
Me.CH_DOWN_VIDEOS.TabIndex = 1
|
||||||
|
Me.CH_DOWN_VIDEOS.Text = "Download videos"
|
||||||
|
Me.CH_DOWN_VIDEOS.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'TXT_SPEC_FOLDER
|
||||||
|
'
|
||||||
|
ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton4.Index = 0
|
||||||
|
ActionButton4.Name = "BTT_OPEN"
|
||||||
|
ActionButton4.ToolTipText = "Select a new path in the folder selection dialog"
|
||||||
|
ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton5.Index = 1
|
||||||
|
ActionButton5.Name = "BTT_CLEAR"
|
||||||
|
ActionButton5.ToolTipText = "Clear"
|
||||||
|
Me.TXT_SPEC_FOLDER.Buttons.Add(ActionButton4)
|
||||||
|
Me.TXT_SPEC_FOLDER.Buttons.Add(ActionButton5)
|
||||||
|
Me.TXT_SPEC_FOLDER.CaptionText = "Special path"
|
||||||
|
Me.TXT_SPEC_FOLDER.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_SPEC_FOLDER.Location = New System.Drawing.Point(4, 62)
|
||||||
|
Me.TXT_SPEC_FOLDER.Name = "TXT_SPEC_FOLDER"
|
||||||
|
Me.TXT_SPEC_FOLDER.Size = New System.Drawing.Size(446, 22)
|
||||||
|
Me.TXT_SPEC_FOLDER.TabIndex = 2
|
||||||
|
'
|
||||||
'CONTAINER_MAIN
|
'CONTAINER_MAIN
|
||||||
'
|
'
|
||||||
'
|
'
|
||||||
'CONTAINER_MAIN.ContentPanel
|
'CONTAINER_MAIN.ContentPanel
|
||||||
'
|
'
|
||||||
Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN)
|
Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN)
|
||||||
Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(454, 366)
|
Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(454, 431)
|
||||||
Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False
|
Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False
|
||||||
Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0)
|
Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0)
|
||||||
Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN"
|
Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN"
|
||||||
Me.CONTAINER_MAIN.RightToolStripPanelVisible = False
|
Me.CONTAINER_MAIN.RightToolStripPanelVisible = False
|
||||||
Me.CONTAINER_MAIN.Size = New System.Drawing.Size(454, 366)
|
Me.CONTAINER_MAIN.Size = New System.Drawing.Size(454, 431)
|
||||||
Me.CONTAINER_MAIN.TabIndex = 0
|
Me.CONTAINER_MAIN.TabIndex = 0
|
||||||
Me.CONTAINER_MAIN.TopToolStripPanelVisible = False
|
Me.CONTAINER_MAIN.TopToolStripPanelVisible = False
|
||||||
'
|
'
|
||||||
@@ -327,23 +441,23 @@
|
|||||||
'
|
'
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
Me.ClientSize = New System.Drawing.Size(454, 366)
|
Me.ClientSize = New System.Drawing.Size(454, 431)
|
||||||
Me.Controls.Add(Me.CONTAINER_MAIN)
|
Me.Controls.Add(Me.CONTAINER_MAIN)
|
||||||
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
||||||
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
|
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
|
||||||
Me.KeyPreview = True
|
Me.KeyPreview = True
|
||||||
Me.MaximizeBox = False
|
Me.MaximizeBox = False
|
||||||
Me.MaximumSize = New System.Drawing.Size(470, 405)
|
Me.MaximumSize = New System.Drawing.Size(470, 470)
|
||||||
Me.MinimizeBox = False
|
Me.MinimizeBox = False
|
||||||
Me.MinimumSize = New System.Drawing.Size(470, 405)
|
Me.MinimumSize = New System.Drawing.Size(470, 470)
|
||||||
Me.Name = "UserCreatorForm"
|
Me.Name = "UserCreatorForm"
|
||||||
Me.ShowInTaskbar = False
|
Me.ShowInTaskbar = False
|
||||||
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
||||||
Me.Text = "Create User"
|
Me.Text = "Create User"
|
||||||
TP_MAIN.ResumeLayout(False)
|
TP_MAIN.ResumeLayout(False)
|
||||||
CType(Me.TXT_USER, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.TXT_USER, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
TP_SITE.ResumeLayout(False)
|
Me.TP_SITE.ResumeLayout(False)
|
||||||
TP_SITE.PerformLayout()
|
Me.TP_SITE.PerformLayout()
|
||||||
TP_PARAMS.ResumeLayout(False)
|
TP_PARAMS.ResumeLayout(False)
|
||||||
TP_PARAMS.PerformLayout()
|
TP_PARAMS.PerformLayout()
|
||||||
TP_OTHER.ResumeLayout(False)
|
TP_OTHER.ResumeLayout(False)
|
||||||
@@ -353,6 +467,9 @@
|
|||||||
Me.TP_ADD_BY_LIST.ResumeLayout(False)
|
Me.TP_ADD_BY_LIST.ResumeLayout(False)
|
||||||
Me.TP_ADD_BY_LIST.PerformLayout()
|
Me.TP_ADD_BY_LIST.PerformLayout()
|
||||||
CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
TP_DOWN_OPTIONS.ResumeLayout(False)
|
||||||
|
TP_DOWN_OPTIONS.PerformLayout()
|
||||||
|
CType(Me.TXT_SPEC_FOLDER, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False)
|
Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False)
|
||||||
Me.CONTAINER_MAIN.ResumeLayout(False)
|
Me.CONTAINER_MAIN.ResumeLayout(False)
|
||||||
Me.CONTAINER_MAIN.PerformLayout()
|
Me.CONTAINER_MAIN.PerformLayout()
|
||||||
@@ -374,5 +491,12 @@
|
|||||||
Private WithEvents CH_ADD_BY_LIST As CheckBox
|
Private WithEvents CH_ADD_BY_LIST As CheckBox
|
||||||
Private WithEvents CH_AUTO_DETECT_SITE As CheckBox
|
Private WithEvents CH_AUTO_DETECT_SITE As CheckBox
|
||||||
Private WithEvents TXT_LABELS As PersonalUtilities.Forms.Controls.TextBoxExtended
|
Private WithEvents TXT_LABELS As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
Private WithEvents CH_DOWN_IMAGES As CheckBox
|
||||||
|
Private WithEvents CH_DOWN_VIDEOS As CheckBox
|
||||||
|
Private WithEvents CH_IS_CHANNEL As CheckBox
|
||||||
|
Private WithEvents OPT_INSTAGRAM As RadioButton
|
||||||
|
Private WithEvents TXT_SPEC_FOLDER As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
Private WithEvents OPT_REDGIFS As RadioButton
|
||||||
|
Private WithEvents TP_SITE As TableLayoutPanel
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -120,9 +120,6 @@
|
|||||||
<metadata name="TP_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="TP_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="TP_SITE.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>False</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="TP_PARAMS.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="TP_PARAMS.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
@@ -161,6 +158,28 @@
|
|||||||
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="TP_DOWN_OPTIONS.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="ActionButton4.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
|
WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP
|
||||||
|
aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+
|
||||||
|
5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8
|
||||||
|
vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB
|
||||||
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton5.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
Imports System.ComponentModel
|
' 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.ComponentModel
|
||||||
Imports PersonalUtilities.Forms
|
Imports PersonalUtilities.Forms
|
||||||
Imports PersonalUtilities.Forms.Controls
|
|
||||||
Imports PersonalUtilities.Forms.Controls.Base
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
Imports PersonalUtilities.Forms.Toolbars
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Imports SCrawler.API.Base
|
Imports SCrawler.API.Base
|
||||||
Namespace Editors
|
Namespace Editors
|
||||||
Friend Class UserCreatorForm : Implements IOkCancelToolbar
|
Friend Class UserCreatorForm : Implements IOkCancelToolbar
|
||||||
@@ -26,11 +34,7 @@ Namespace Editors
|
|||||||
End Property
|
End Property
|
||||||
Friend ReadOnly Property UserMediaOnly As Boolean
|
Friend ReadOnly Property UserMediaOnly As Boolean
|
||||||
Get
|
Get
|
||||||
If User.Site = Sites.Twitter Then
|
Return CH_PARSE_USER_MEDIA.Checked
|
||||||
Return CH_PARSE_USER_MEDIA.Checked
|
|
||||||
Else
|
|
||||||
Return False
|
|
||||||
End If
|
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Friend ReadOnly Property UserReady As Boolean
|
Friend ReadOnly Property UserReady As Boolean
|
||||||
@@ -38,6 +42,16 @@ Namespace Editors
|
|||||||
Return CH_READY_FOR_DOWN.Checked
|
Return CH_READY_FOR_DOWN.Checked
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
Friend ReadOnly Property DownloadImages As Boolean
|
||||||
|
Get
|
||||||
|
Return CH_DOWN_IMAGES.Checked
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Friend ReadOnly Property DownloadVideos As Boolean
|
||||||
|
Get
|
||||||
|
Return CH_DOWN_VIDEOS.Checked
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
Friend ReadOnly Property UserDescr As String
|
Friend ReadOnly Property UserDescr As String
|
||||||
Get
|
Get
|
||||||
Return TXT_DESCR.Text
|
Return TXT_DESCR.Text
|
||||||
@@ -48,21 +62,34 @@ Namespace Editors
|
|||||||
Return TXT_USER_FRIENDLY.Text
|
Return TXT_USER_FRIENDLY.Text
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
Private ReadOnly _SpecPathPattern As RParams = RParams.DM("\w:\\.*", 0, EDP.ReturnValue)
|
||||||
|
Private ReadOnly Property SpecialPath(ByVal s As Sites) As SFile
|
||||||
|
Get
|
||||||
|
If TXT_SPEC_FOLDER.IsEmptyString Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
If Not CStr(RegexReplace(TXT_SPEC_FOLDER.Text, _SpecPathPattern)).IsEmptyString Then
|
||||||
|
Return $"{TXT_SPEC_FOLDER.Text}\"
|
||||||
|
Else
|
||||||
|
Return $"{Settings(s).Path.PathWithSeparator}{TXT_SPEC_FOLDER.Text}\"
|
||||||
|
End If
|
||||||
|
|
||||||
|
End If
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
Friend ReadOnly Property UserLabels As List(Of String)
|
Friend ReadOnly Property UserLabels As List(Of String)
|
||||||
|
''' <summary>Create new user</summary>
|
||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
InitializeComponent()
|
InitializeComponent()
|
||||||
UserLabels = New List(Of String)
|
UserLabels = New List(Of String)
|
||||||
MyDef = New DefaultFormProps(Of FieldsChecker)
|
MyDef = New DefaultFormProps(Of FieldsChecker)
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub New(ByVal _User As UserInfo)
|
''' <summary>Edit exist user</summary>
|
||||||
Me.New
|
|
||||||
User = _User
|
|
||||||
End Sub
|
|
||||||
Friend Sub New(ByVal _Instance As IUserData)
|
Friend Sub New(ByVal _Instance As IUserData)
|
||||||
Me.New
|
Me.New
|
||||||
If Not _Instance Is Nothing Then
|
If Not _Instance Is Nothing Then
|
||||||
UserInstance = _Instance
|
UserInstance = _Instance
|
||||||
User = DirectCast(UserInstance, UserDataBase).User
|
User = DirectCast(UserInstance.Self, UserDataBase).User
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub UserCreatorForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
Private Sub UserCreatorForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||||
@@ -70,39 +97,57 @@ Namespace Editors
|
|||||||
With MyDef
|
With MyDef
|
||||||
.MyViewInitialize(Me, Settings.Design, True)
|
.MyViewInitialize(Me, Settings.Design, True)
|
||||||
.AddOkCancelToolbar()
|
.AddOkCancelToolbar()
|
||||||
|
CH_AUTO_DETECT_SITE.Enabled = False
|
||||||
If User.Name.IsEmptyString Then
|
If User.Name.IsEmptyString Then
|
||||||
OPT_REDDIT.Checked = False
|
OPT_REDDIT.Checked = False
|
||||||
OPT_TWITTER.Checked = False
|
OPT_TWITTER.Checked = False
|
||||||
CH_PARSE_USER_MEDIA.Enabled = False
|
OPT_INSTAGRAM.Checked = False
|
||||||
CH_READY_FOR_DOWN.Checked = True
|
CH_READY_FOR_DOWN.Checked = True
|
||||||
CH_TEMP.Checked = Settings.DefaultTemporary.Value
|
CH_TEMP.Checked = Settings.DefaultTemporary
|
||||||
|
CH_DOWN_IMAGES.Checked = Settings.DefaultDownloadImages
|
||||||
|
CH_DOWN_VIDEOS.Checked = Settings.DefaultDownloadVideos
|
||||||
Else
|
Else
|
||||||
TP_ADD_BY_LIST.Enabled = False
|
TP_ADD_BY_LIST.Enabled = False
|
||||||
TXT_USER.Text = User.Name
|
TXT_USER.Text = User.Name
|
||||||
|
TXT_SPEC_FOLDER.Text = User.SpecialPath
|
||||||
Select Case User.Site
|
Select Case User.Site
|
||||||
Case Sites.Reddit : OPT_REDDIT.Checked = True : CH_PARSE_USER_MEDIA.Enabled = False
|
Case Sites.Reddit : OPT_REDDIT.Checked = True
|
||||||
Case Sites.Twitter : OPT_TWITTER.Checked = True
|
Case Sites.Twitter : OPT_TWITTER.Checked = True
|
||||||
|
Case Sites.Instagram : OPT_INSTAGRAM.Checked = True
|
||||||
|
Case Sites.RedGifs : OPT_REDGIFS.Checked = True
|
||||||
End Select
|
End Select
|
||||||
OPT_REDDIT.Enabled = False
|
SetParamsBySite()
|
||||||
OPT_TWITTER.Enabled = False
|
TP_SITE.Enabled = False
|
||||||
|
CH_IS_CHANNEL.Checked = User.IsChannel
|
||||||
If Not UserInstance Is Nothing Then
|
If Not UserInstance Is Nothing Then
|
||||||
TXT_USER.Enabled = False
|
TXT_USER.Enabled = False
|
||||||
|
TXT_SPEC_FOLDER.TextBoxReadOnly = True
|
||||||
|
TXT_SPEC_FOLDER.Buttons.Clear()
|
||||||
|
TXT_SPEC_FOLDER.Buttons.UpdateButtonsPositions()
|
||||||
With UserInstance
|
With UserInstance
|
||||||
TXT_USER_FRIENDLY.Text = .FriendlyName
|
TXT_USER_FRIENDLY.Text = .FriendlyName
|
||||||
CH_FAV.Checked = .Favorite
|
CH_FAV.Checked = .Favorite
|
||||||
CH_TEMP.Checked = .Temporary
|
CH_TEMP.Checked = .Temporary
|
||||||
CH_PARSE_USER_MEDIA.Checked = .ParseUserMediaOnly
|
CH_PARSE_USER_MEDIA.Checked = .ParseUserMediaOnly
|
||||||
CH_READY_FOR_DOWN.Checked = .ReadyForDownload
|
CH_READY_FOR_DOWN.Checked = .ReadyForDownload
|
||||||
|
CH_DOWN_IMAGES.Checked = .DownloadImages
|
||||||
|
CH_DOWN_VIDEOS.Checked = .DownloadVideos
|
||||||
TXT_DESCR.Text = .Description
|
TXT_DESCR.Text = .Description
|
||||||
UserLabels.ListAddList(.Labels)
|
UserLabels.ListAddList(.Labels)
|
||||||
If UserLabels.ListExists Then TXT_LABELS.Text = UserLabels.ListToString
|
If UserLabels.ListExists Then TXT_LABELS.Text = UserLabels.ListToString
|
||||||
End With
|
End With
|
||||||
|
CH_ADD_BY_LIST.Enabled = False
|
||||||
|
Else
|
||||||
|
CH_TEMP.Checked = Settings.DefaultTemporary
|
||||||
|
CH_READY_FOR_DOWN.Checked = Not Settings.DefaultTemporary
|
||||||
|
CH_DOWN_IMAGES.Checked = Settings.DefaultDownloadImages
|
||||||
|
CH_DOWN_VIDEOS.Checked = Settings.DefaultDownloadVideos
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
.MyFieldsChecker = New FieldsChecker
|
.MyFieldsChecker = New FieldsChecker
|
||||||
.MyFieldsChecker.AddControl(Of String)(TXT_USER, TXT_USER.CaptionText)
|
.MyFieldsChecker.AddControl(Of String)(TXT_USER, TXT_USER.CaptionText)
|
||||||
.MyFieldsChecker.EndLoaderOperations()
|
.MyFieldsChecker.EndLoaderOperations()
|
||||||
TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector)
|
.AppendDetectors()
|
||||||
.EndLoaderOperations()
|
.EndLoaderOperations()
|
||||||
End With
|
End With
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
@@ -117,30 +162,43 @@ Namespace Editors
|
|||||||
e.Cancel = True
|
e.Cancel = True
|
||||||
Else
|
Else
|
||||||
MyDef.Dispose()
|
MyDef.Dispose()
|
||||||
If Not DialogResult = DialogResult.OK And Not DialogResult = DialogResult.Cancel And StartIndex >= 0 Then DialogResult = DialogResult.OK
|
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub UserCreatorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
Private Sub UserCreatorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
||||||
UserLabels.Clear()
|
UserLabels.Clear()
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Function GetSiteByCheckers() As Sites
|
||||||
|
Select Case True
|
||||||
|
Case OPT_REDDIT.Checked : Return Sites.Reddit
|
||||||
|
Case OPT_TWITTER.Checked : Return Sites.Twitter
|
||||||
|
Case OPT_INSTAGRAM.Checked : Return Sites.Instagram
|
||||||
|
Case OPT_REDGIFS.Checked : Return Sites.RedGifs
|
||||||
|
Case Else : Return Sites.Undefined
|
||||||
|
End Select
|
||||||
|
End Function
|
||||||
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
||||||
If Not CH_ADD_BY_LIST.Checked Then
|
If Not CH_ADD_BY_LIST.Checked Then
|
||||||
If MyDef.MyFieldsChecker.AllParamsOK Then
|
If MyDef.MyFieldsChecker.AllParamsOK Then
|
||||||
If OPT_REDDIT.Checked Or OPT_TWITTER.Checked Then
|
Dim s As Sites = GetSiteByCheckers()
|
||||||
|
If Not s = Sites.Undefined Then
|
||||||
Dim tmpUser As UserInfo = User.Clone
|
Dim tmpUser As UserInfo = User.Clone
|
||||||
With tmpUser
|
With tmpUser
|
||||||
.Name = TXT_USER.Text
|
.Name = TXT_USER.Text
|
||||||
.Site = IIf(OPT_REDDIT.Checked, Sites.Reddit, Sites.Twitter)
|
.SpecialPath = SpecialPath(s)
|
||||||
|
.Site = s
|
||||||
|
.IsChannel = CH_IS_CHANNEL.Checked
|
||||||
.UpdateUserFile()
|
.UpdateUserFile()
|
||||||
End With
|
End With
|
||||||
User = tmpUser
|
User = tmpUser
|
||||||
If Not UserInstance Is Nothing Then
|
If Not UserInstance Is Nothing Then
|
||||||
With DirectCast(UserInstance, UserDataBase)
|
With DirectCast(UserInstance.Self, UserDataBase)
|
||||||
.User = User
|
.User = User
|
||||||
.FriendlyName = TXT_USER_FRIENDLY.Text
|
.FriendlyName = TXT_USER_FRIENDLY.Text
|
||||||
.Favorite = CH_FAV.Checked
|
.Favorite = CH_FAV.Checked
|
||||||
.Temporary = CH_TEMP.Checked
|
.Temporary = CH_TEMP.Checked
|
||||||
.ReadyForDownload = CH_READY_FOR_DOWN.Checked
|
.ReadyForDownload = CH_READY_FOR_DOWN.Checked
|
||||||
|
.DownloadImages = CH_DOWN_IMAGES.Checked
|
||||||
|
.DownloadVideos = CH_DOWN_VIDEOS.Checked
|
||||||
.UserDescription = TXT_DESCR.Text
|
.UserDescription = TXT_DESCR.Text
|
||||||
Dim l As New ListAddParams(LAP.NotContainsOnly + LAP.ClearBeforeAdd)
|
Dim l As New ListAddParams(LAP.NotContainsOnly + LAP.ClearBeforeAdd)
|
||||||
If .IsCollection Then
|
If .IsCollection Then
|
||||||
@@ -150,7 +208,7 @@ Namespace Editors
|
|||||||
Else
|
Else
|
||||||
.Labels.ListAddList(UserLabels, LAP.NotContainsOnly, LAP.ClearBeforeAdd)
|
.Labels.ListAddList(UserLabels, LAP.NotContainsOnly, LAP.ClearBeforeAdd)
|
||||||
End If
|
End If
|
||||||
If OPT_TWITTER.Checked Then .ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked
|
.ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked
|
||||||
.UpdateUserInformation()
|
.UpdateUserInformation()
|
||||||
End With
|
End With
|
||||||
End If
|
End If
|
||||||
@@ -169,75 +227,101 @@ CloseForm:
|
|||||||
Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
||||||
MyDef.CloseForm(IIf(StartIndex >= 0, DialogResult.OK, DialogResult.Cancel))
|
MyDef.CloseForm(IIf(StartIndex >= 0, DialogResult.OK, DialogResult.Cancel))
|
||||||
End Sub
|
End Sub
|
||||||
Private ReadOnly TwitterRegEx As New RegexStructure("[htps:/]{7,8}.*?twitter.com/([^/]+)", 1)
|
Private ReadOnly TwitterRegEx As RParams = RParams.DMS("[htps:/]{7,8}.*?twitter.com/([^/]+)", 1)
|
||||||
Private ReadOnly RedditRegEx1 As New RegexStructure("[htps:/]{7,8}.*?reddit.com/user/([^/]+)", 1)
|
Private ReadOnly RedditRegEx1 As RParams = RParams.DMS("[htps:/]{7,8}.*?reddit.com/user/([^/]+)", 1)
|
||||||
Private ReadOnly RedditRegEx2 As New RegexStructure(".?u/([^/]+)", 1)
|
Private ReadOnly RedditRegEx2 As RParams = RParams.DMS(".?u/([^/]+)", 1)
|
||||||
|
Private ReadOnly RedditChannelRegEx1 As RParams = RParams.DMS("[htps:/]{7,8}.*?reddit.com/r/([^/]+)", 1)
|
||||||
|
Private ReadOnly RedditChannelRegEx2 As RParams = RParams.DMS(".?r/([^/]+)", 1)
|
||||||
|
Private ReadOnly InstagramRegEx As RParams = RParams.DMS("[htps:/]{7,8}.*?instagram.com/([^/]+)", 1)
|
||||||
|
Private ReadOnly RedGifsRegEx As RParams = RParams.DMS("[htps:/]{7,8}.*?redgifs.com/users/([^/]+)", 1)
|
||||||
Private _TextChangeInvoked As Boolean = False
|
Private _TextChangeInvoked As Boolean = False
|
||||||
Private Sub TXT_USER_ActionOnTextChange() Handles TXT_USER.ActionOnTextChange
|
Private Sub TXT_USER_ActionOnTextChange() Handles TXT_USER.ActionOnTextChange
|
||||||
Try
|
Try
|
||||||
If Not _TextChangeInvoked Then
|
If Not _TextChangeInvoked Then
|
||||||
_TextChangeInvoked = True
|
_TextChangeInvoked = True
|
||||||
If Not CH_ADD_BY_LIST.Checked Then
|
If Not CH_ADD_BY_LIST.Checked Then
|
||||||
Select Case GetSiteByText(TXT_USER.Text)
|
Dim s() As Object = GetSiteByText(TXT_USER.Text)
|
||||||
|
Select Case s(0)
|
||||||
Case Sites.Twitter : OPT_TWITTER.Checked = True
|
Case Sites.Twitter : OPT_TWITTER.Checked = True
|
||||||
Case Sites.Reddit : OPT_REDDIT.Checked = True
|
Case Sites.Reddit : OPT_REDDIT.Checked = True
|
||||||
Case Else : OPT_TWITTER.Checked = False : OPT_REDDIT.Checked = False
|
Case Sites.Instagram : OPT_INSTAGRAM.Checked = True
|
||||||
|
Case Sites.RedGifs : OPT_REDGIFS.Checked = True
|
||||||
|
Case Else : OPT_TWITTER.Checked = False : OPT_REDDIT.Checked = False : OPT_INSTAGRAM.Checked = False
|
||||||
End Select
|
End Select
|
||||||
|
CH_IS_CHANNEL.Checked = CBool(s(1))
|
||||||
End If
|
End If
|
||||||
MyDef.Detector()
|
|
||||||
_TextChangeInvoked = False
|
_TextChangeInvoked = False
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Function GetSiteByText(ByRef TXT As String) As Sites
|
Private Function GetSiteByText(ByRef TXT As String) As Object()
|
||||||
If Not TXT.IsEmptyString AndAlso TXT.Length > 8 Then
|
If Not TXT.IsEmptyString AndAlso TXT.Length > 8 Then
|
||||||
Dim s$ = RegexReplace(TXT, TwitterRegEx)
|
If CheckRegex(TXT, TwitterRegEx) Then
|
||||||
If Not s.IsEmptyString Then
|
Return {Sites.Twitter, False}
|
||||||
TXT = s
|
ElseIf CheckRegex(TXT, RedditRegEx1) OrElse CheckRegex(TXT, RedditRegEx2) Then
|
||||||
Return Sites.Twitter
|
Return {Sites.Reddit, False}
|
||||||
Else
|
ElseIf CheckRegex(TXT, RedditChannelRegEx1) OrElse CheckRegex(TXT, RedditChannelRegEx2) Then
|
||||||
s = RegexReplace(TXT, RedditRegEx1)
|
Return {Sites.Reddit, True}
|
||||||
If Not s.IsEmptyString Then
|
ElseIf CheckRegex(TXT, InstagramRegEx) Then
|
||||||
TXT = s
|
Return {Sites.Instagram, False}
|
||||||
Return Sites.Reddit
|
ElseIf CheckRegex(TXT, RedGifsRegEx) Then
|
||||||
Else
|
Return {Sites.RedGifs, False}
|
||||||
s = RegexReplace(TXT, RedditRegEx2)
|
|
||||||
If Not s.IsEmptyString Then
|
|
||||||
TXT = s
|
|
||||||
Return Sites.Reddit
|
|
||||||
End If
|
|
||||||
End If
|
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
Return Sites.Undefined
|
Return {Sites.Undefined, False}
|
||||||
|
End Function
|
||||||
|
Private Function CheckRegex(ByRef TXT As String, ByVal r As RParams) As Boolean
|
||||||
|
Dim s$ = RegexReplace(TXT, r)
|
||||||
|
If Not s.IsEmptyString Then TXT = s : Return True Else Return False
|
||||||
End Function
|
End Function
|
||||||
Private Sub OPT_REDDIT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_REDDIT.CheckedChanged
|
Private Sub OPT_REDDIT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_REDDIT.CheckedChanged
|
||||||
MyDef.Detector()
|
If OPT_REDDIT.Checked Then CH_IS_CHANNEL.Enabled = True : SetParamsBySite()
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub OPT_TWITTER_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_TWITTER.CheckedChanged
|
Private Sub OPT_TWITTER_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_TWITTER.CheckedChanged
|
||||||
MyDef.Detector()
|
If OPT_TWITTER.Checked Then CH_IS_CHANNEL.Checked = False : CH_IS_CHANNEL.Enabled = False : SetParamsBySite()
|
||||||
CH_PARSE_USER_MEDIA.Enabled = OPT_TWITTER.Checked
|
End Sub
|
||||||
|
Private Sub OPT_INSTAGRAM_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_INSTAGRAM.CheckedChanged
|
||||||
|
If OPT_INSTAGRAM.Checked Then CH_IS_CHANNEL.Checked = False : CH_IS_CHANNEL.Enabled = False : SetParamsBySite()
|
||||||
|
End Sub
|
||||||
|
Private Sub OPT_REDGIFS_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_REDGIFS.CheckedChanged
|
||||||
|
If OPT_REDGIFS.Checked Then CH_IS_CHANNEL.Checked = False : CH_IS_CHANNEL.Enabled = False : SetParamsBySite()
|
||||||
|
End Sub
|
||||||
|
Private Sub TXT_SPEC_FOLDER_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_SPEC_FOLDER.ActionOnButtonClick
|
||||||
|
If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then
|
||||||
|
Dim f As SFile = Nothing
|
||||||
|
If Not TXT_SPEC_FOLDER.Text.IsEmptyString Then f = $"{TXT_SPEC_FOLDER.Text}\"
|
||||||
|
f = SFile.SelectPath(f, True)
|
||||||
|
If Not f.IsEmptyString Then TXT_SPEC_FOLDER.Text = f.PathWithSeparator
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub CH_TEMP_CheckedChanged(sender As Object, e As EventArgs) Handles CH_TEMP.CheckedChanged
|
Private Sub CH_TEMP_CheckedChanged(sender As Object, e As EventArgs) Handles CH_TEMP.CheckedChanged
|
||||||
If CH_TEMP.Checked Then CH_FAV.Checked = False
|
If CH_TEMP.Checked Then CH_FAV.Checked = False : CH_READY_FOR_DOWN.Checked = False
|
||||||
MyDef.Detector()
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub CH_FAV_CheckedChanged(sender As Object, e As EventArgs) Handles CH_FAV.CheckedChanged
|
Private Sub CH_FAV_CheckedChanged(sender As Object, e As EventArgs) Handles CH_FAV.CheckedChanged
|
||||||
If CH_FAV.Checked Then CH_TEMP.Checked = False
|
If CH_FAV.Checked Then CH_TEMP.Checked = False
|
||||||
MyDef.Detector()
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub CH_READY_FOR_DOWN_CheckedChanged(sender As Object, e As EventArgs) Handles CH_READY_FOR_DOWN.CheckedChanged
|
Private Sub SetParamsBySite()
|
||||||
MyDef.Detector()
|
Dim s As Sites = GetSiteByCheckers()
|
||||||
End Sub
|
If Not s = Sites.Undefined Then
|
||||||
Private Sub CH_PARSE_USER_MADIA_CheckedChanged(sender As Object, e As EventArgs) Handles CH_PARSE_USER_MEDIA.CheckedChanged
|
With Settings(s)
|
||||||
MyDef.Detector()
|
CH_TEMP.Checked = .Temporary
|
||||||
|
CH_DOWN_IMAGES.Checked = .DownloadImages
|
||||||
|
CH_DOWN_VIDEOS.Checked = .DownloadVideos
|
||||||
|
CH_PARSE_USER_MEDIA.Checked = .GetUserMediaOnly.Value
|
||||||
|
CH_READY_FOR_DOWN.Checked = Not CH_TEMP.Checked
|
||||||
|
End With
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub CH_ADD_BY_LIST_CheckedChanged(sender As Object, e As EventArgs) Handles CH_ADD_BY_LIST.CheckedChanged
|
Private Sub CH_ADD_BY_LIST_CheckedChanged(sender As Object, e As EventArgs) Handles CH_ADD_BY_LIST.CheckedChanged
|
||||||
If CH_ADD_BY_LIST.Checked Then
|
If CH_ADD_BY_LIST.Checked Then
|
||||||
TXT_DESCR.GroupBoxText = "Users list"
|
TXT_DESCR.GroupBoxText = "Users list"
|
||||||
|
CH_AUTO_DETECT_SITE.Enabled = True
|
||||||
Else
|
Else
|
||||||
TXT_DESCR.GroupBoxText = "Description"
|
TXT_DESCR.GroupBoxText = "Description"
|
||||||
|
CH_AUTO_DETECT_SITE.Checked = False
|
||||||
|
CH_AUTO_DETECT_SITE.Enabled = False
|
||||||
|
SetParamsBySite()
|
||||||
End If
|
End If
|
||||||
TXT_USER.Enabled = Not CH_ADD_BY_LIST.Checked
|
TXT_USER.Enabled = Not CH_ADD_BY_LIST.Checked
|
||||||
TXT_USER_FRIENDLY.Enabled = Not CH_ADD_BY_LIST.Checked
|
TXT_USER_FRIENDLY.Enabled = Not CH_ADD_BY_LIST.Checked
|
||||||
@@ -245,6 +329,8 @@ CloseForm:
|
|||||||
Private Sub CH_AUTO_DETECT_SITE_CheckedChanged(sender As Object, e As EventArgs) Handles CH_AUTO_DETECT_SITE.CheckedChanged
|
Private Sub CH_AUTO_DETECT_SITE_CheckedChanged(sender As Object, e As EventArgs) Handles CH_AUTO_DETECT_SITE.CheckedChanged
|
||||||
OPT_REDDIT.Enabled = Not CH_AUTO_DETECT_SITE.Checked
|
OPT_REDDIT.Enabled = Not CH_AUTO_DETECT_SITE.Checked
|
||||||
OPT_TWITTER.Enabled = Not CH_AUTO_DETECT_SITE.Checked
|
OPT_TWITTER.Enabled = Not CH_AUTO_DETECT_SITE.Checked
|
||||||
|
OPT_INSTAGRAM.Enabled = Not CH_AUTO_DETECT_SITE.Checked
|
||||||
|
CH_IS_CHANNEL.Enabled = Not CH_AUTO_DETECT_SITE.Checked
|
||||||
End Sub
|
End Sub
|
||||||
Private Function CreateUsersByList() As Boolean
|
Private Function CreateUsersByList() As Boolean
|
||||||
Try
|
Try
|
||||||
@@ -257,23 +343,25 @@ CloseForm:
|
|||||||
Dim BannedUsers() As String = Nothing
|
Dim BannedUsers() As String = Nothing
|
||||||
Dim uu$
|
Dim uu$
|
||||||
Dim tmpUser As UserInfo
|
Dim tmpUser As UserInfo
|
||||||
Dim s As Sites
|
Dim s As Sites = GetSiteByCheckers()
|
||||||
|
Dim sObj() As Object
|
||||||
|
Dim _IsChannel As Boolean = CH_IS_CHANNEL.Checked
|
||||||
Dim Added% = 0
|
Dim Added% = 0
|
||||||
Dim Skipped% = 0
|
Dim Skipped% = 0
|
||||||
Dim uid%
|
Dim uid%
|
||||||
|
Dim sf As Func(Of Sites, String) = Function(__s) SpecialPath(__s).PathWithSeparator
|
||||||
Select Case True
|
Dim __sf As Func(Of String, Sites, SFile) = Function(Input, __s) IIf(sf(__s).IsEmptyString, Nothing, New SFile($"{sf(__s)}{Input}\"))
|
||||||
Case OPT_REDDIT.Checked : s = Sites.Reddit
|
|
||||||
Case OPT_TWITTER.Checked : s = Sites.Twitter
|
|
||||||
Case Else : s = Sites.Undefined
|
|
||||||
End Select
|
|
||||||
|
|
||||||
For i% = 0 To u.Count - 1
|
For i% = 0 To u.Count - 1
|
||||||
uu = u(i)
|
uu = u(i)
|
||||||
If CH_AUTO_DETECT_SITE.Checked Then s = GetSiteByText(uu)
|
If CH_AUTO_DETECT_SITE.Checked Then
|
||||||
|
sObj = GetSiteByText(uu)
|
||||||
|
s = sObj(0)
|
||||||
|
_IsChannel = CBool(sObj(1))
|
||||||
|
End If
|
||||||
|
|
||||||
If Not s = Sites.Undefined Then
|
If Not s = Sites.Undefined Then
|
||||||
tmpUser = New UserInfo(uu, s)
|
tmpUser = New UserInfo(uu, s,,, __sf(uu, s)) With {.IsChannel = _IsChannel}
|
||||||
uid = -1
|
uid = -1
|
||||||
If Settings.UsersList.Count > 0 Then uid = Settings.UsersList.IndexOf(tmpUser)
|
If Settings.UsersList.Count > 0 Then uid = Settings.UsersList.IndexOf(tmpUser)
|
||||||
If uid < 0 And Not UsersForCreate.Contains(tmpUser) Then
|
If uid < 0 And Not UsersForCreate.Contains(tmpUser) Then
|
||||||
@@ -299,8 +387,10 @@ CloseForm:
|
|||||||
.Favorite = CH_FAV.Checked
|
.Favorite = CH_FAV.Checked
|
||||||
.Temporary = CH_TEMP.Checked
|
.Temporary = CH_TEMP.Checked
|
||||||
.ReadyForDownload = CH_READY_FOR_DOWN.Checked
|
.ReadyForDownload = CH_READY_FOR_DOWN.Checked
|
||||||
|
.DownloadImages = CH_DOWN_IMAGES.Checked
|
||||||
|
.DownloadVideos = CH_DOWN_VIDEOS.Checked
|
||||||
.Labels.ListAddList(UserLabels)
|
.Labels.ListAddList(UserLabels)
|
||||||
If s = Sites.Twitter Then .ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked
|
.ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked
|
||||||
.UpdateUserInformation()
|
.UpdateUserInformation()
|
||||||
End With
|
End With
|
||||||
Added += 1
|
Added += 1
|
||||||
@@ -322,6 +412,7 @@ CloseForm:
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
MsgBoxE(m)
|
MsgBoxE(m)
|
||||||
|
If Added > 0 Then MyDef.ChangesDetected = False
|
||||||
Return Added > 0 And Not BannedUsers.ListExists And NonIdentified.Count = 0
|
Return Added > 0 And Not BannedUsers.ListExists And NonIdentified.Count = 0
|
||||||
Else
|
Else
|
||||||
MsgBoxE("No one user can not recognized", MsgBoxStyle.Exclamation)
|
MsgBoxE("No one user can not recognized", MsgBoxStyle.Exclamation)
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
Imports PersonalUtilities.Tools
|
' 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.Tools
|
||||||
Friend Class LabelsKeeper : Implements ICollection(Of String), IMyEnumerator(Of String), IDisposable
|
Friend Class LabelsKeeper : Implements ICollection(Of String), IMyEnumerator(Of String), IDisposable
|
||||||
Friend Event NewLabelAdded()
|
Friend Event NewLabelAdded()
|
||||||
Friend Const NoLabeledName As String = "No Label"
|
Friend Const NoLabeledName As String = "No Label"
|
||||||
|
|||||||
358
SCrawler/MainFrame.Designer.vb
generated
@@ -1,8 +1,5 @@
|
|||||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||||
Partial Class MainFrame
|
Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||||
Inherits System.Windows.Forms.Form
|
|
||||||
|
|
||||||
'Form overrides dispose to clean up the component list.
|
|
||||||
<System.Diagnostics.DebuggerNonUserCode()>
|
<System.Diagnostics.DebuggerNonUserCode()>
|
||||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||||
Try
|
Try
|
||||||
@@ -13,13 +10,7 @@ Partial Class MainFrame
|
|||||||
MyBase.Dispose(disposing)
|
MyBase.Dispose(disposing)
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
'Required by the Windows Form Designer
|
|
||||||
Private components As System.ComponentModel.IContainer
|
Private components As System.ComponentModel.IContainer
|
||||||
|
|
||||||
'NOTE: The following procedure is required by the Windows Form Designer
|
|
||||||
'It can be modified using the Windows Form Designer.
|
|
||||||
'Do not modify it using the code editor.
|
|
||||||
<System.Diagnostics.DebuggerStepThrough()>
|
<System.Diagnostics.DebuggerStepThrough()>
|
||||||
Private Sub InitializeComponent()
|
Private Sub InitializeComponent()
|
||||||
Me.components = New System.ComponentModel.Container()
|
Me.components = New System.ComponentModel.Container()
|
||||||
@@ -27,7 +18,6 @@ Partial Class MainFrame
|
|||||||
Dim SEP_2 As System.Windows.Forms.ToolStripSeparator
|
Dim SEP_2 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim CONTEXT_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
Dim CONTEXT_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim MENU_SETTINGS As System.Windows.Forms.ToolStripDropDownButton
|
Dim MENU_SETTINGS As System.Windows.Forms.ToolStripDropDownButton
|
||||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainFrame))
|
|
||||||
Dim MENU_SETTINGS_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
Dim MENU_SETTINGS_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim SEP_3 As System.Windows.Forms.ToolStripSeparator
|
Dim SEP_3 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim CONTEXT_SEP_2 As System.Windows.Forms.ToolStripSeparator
|
Dim CONTEXT_SEP_2 As System.Windows.Forms.ToolStripSeparator
|
||||||
@@ -36,9 +26,14 @@ Partial Class MainFrame
|
|||||||
Dim CONTEXT_SEP_5 As System.Windows.Forms.ToolStripSeparator
|
Dim CONTEXT_SEP_5 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim SEP_4 As System.Windows.Forms.ToolStripSeparator
|
Dim SEP_4 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim MENU_VIEW_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
Dim MENU_VIEW_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Dim MENU_VIEW_SEP_3 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim MENU_VIEW_SEP_2 As System.Windows.Forms.ToolStripSeparator
|
Dim MENU_VIEW_SEP_2 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Dim TRAY_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainFrame))
|
||||||
Me.BTT_SETTINGS_REDDIT = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_SETTINGS_REDDIT = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_SETTINGS_TWITTER = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_SETTINGS_TWITTER = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_SETTINGS_INSTAGRAM = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_SETTINGS_REDGIFS = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_SETTINGS = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_SETTINGS = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.Toolbar_TOP = New System.Windows.Forms.ToolStrip()
|
Me.Toolbar_TOP = New System.Windows.Forms.ToolStrip()
|
||||||
Me.BTT_ADD_USER = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_ADD_USER = New System.Windows.Forms.ToolStripButton()
|
||||||
@@ -47,6 +42,7 @@ Partial Class MainFrame
|
|||||||
Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_SHOW_INFO = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_SHOW_INFO = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_CHANNELS = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_CHANNELS = New System.Windows.Forms.ToolStripButton()
|
||||||
|
Me.BTT_DOWN_SAVED = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_DOWN_SELECTED = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_DOWN_SELECTED = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_DOWN_VIDEO = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_DOWN_VIDEO = New System.Windows.Forms.ToolStripButton()
|
||||||
@@ -55,6 +51,8 @@ Partial Class MainFrame
|
|||||||
Me.BTT_VIEW_LARGE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_VIEW_LARGE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_VIEW_SMALL = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_VIEW_SMALL = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_VIEW_LIST = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_VIEW_LIST = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_SITE_ALL = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_SITE_SPECIFIC = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_SHOW_ALL = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_SHOW_ALL = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_SHOW_REGULAR = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_SHOW_REGULAR = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_SHOW_TEMP = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_SHOW_TEMP = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
@@ -64,25 +62,35 @@ Partial Class MainFrame
|
|||||||
Me.BTT_SELECT_LABELS = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_SELECT_LABELS = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_LOG = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_LOG = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_VERSION_INFO = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_VERSION_INFO = New System.Windows.Forms.ToolStripButton()
|
||||||
|
Me.BTT_DONATE = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.Toolbar_BOTTOM = New System.Windows.Forms.StatusStrip()
|
Me.Toolbar_BOTTOM = New System.Windows.Forms.StatusStrip()
|
||||||
Me.PR_MAIN = New System.Windows.Forms.ToolStripProgressBar()
|
Me.PR_MAIN = New System.Windows.Forms.ToolStripProgressBar()
|
||||||
Me.LBL_JOBS_COUNT = New System.Windows.Forms.ToolStripStatusLabel()
|
Me.LBL_JOBS_COUNT = New System.Windows.Forms.ToolStripStatusLabel()
|
||||||
Me.LBL_STATUS = New System.Windows.Forms.ToolStripStatusLabel()
|
Me.LBL_STATUS = New System.Windows.Forms.ToolStripStatusLabel()
|
||||||
|
Me.PR_INST = New System.Windows.Forms.ToolStripProgressBar()
|
||||||
|
Me.LBL_JOBS_INST_COUNT = New System.Windows.Forms.ToolStripStatusLabel()
|
||||||
|
Me.LBL_STATUS_INST = New System.Windows.Forms.ToolStripStatusLabel()
|
||||||
Me.LIST_PROFILES = New System.Windows.Forms.ListView()
|
Me.LIST_PROFILES = New System.Windows.Forms.ListView()
|
||||||
Me.USER_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
Me.USER_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
||||||
Me.BTT_CONTEXT_DOWN = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_DOWN = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_CONTEXT_DOWN_LIMITED = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_EDIT = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_EDIT = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_DELETE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_DELETE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_TEMP = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_TEMP = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_CONTEXT_READY = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_GROUPS = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_GROUPS = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_ADD_TO_COL = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_ADD_TO_COL = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_COL_MERGE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_COL_MERGE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_CONTEXT_CHANGE_FOLDER = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CHANGE_IMAGE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CHANGE_IMAGE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_OPEN_PATH = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_OPEN_PATH = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_OPEN_SITE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_OPEN_SITE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_INFO = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_INFO = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_DOWN_LIMITED = New System.Windows.Forms.ToolStripMenuItem()
|
Me.TrayIcon = New System.Windows.Forms.NotifyIcon(Me.components)
|
||||||
|
Me.TRAY_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
||||||
|
Me.BTT_TRAY_SHOW_HIDE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_TRAY_CLOSE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
@@ -95,10 +103,13 @@ Partial Class MainFrame
|
|||||||
CONTEXT_SEP_5 = New System.Windows.Forms.ToolStripSeparator()
|
CONTEXT_SEP_5 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
SEP_4 = New System.Windows.Forms.ToolStripSeparator()
|
SEP_4 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
MENU_VIEW_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
MENU_VIEW_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
|
MENU_VIEW_SEP_3 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
MENU_VIEW_SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
MENU_VIEW_SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
|
TRAY_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.Toolbar_TOP.SuspendLayout()
|
Me.Toolbar_TOP.SuspendLayout()
|
||||||
Me.Toolbar_BOTTOM.SuspendLayout()
|
Me.Toolbar_BOTTOM.SuspendLayout()
|
||||||
Me.USER_CONTEXT.SuspendLayout()
|
Me.USER_CONTEXT.SuspendLayout()
|
||||||
|
Me.TRAY_CONTEXT.SuspendLayout()
|
||||||
Me.SuspendLayout()
|
Me.SuspendLayout()
|
||||||
'
|
'
|
||||||
'SEP_1
|
'SEP_1
|
||||||
@@ -114,14 +125,12 @@ Partial Class MainFrame
|
|||||||
'CONTEXT_SEP_1
|
'CONTEXT_SEP_1
|
||||||
'
|
'
|
||||||
CONTEXT_SEP_1.Name = "CONTEXT_SEP_1"
|
CONTEXT_SEP_1.Name = "CONTEXT_SEP_1"
|
||||||
CONTEXT_SEP_1.Size = New System.Drawing.Size(192, 6)
|
CONTEXT_SEP_1.Size = New System.Drawing.Size(218, 6)
|
||||||
'
|
'
|
||||||
'MENU_SETTINGS
|
'MENU_SETTINGS
|
||||||
'
|
'
|
||||||
MENU_SETTINGS.AutoToolTip = False
|
MENU_SETTINGS.AutoToolTip = False
|
||||||
MENU_SETTINGS.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
|
MENU_SETTINGS.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_SETTINGS_REDDIT, Me.BTT_SETTINGS_TWITTER, Me.BTT_SETTINGS_INSTAGRAM, Me.BTT_SETTINGS_REDGIFS, MENU_SETTINGS_SEP_1, Me.BTT_SETTINGS})
|
||||||
MENU_SETTINGS.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_SETTINGS_REDDIT, Me.BTT_SETTINGS_TWITTER, MENU_SETTINGS_SEP_1, Me.BTT_SETTINGS})
|
|
||||||
MENU_SETTINGS.Image = CType(resources.GetObject("MENU_SETTINGS.Image"), System.Drawing.Image)
|
|
||||||
MENU_SETTINGS.ImageTransparentColor = System.Drawing.Color.Magenta
|
MENU_SETTINGS.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
MENU_SETTINGS.Name = "MENU_SETTINGS"
|
MENU_SETTINGS.Name = "MENU_SETTINGS"
|
||||||
MENU_SETTINGS.Size = New System.Drawing.Size(62, 22)
|
MENU_SETTINGS.Size = New System.Drawing.Size(62, 22)
|
||||||
@@ -129,25 +138,41 @@ Partial Class MainFrame
|
|||||||
'
|
'
|
||||||
'BTT_SETTINGS_REDDIT
|
'BTT_SETTINGS_REDDIT
|
||||||
'
|
'
|
||||||
|
Me.BTT_SETTINGS_REDDIT.Image = Global.SCrawler.My.Resources.Resources.RedditPic512
|
||||||
Me.BTT_SETTINGS_REDDIT.Name = "BTT_SETTINGS_REDDIT"
|
Me.BTT_SETTINGS_REDDIT.Name = "BTT_SETTINGS_REDDIT"
|
||||||
Me.BTT_SETTINGS_REDDIT.Size = New System.Drawing.Size(116, 22)
|
Me.BTT_SETTINGS_REDDIT.Size = New System.Drawing.Size(127, 22)
|
||||||
Me.BTT_SETTINGS_REDDIT.Text = "Reddit"
|
Me.BTT_SETTINGS_REDDIT.Text = "Reddit"
|
||||||
'
|
'
|
||||||
'BTT_SETTINGS_TWITTER
|
'BTT_SETTINGS_TWITTER
|
||||||
'
|
'
|
||||||
|
Me.BTT_SETTINGS_TWITTER.Image = Global.SCrawler.My.Resources.Resources.TwitterPic400
|
||||||
Me.BTT_SETTINGS_TWITTER.Name = "BTT_SETTINGS_TWITTER"
|
Me.BTT_SETTINGS_TWITTER.Name = "BTT_SETTINGS_TWITTER"
|
||||||
Me.BTT_SETTINGS_TWITTER.Size = New System.Drawing.Size(116, 22)
|
Me.BTT_SETTINGS_TWITTER.Size = New System.Drawing.Size(127, 22)
|
||||||
Me.BTT_SETTINGS_TWITTER.Text = "Twitter"
|
Me.BTT_SETTINGS_TWITTER.Text = "Twitter"
|
||||||
'
|
'
|
||||||
|
'BTT_SETTINGS_INSTAGRAM
|
||||||
|
'
|
||||||
|
Me.BTT_SETTINGS_INSTAGRAM.Image = Global.SCrawler.My.Resources.Resources.InstagramPic76
|
||||||
|
Me.BTT_SETTINGS_INSTAGRAM.Name = "BTT_SETTINGS_INSTAGRAM"
|
||||||
|
Me.BTT_SETTINGS_INSTAGRAM.Size = New System.Drawing.Size(127, 22)
|
||||||
|
Me.BTT_SETTINGS_INSTAGRAM.Text = "Instagram"
|
||||||
|
'
|
||||||
|
'BTT_SETTINGS_REDGIFS
|
||||||
|
'
|
||||||
|
Me.BTT_SETTINGS_REDGIFS.Name = "BTT_SETTINGS_REDGIFS"
|
||||||
|
Me.BTT_SETTINGS_REDGIFS.Size = New System.Drawing.Size(127, 22)
|
||||||
|
Me.BTT_SETTINGS_REDGIFS.Text = "RedGifs"
|
||||||
|
'
|
||||||
'MENU_SETTINGS_SEP_1
|
'MENU_SETTINGS_SEP_1
|
||||||
'
|
'
|
||||||
MENU_SETTINGS_SEP_1.Name = "MENU_SETTINGS_SEP_1"
|
MENU_SETTINGS_SEP_1.Name = "MENU_SETTINGS_SEP_1"
|
||||||
MENU_SETTINGS_SEP_1.Size = New System.Drawing.Size(113, 6)
|
MENU_SETTINGS_SEP_1.Size = New System.Drawing.Size(124, 6)
|
||||||
'
|
'
|
||||||
'BTT_SETTINGS
|
'BTT_SETTINGS
|
||||||
'
|
'
|
||||||
|
Me.BTT_SETTINGS.Image = Global.SCrawler.My.Resources.Resources.SettingsPic_16
|
||||||
Me.BTT_SETTINGS.Name = "BTT_SETTINGS"
|
Me.BTT_SETTINGS.Name = "BTT_SETTINGS"
|
||||||
Me.BTT_SETTINGS.Size = New System.Drawing.Size(116, 22)
|
Me.BTT_SETTINGS.Size = New System.Drawing.Size(127, 22)
|
||||||
Me.BTT_SETTINGS.Text = "Settings"
|
Me.BTT_SETTINGS.Text = "Settings"
|
||||||
'
|
'
|
||||||
'SEP_3
|
'SEP_3
|
||||||
@@ -158,22 +183,22 @@ Partial Class MainFrame
|
|||||||
'CONTEXT_SEP_2
|
'CONTEXT_SEP_2
|
||||||
'
|
'
|
||||||
CONTEXT_SEP_2.Name = "CONTEXT_SEP_2"
|
CONTEXT_SEP_2.Name = "CONTEXT_SEP_2"
|
||||||
CONTEXT_SEP_2.Size = New System.Drawing.Size(192, 6)
|
CONTEXT_SEP_2.Size = New System.Drawing.Size(218, 6)
|
||||||
'
|
'
|
||||||
'CONTEXT_SEP_3
|
'CONTEXT_SEP_3
|
||||||
'
|
'
|
||||||
CONTEXT_SEP_3.Name = "CONTEXT_SEP_3"
|
CONTEXT_SEP_3.Name = "CONTEXT_SEP_3"
|
||||||
CONTEXT_SEP_3.Size = New System.Drawing.Size(192, 6)
|
CONTEXT_SEP_3.Size = New System.Drawing.Size(218, 6)
|
||||||
'
|
'
|
||||||
'CONTEXT_SEP_4
|
'CONTEXT_SEP_4
|
||||||
'
|
'
|
||||||
CONTEXT_SEP_4.Name = "CONTEXT_SEP_4"
|
CONTEXT_SEP_4.Name = "CONTEXT_SEP_4"
|
||||||
CONTEXT_SEP_4.Size = New System.Drawing.Size(192, 6)
|
CONTEXT_SEP_4.Size = New System.Drawing.Size(218, 6)
|
||||||
'
|
'
|
||||||
'CONTEXT_SEP_5
|
'CONTEXT_SEP_5
|
||||||
'
|
'
|
||||||
CONTEXT_SEP_5.Name = "CONTEXT_SEP_5"
|
CONTEXT_SEP_5.Name = "CONTEXT_SEP_5"
|
||||||
CONTEXT_SEP_5.Size = New System.Drawing.Size(192, 6)
|
CONTEXT_SEP_5.Size = New System.Drawing.Size(218, 6)
|
||||||
'
|
'
|
||||||
'SEP_4
|
'SEP_4
|
||||||
'
|
'
|
||||||
@@ -185,15 +210,25 @@ Partial Class MainFrame
|
|||||||
MENU_VIEW_SEP_1.Name = "MENU_VIEW_SEP_1"
|
MENU_VIEW_SEP_1.Name = "MENU_VIEW_SEP_1"
|
||||||
MENU_VIEW_SEP_1.Size = New System.Drawing.Size(141, 6)
|
MENU_VIEW_SEP_1.Size = New System.Drawing.Size(141, 6)
|
||||||
'
|
'
|
||||||
|
'MENU_VIEW_SEP_3
|
||||||
|
'
|
||||||
|
MENU_VIEW_SEP_3.Name = "MENU_VIEW_SEP_3"
|
||||||
|
MENU_VIEW_SEP_3.Size = New System.Drawing.Size(141, 6)
|
||||||
|
'
|
||||||
'MENU_VIEW_SEP_2
|
'MENU_VIEW_SEP_2
|
||||||
'
|
'
|
||||||
MENU_VIEW_SEP_2.Name = "MENU_VIEW_SEP_2"
|
MENU_VIEW_SEP_2.Name = "MENU_VIEW_SEP_2"
|
||||||
MENU_VIEW_SEP_2.Size = New System.Drawing.Size(141, 6)
|
MENU_VIEW_SEP_2.Size = New System.Drawing.Size(141, 6)
|
||||||
'
|
'
|
||||||
|
'TRAY_SEP_1
|
||||||
|
'
|
||||||
|
TRAY_SEP_1.Name = "TRAY_SEP_1"
|
||||||
|
TRAY_SEP_1.Size = New System.Drawing.Size(130, 6)
|
||||||
|
'
|
||||||
'Toolbar_TOP
|
'Toolbar_TOP
|
||||||
'
|
'
|
||||||
Me.Toolbar_TOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
|
Me.Toolbar_TOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
|
||||||
Me.Toolbar_TOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {MENU_SETTINGS, SEP_1, Me.BTT_ADD_USER, Me.BTT_EDIT_USER, Me.BTT_DELETE_USER, Me.BTT_REFRESH, Me.BTT_SHOW_INFO, Me.BTT_CHANNELS, SEP_2, Me.BTT_DOWN_SELECTED, Me.BTT_DOWN_ALL, Me.BTT_DOWN_VIDEO, Me.BTT_DOWN_STOP, SEP_3, Me.MENU_VIEW, SEP_4, Me.BTT_LOG, Me.BTT_VERSION_INFO})
|
Me.Toolbar_TOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {MENU_SETTINGS, SEP_1, Me.BTT_ADD_USER, Me.BTT_EDIT_USER, Me.BTT_DELETE_USER, Me.BTT_REFRESH, Me.BTT_SHOW_INFO, Me.BTT_CHANNELS, Me.BTT_DOWN_SAVED, SEP_2, Me.BTT_DOWN_SELECTED, Me.BTT_DOWN_ALL, Me.BTT_DOWN_VIDEO, Me.BTT_DOWN_STOP, SEP_3, Me.MENU_VIEW, SEP_4, Me.BTT_LOG, Me.BTT_VERSION_INFO, Me.BTT_DONATE})
|
||||||
Me.Toolbar_TOP.Location = New System.Drawing.Point(0, 0)
|
Me.Toolbar_TOP.Location = New System.Drawing.Point(0, 0)
|
||||||
Me.Toolbar_TOP.Name = "Toolbar_TOP"
|
Me.Toolbar_TOP.Name = "Toolbar_TOP"
|
||||||
Me.Toolbar_TOP.Size = New System.Drawing.Size(934, 25)
|
Me.Toolbar_TOP.Size = New System.Drawing.Size(934, 25)
|
||||||
@@ -246,12 +281,22 @@ Partial Class MainFrame
|
|||||||
'
|
'
|
||||||
'BTT_CHANNELS
|
'BTT_CHANNELS
|
||||||
'
|
'
|
||||||
|
Me.BTT_CHANNELS.AutoToolTip = False
|
||||||
Me.BTT_CHANNELS.Image = Global.SCrawler.My.Resources.Resources.RedditPic512
|
Me.BTT_CHANNELS.Image = Global.SCrawler.My.Resources.Resources.RedditPic512
|
||||||
Me.BTT_CHANNELS.ImageTransparentColor = System.Drawing.Color.Magenta
|
Me.BTT_CHANNELS.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
Me.BTT_CHANNELS.Name = "BTT_CHANNELS"
|
Me.BTT_CHANNELS.Name = "BTT_CHANNELS"
|
||||||
Me.BTT_CHANNELS.Size = New System.Drawing.Size(76, 22)
|
Me.BTT_CHANNELS.Size = New System.Drawing.Size(76, 22)
|
||||||
Me.BTT_CHANNELS.Text = "Channels"
|
Me.BTT_CHANNELS.Text = "Channels"
|
||||||
'
|
'
|
||||||
|
'BTT_DOWN_SAVED
|
||||||
|
'
|
||||||
|
Me.BTT_DOWN_SAVED.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
|
||||||
|
Me.BTT_DOWN_SAVED.Image = Global.SCrawler.My.Resources.Resources.BookmarkBlack_16
|
||||||
|
Me.BTT_DOWN_SAVED.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
|
Me.BTT_DOWN_SAVED.Name = "BTT_DOWN_SAVED"
|
||||||
|
Me.BTT_DOWN_SAVED.Size = New System.Drawing.Size(23, 22)
|
||||||
|
Me.BTT_DOWN_SAVED.ToolTipText = "Download Reddit saved posts"
|
||||||
|
'
|
||||||
'BTT_DOWN_SELECTED
|
'BTT_DOWN_SELECTED
|
||||||
'
|
'
|
||||||
Me.BTT_DOWN_SELECTED.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
Me.BTT_DOWN_SELECTED.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||||
@@ -294,11 +339,11 @@ Partial Class MainFrame
|
|||||||
'
|
'
|
||||||
Me.MENU_VIEW.AutoToolTip = False
|
Me.MENU_VIEW.AutoToolTip = False
|
||||||
Me.MENU_VIEW.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
|
Me.MENU_VIEW.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
|
||||||
Me.MENU_VIEW.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_VIEW_LARGE, Me.BTT_VIEW_SMALL, Me.BTT_VIEW_LIST, MENU_VIEW_SEP_1, Me.BTT_SHOW_ALL, Me.BTT_SHOW_REGULAR, Me.BTT_SHOW_TEMP, Me.BTT_SHOW_FAV, Me.BTT_SHOW_LABELS, Me.BTT_SHOW_NO_LABELS, MENU_VIEW_SEP_2, Me.BTT_SELECT_LABELS})
|
Me.MENU_VIEW.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_VIEW_LARGE, Me.BTT_VIEW_SMALL, Me.BTT_VIEW_LIST, MENU_VIEW_SEP_1, Me.BTT_SITE_ALL, Me.BTT_SITE_SPECIFIC, MENU_VIEW_SEP_2, Me.BTT_SHOW_ALL, Me.BTT_SHOW_REGULAR, Me.BTT_SHOW_TEMP, Me.BTT_SHOW_FAV, Me.BTT_SHOW_LABELS, Me.BTT_SHOW_NO_LABELS, MENU_VIEW_SEP_3, Me.BTT_SELECT_LABELS})
|
||||||
Me.MENU_VIEW.Image = CType(resources.GetObject("MENU_VIEW.Image"), System.Drawing.Image)
|
Me.MENU_VIEW.Image = CType(resources.GetObject("MENU_VIEW.Image"), System.Drawing.Image)
|
||||||
Me.MENU_VIEW.ImageTransparentColor = System.Drawing.Color.Magenta
|
Me.MENU_VIEW.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
Me.MENU_VIEW.Name = "MENU_VIEW"
|
Me.MENU_VIEW.Name = "MENU_VIEW"
|
||||||
Me.MENU_VIEW.Size = New System.Drawing.Size(45, 22)
|
Me.MENU_VIEW.Size = New System.Drawing.Size(45, 19)
|
||||||
Me.MENU_VIEW.Text = "View"
|
Me.MENU_VIEW.Text = "View"
|
||||||
'
|
'
|
||||||
'BTT_VIEW_LARGE
|
'BTT_VIEW_LARGE
|
||||||
@@ -319,6 +364,18 @@ Partial Class MainFrame
|
|||||||
Me.BTT_VIEW_LIST.Size = New System.Drawing.Size(144, 22)
|
Me.BTT_VIEW_LIST.Size = New System.Drawing.Size(144, 22)
|
||||||
Me.BTT_VIEW_LIST.Text = "List"
|
Me.BTT_VIEW_LIST.Text = "List"
|
||||||
'
|
'
|
||||||
|
'BTT_SITE_ALL
|
||||||
|
'
|
||||||
|
Me.BTT_SITE_ALL.Name = "BTT_SITE_ALL"
|
||||||
|
Me.BTT_SITE_ALL.Size = New System.Drawing.Size(144, 22)
|
||||||
|
Me.BTT_SITE_ALL.Text = "All"
|
||||||
|
'
|
||||||
|
'BTT_SITE_SPECIFIC
|
||||||
|
'
|
||||||
|
Me.BTT_SITE_SPECIFIC.Name = "BTT_SITE_SPECIFIC"
|
||||||
|
Me.BTT_SITE_SPECIFIC.Size = New System.Drawing.Size(144, 22)
|
||||||
|
Me.BTT_SITE_SPECIFIC.Text = "Specific sites"
|
||||||
|
'
|
||||||
'BTT_SHOW_ALL
|
'BTT_SHOW_ALL
|
||||||
'
|
'
|
||||||
Me.BTT_SHOW_ALL.Name = "BTT_SHOW_ALL"
|
Me.BTT_SHOW_ALL.Name = "BTT_SHOW_ALL"
|
||||||
@@ -382,14 +439,24 @@ Partial Class MainFrame
|
|||||||
Me.BTT_VERSION_INFO.Text = "Info"
|
Me.BTT_VERSION_INFO.Text = "Info"
|
||||||
Me.BTT_VERSION_INFO.ToolTipText = "Show program information and check for new version"
|
Me.BTT_VERSION_INFO.ToolTipText = "Show program information and check for new version"
|
||||||
'
|
'
|
||||||
|
'BTT_DONATE
|
||||||
|
'
|
||||||
|
Me.BTT_DONATE.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right
|
||||||
|
Me.BTT_DONATE.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
|
||||||
|
Me.BTT_DONATE.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
|
||||||
|
Me.BTT_DONATE.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
|
Me.BTT_DONATE.Name = "BTT_DONATE"
|
||||||
|
Me.BTT_DONATE.Size = New System.Drawing.Size(23, 20)
|
||||||
|
Me.BTT_DONATE.Text = "Donate"
|
||||||
|
Me.BTT_DONATE.ToolTipText = "Donate"
|
||||||
|
'
|
||||||
'Toolbar_BOTTOM
|
'Toolbar_BOTTOM
|
||||||
'
|
'
|
||||||
Me.Toolbar_BOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_MAIN, Me.LBL_JOBS_COUNT, Me.LBL_STATUS})
|
Me.Toolbar_BOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_MAIN, Me.LBL_JOBS_COUNT, Me.LBL_STATUS, Me.PR_INST, Me.LBL_JOBS_INST_COUNT, Me.LBL_STATUS_INST})
|
||||||
Me.Toolbar_BOTTOM.Location = New System.Drawing.Point(0, 439)
|
Me.Toolbar_BOTTOM.Location = New System.Drawing.Point(0, 439)
|
||||||
Me.Toolbar_BOTTOM.Name = "Toolbar_BOTTOM"
|
Me.Toolbar_BOTTOM.Name = "Toolbar_BOTTOM"
|
||||||
Me.Toolbar_BOTTOM.Size = New System.Drawing.Size(934, 22)
|
Me.Toolbar_BOTTOM.Size = New System.Drawing.Size(934, 22)
|
||||||
Me.Toolbar_BOTTOM.TabIndex = 2
|
Me.Toolbar_BOTTOM.TabIndex = 2
|
||||||
Me.Toolbar_BOTTOM.Text = "StatusStrip1"
|
|
||||||
'
|
'
|
||||||
'PR_MAIN
|
'PR_MAIN
|
||||||
'
|
'
|
||||||
@@ -407,6 +474,22 @@ Partial Class MainFrame
|
|||||||
Me.LBL_STATUS.Name = "LBL_STATUS"
|
Me.LBL_STATUS.Name = "LBL_STATUS"
|
||||||
Me.LBL_STATUS.Size = New System.Drawing.Size(0, 17)
|
Me.LBL_STATUS.Size = New System.Drawing.Size(0, 17)
|
||||||
'
|
'
|
||||||
|
'PR_INST
|
||||||
|
'
|
||||||
|
Me.PR_INST.Name = "PR_INST"
|
||||||
|
Me.PR_INST.Size = New System.Drawing.Size(200, 16)
|
||||||
|
Me.PR_INST.Visible = False
|
||||||
|
'
|
||||||
|
'LBL_JOBS_INST_COUNT
|
||||||
|
'
|
||||||
|
Me.LBL_JOBS_INST_COUNT.Name = "LBL_JOBS_INST_COUNT"
|
||||||
|
Me.LBL_JOBS_INST_COUNT.Size = New System.Drawing.Size(0, 17)
|
||||||
|
'
|
||||||
|
'LBL_STATUS_INST
|
||||||
|
'
|
||||||
|
Me.LBL_STATUS_INST.Name = "LBL_STATUS_INST"
|
||||||
|
Me.LBL_STATUS_INST.Size = New System.Drawing.Size(0, 17)
|
||||||
|
'
|
||||||
'LIST_PROFILES
|
'LIST_PROFILES
|
||||||
'
|
'
|
||||||
Me.LIST_PROFILES.Activation = System.Windows.Forms.ItemActivation.OneClick
|
Me.LIST_PROFILES.Activation = System.Windows.Forms.ItemActivation.OneClick
|
||||||
@@ -422,101 +505,144 @@ Partial Class MainFrame
|
|||||||
'
|
'
|
||||||
'USER_CONTEXT
|
'USER_CONTEXT
|
||||||
'
|
'
|
||||||
Me.USER_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.BTT_CONTEXT_DOWN_LIMITED, Me.BTT_CONTEXT_EDIT, Me.BTT_CONTEXT_DELETE, CONTEXT_SEP_1, Me.BTT_CONTEXT_FAV, Me.BTT_CONTEXT_TEMP, Me.BTT_CONTEXT_GROUPS, Me.BTT_CONTEXT_ADD_TO_COL, Me.BTT_CONTEXT_COL_MERGE, CONTEXT_SEP_2, Me.BTT_CHANGE_IMAGE, CONTEXT_SEP_3, Me.BTT_CONTEXT_OPEN_PATH, CONTEXT_SEP_4, Me.BTT_CONTEXT_OPEN_SITE, CONTEXT_SEP_5, Me.BTT_CONTEXT_INFO})
|
Me.USER_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.BTT_CONTEXT_DOWN_LIMITED, Me.BTT_CONTEXT_EDIT, Me.BTT_CONTEXT_DELETE, CONTEXT_SEP_1, Me.BTT_CONTEXT_FAV, Me.BTT_CONTEXT_TEMP, Me.BTT_CONTEXT_READY, Me.BTT_CONTEXT_GROUPS, Me.BTT_CONTEXT_ADD_TO_COL, Me.BTT_CONTEXT_COL_MERGE, Me.BTT_CONTEXT_CHANGE_FOLDER, CONTEXT_SEP_2, Me.BTT_CHANGE_IMAGE, CONTEXT_SEP_3, Me.BTT_CONTEXT_OPEN_PATH, CONTEXT_SEP_4, Me.BTT_CONTEXT_OPEN_SITE, CONTEXT_SEP_5, Me.BTT_CONTEXT_INFO})
|
||||||
Me.USER_CONTEXT.Name = "USER_CONTEXT"
|
Me.USER_CONTEXT.Name = "USER_CONTEXT"
|
||||||
Me.USER_CONTEXT.Size = New System.Drawing.Size(196, 342)
|
Me.USER_CONTEXT.Size = New System.Drawing.Size(222, 364)
|
||||||
'
|
'
|
||||||
'BTT_CONTEXT_DOWN
|
'BTT_CONTEXT_DOWN
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
Me.BTT_CONTEXT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||||
Me.BTT_CONTEXT_DOWN.Name = "BTT_CONTEXT_DOWN"
|
Me.BTT_CONTEXT_DOWN.Name = "BTT_CONTEXT_DOWN"
|
||||||
Me.BTT_CONTEXT_DOWN.Size = New System.Drawing.Size(195, 22)
|
Me.BTT_CONTEXT_DOWN.Size = New System.Drawing.Size(221, 22)
|
||||||
Me.BTT_CONTEXT_DOWN.Text = "Download data"
|
Me.BTT_CONTEXT_DOWN.Text = "Download data"
|
||||||
'
|
'
|
||||||
'BTT_CONTEXT_EDIT
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_EDIT.Image = Global.SCrawler.My.Resources.Resources.PencilPic_01_16
|
|
||||||
Me.BTT_CONTEXT_EDIT.Name = "BTT_CONTEXT_EDIT"
|
|
||||||
Me.BTT_CONTEXT_EDIT.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_EDIT.Text = "Edit user information"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_DELETE
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_DELETE.Image = Global.SCrawler.My.Resources.Resources.Delete
|
|
||||||
Me.BTT_CONTEXT_DELETE.Name = "BTT_CONTEXT_DELETE"
|
|
||||||
Me.BTT_CONTEXT_DELETE.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_DELETE.Text = "Delete user / collection"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_FAV
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_FAV.Image = Global.SCrawler.My.Resources.Resources.StarPic_24
|
|
||||||
Me.BTT_CONTEXT_FAV.Name = "BTT_CONTEXT_FAV"
|
|
||||||
Me.BTT_CONTEXT_FAV.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_FAV.Text = "Change favorite"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_TEMP
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_TEMP.Image = CType(resources.GetObject("BTT_CONTEXT_TEMP.Image"), System.Drawing.Image)
|
|
||||||
Me.BTT_CONTEXT_TEMP.Name = "BTT_CONTEXT_TEMP"
|
|
||||||
Me.BTT_CONTEXT_TEMP.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_TEMP.Text = "Change temporary"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_GROUPS
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_GROUPS.Name = "BTT_CONTEXT_GROUPS"
|
|
||||||
Me.BTT_CONTEXT_GROUPS.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_GROUPS.Text = "Change labels"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_ADD_TO_COL
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_ADD_TO_COL.Image = Global.SCrawler.My.Resources.Resources.DBPic_32
|
|
||||||
Me.BTT_CONTEXT_ADD_TO_COL.Name = "BTT_CONTEXT_ADD_TO_COL"
|
|
||||||
Me.BTT_CONTEXT_ADD_TO_COL.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_ADD_TO_COL.Text = "Add to collection"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_COL_MERGE
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_COL_MERGE.Name = "BTT_CONTEXT_COL_MERGE"
|
|
||||||
Me.BTT_CONTEXT_COL_MERGE.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_COL_MERGE.Text = "Merge collection files"
|
|
||||||
'
|
|
||||||
'BTT_CHANGE_IMAGE
|
|
||||||
'
|
|
||||||
Me.BTT_CHANGE_IMAGE.Image = Global.SCrawler.My.Resources.Resources.PicturePic_32
|
|
||||||
Me.BTT_CHANGE_IMAGE.Name = "BTT_CHANGE_IMAGE"
|
|
||||||
Me.BTT_CHANGE_IMAGE.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CHANGE_IMAGE.Text = "Change image"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_OPEN_PATH
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_OPEN_PATH.Image = Global.SCrawler.My.Resources.Resources.Folder_32
|
|
||||||
Me.BTT_CONTEXT_OPEN_PATH.Name = "BTT_CONTEXT_OPEN_PATH"
|
|
||||||
Me.BTT_CONTEXT_OPEN_PATH.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_OPEN_PATH.Text = "Open contains folder"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_OPEN_SITE
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_OPEN_SITE.Image = Global.SCrawler.My.Resources.Resources.GlobeBlue_32
|
|
||||||
Me.BTT_CONTEXT_OPEN_SITE.Name = "BTT_CONTEXT_OPEN_SITE"
|
|
||||||
Me.BTT_CONTEXT_OPEN_SITE.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_OPEN_SITE.Text = "Open site"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_INFO
|
|
||||||
'
|
|
||||||
Me.BTT_CONTEXT_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32
|
|
||||||
Me.BTT_CONTEXT_INFO.Name = "BTT_CONTEXT_INFO"
|
|
||||||
Me.BTT_CONTEXT_INFO.Size = New System.Drawing.Size(195, 22)
|
|
||||||
Me.BTT_CONTEXT_INFO.Text = "Information"
|
|
||||||
'
|
|
||||||
'BTT_CONTEXT_DOWN_LIMITED
|
'BTT_CONTEXT_DOWN_LIMITED
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_DOWN_LIMITED.AutoToolTip = True
|
Me.BTT_CONTEXT_DOWN_LIMITED.AutoToolTip = True
|
||||||
Me.BTT_CONTEXT_DOWN_LIMITED.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
Me.BTT_CONTEXT_DOWN_LIMITED.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||||
Me.BTT_CONTEXT_DOWN_LIMITED.Name = "BTT_CONTEXT_DOWN_LIMITED"
|
Me.BTT_CONTEXT_DOWN_LIMITED.Name = "BTT_CONTEXT_DOWN_LIMITED"
|
||||||
Me.BTT_CONTEXT_DOWN_LIMITED.Size = New System.Drawing.Size(195, 22)
|
Me.BTT_CONTEXT_DOWN_LIMITED.Size = New System.Drawing.Size(221, 22)
|
||||||
Me.BTT_CONTEXT_DOWN_LIMITED.Text = "Download data limited"
|
Me.BTT_CONTEXT_DOWN_LIMITED.Text = "Download data limited"
|
||||||
Me.BTT_CONTEXT_DOWN_LIMITED.ToolTipText = "Download top ... posts"
|
Me.BTT_CONTEXT_DOWN_LIMITED.ToolTipText = "Download top ... posts"
|
||||||
'
|
'
|
||||||
|
'BTT_CONTEXT_EDIT
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_EDIT.Image = Global.SCrawler.My.Resources.Resources.PencilPic_01_16
|
||||||
|
Me.BTT_CONTEXT_EDIT.Name = "BTT_CONTEXT_EDIT"
|
||||||
|
Me.BTT_CONTEXT_EDIT.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_EDIT.Text = "Edit user information"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_DELETE
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_DELETE.Image = Global.SCrawler.My.Resources.Resources.Delete
|
||||||
|
Me.BTT_CONTEXT_DELETE.Name = "BTT_CONTEXT_DELETE"
|
||||||
|
Me.BTT_CONTEXT_DELETE.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_DELETE.Text = "Delete user / collection"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_FAV
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_FAV.Image = Global.SCrawler.My.Resources.Resources.StarPic_24
|
||||||
|
Me.BTT_CONTEXT_FAV.Name = "BTT_CONTEXT_FAV"
|
||||||
|
Me.BTT_CONTEXT_FAV.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_FAV.Text = "Change favorite"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_TEMP
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_TEMP.Image = CType(resources.GetObject("BTT_CONTEXT_TEMP.Image"), System.Drawing.Image)
|
||||||
|
Me.BTT_CONTEXT_TEMP.Name = "BTT_CONTEXT_TEMP"
|
||||||
|
Me.BTT_CONTEXT_TEMP.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_TEMP.Text = "Change temporary"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_READY
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_READY.Name = "BTT_CONTEXT_READY"
|
||||||
|
Me.BTT_CONTEXT_READY.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_READY.Text = "Change ready for download"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_GROUPS
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_GROUPS.Name = "BTT_CONTEXT_GROUPS"
|
||||||
|
Me.BTT_CONTEXT_GROUPS.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_GROUPS.Text = "Change labels"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_ADD_TO_COL
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_ADD_TO_COL.Image = Global.SCrawler.My.Resources.Resources.DBPic_32
|
||||||
|
Me.BTT_CONTEXT_ADD_TO_COL.Name = "BTT_CONTEXT_ADD_TO_COL"
|
||||||
|
Me.BTT_CONTEXT_ADD_TO_COL.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_ADD_TO_COL.Text = "Add to collection"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_COL_MERGE
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_COL_MERGE.Name = "BTT_CONTEXT_COL_MERGE"
|
||||||
|
Me.BTT_CONTEXT_COL_MERGE.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_COL_MERGE.Text = "Merge collection files"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_CHANGE_FOLDER
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_CHANGE_FOLDER.AutoToolTip = True
|
||||||
|
Me.BTT_CONTEXT_CHANGE_FOLDER.Name = "BTT_CONTEXT_CHANGE_FOLDER"
|
||||||
|
Me.BTT_CONTEXT_CHANGE_FOLDER.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_CHANGE_FOLDER.Text = "Change folder"
|
||||||
|
Me.BTT_CONTEXT_CHANGE_FOLDER.ToolTipText = "Change user data folder"
|
||||||
|
'
|
||||||
|
'BTT_CHANGE_IMAGE
|
||||||
|
'
|
||||||
|
Me.BTT_CHANGE_IMAGE.Image = Global.SCrawler.My.Resources.Resources.PicturePic_32
|
||||||
|
Me.BTT_CHANGE_IMAGE.Name = "BTT_CHANGE_IMAGE"
|
||||||
|
Me.BTT_CHANGE_IMAGE.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CHANGE_IMAGE.Text = "Change image"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_OPEN_PATH
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_OPEN_PATH.Image = Global.SCrawler.My.Resources.Resources.Folder_32
|
||||||
|
Me.BTT_CONTEXT_OPEN_PATH.Name = "BTT_CONTEXT_OPEN_PATH"
|
||||||
|
Me.BTT_CONTEXT_OPEN_PATH.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_OPEN_PATH.Text = "Open contains folder"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_OPEN_SITE
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_OPEN_SITE.Image = Global.SCrawler.My.Resources.Resources.GlobeBlue_32
|
||||||
|
Me.BTT_CONTEXT_OPEN_SITE.Name = "BTT_CONTEXT_OPEN_SITE"
|
||||||
|
Me.BTT_CONTEXT_OPEN_SITE.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_OPEN_SITE.Text = "Open site"
|
||||||
|
'
|
||||||
|
'BTT_CONTEXT_INFO
|
||||||
|
'
|
||||||
|
Me.BTT_CONTEXT_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32
|
||||||
|
Me.BTT_CONTEXT_INFO.Name = "BTT_CONTEXT_INFO"
|
||||||
|
Me.BTT_CONTEXT_INFO.Size = New System.Drawing.Size(221, 22)
|
||||||
|
Me.BTT_CONTEXT_INFO.Text = "Information"
|
||||||
|
'
|
||||||
|
'TrayIcon
|
||||||
|
'
|
||||||
|
Me.TrayIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info
|
||||||
|
Me.TrayIcon.BalloonTipTitle = "Social networks crawler"
|
||||||
|
Me.TrayIcon.ContextMenuStrip = Me.TRAY_CONTEXT
|
||||||
|
Me.TrayIcon.Icon = CType(resources.GetObject("TrayIcon.Icon"), System.Drawing.Icon)
|
||||||
|
Me.TrayIcon.Text = "Social networks crawler"
|
||||||
|
'
|
||||||
|
'TRAY_CONTEXT
|
||||||
|
'
|
||||||
|
Me.TRAY_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_TRAY_SHOW_HIDE, TRAY_SEP_1, Me.BTT_TRAY_CLOSE})
|
||||||
|
Me.TRAY_CONTEXT.Name = "TRAY_CONTEXT"
|
||||||
|
Me.TRAY_CONTEXT.Size = New System.Drawing.Size(134, 54)
|
||||||
|
'
|
||||||
|
'BTT_TRAY_SHOW_HIDE
|
||||||
|
'
|
||||||
|
Me.BTT_TRAY_SHOW_HIDE.Name = "BTT_TRAY_SHOW_HIDE"
|
||||||
|
Me.BTT_TRAY_SHOW_HIDE.Size = New System.Drawing.Size(133, 22)
|
||||||
|
Me.BTT_TRAY_SHOW_HIDE.Text = "Show/Hide"
|
||||||
|
'
|
||||||
|
'BTT_TRAY_CLOSE
|
||||||
|
'
|
||||||
|
Me.BTT_TRAY_CLOSE.BackColor = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer))
|
||||||
|
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(133, 22)
|
||||||
|
Me.BTT_TRAY_CLOSE.Text = "Close"
|
||||||
|
'
|
||||||
'MainFrame
|
'MainFrame
|
||||||
'
|
'
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
@@ -535,6 +661,7 @@ Partial Class MainFrame
|
|||||||
Me.Toolbar_BOTTOM.ResumeLayout(False)
|
Me.Toolbar_BOTTOM.ResumeLayout(False)
|
||||||
Me.Toolbar_BOTTOM.PerformLayout()
|
Me.Toolbar_BOTTOM.PerformLayout()
|
||||||
Me.USER_CONTEXT.ResumeLayout(False)
|
Me.USER_CONTEXT.ResumeLayout(False)
|
||||||
|
Me.TRAY_CONTEXT.ResumeLayout(False)
|
||||||
Me.ResumeLayout(False)
|
Me.ResumeLayout(False)
|
||||||
Me.PerformLayout()
|
Me.PerformLayout()
|
||||||
|
|
||||||
@@ -586,4 +713,19 @@ Partial Class MainFrame
|
|||||||
Private WithEvents BTT_CONTEXT_GROUPS As ToolStripMenuItem
|
Private WithEvents BTT_CONTEXT_GROUPS As ToolStripMenuItem
|
||||||
Private WithEvents BTT_VERSION_INFO As ToolStripButton
|
Private WithEvents BTT_VERSION_INFO As ToolStripButton
|
||||||
Private WithEvents BTT_CONTEXT_DOWN_LIMITED As ToolStripMenuItem
|
Private WithEvents BTT_CONTEXT_DOWN_LIMITED As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_CONTEXT_READY As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_SETTINGS_INSTAGRAM As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_SITE_ALL As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_SITE_SPECIFIC As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_CONTEXT_CHANGE_FOLDER As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_DOWN_SAVED As ToolStripButton
|
||||||
|
Private WithEvents PR_INST As ToolStripProgressBar
|
||||||
|
Private WithEvents LBL_JOBS_INST_COUNT As ToolStripStatusLabel
|
||||||
|
Private WithEvents LBL_STATUS_INST As ToolStripStatusLabel
|
||||||
|
Private WithEvents TrayIcon As NotifyIcon
|
||||||
|
Private WithEvents TRAY_CONTEXT As ContextMenuStrip
|
||||||
|
Private WithEvents BTT_TRAY_SHOW_HIDE As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_TRAY_CLOSE As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_SETTINGS_REDGIFS As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_DONATE As ToolStripButton
|
||||||
End Class
|
End Class
|
||||||
@@ -132,22 +132,6 @@
|
|||||||
<metadata name="MENU_SETTINGS_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="MENU_SETTINGS_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<data name="MENU_SETTINGS.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
|
||||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
|
|
||||||
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
|
|
||||||
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
|
|
||||||
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
|
|
||||||
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
|
|
||||||
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
|
|
||||||
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
|
|
||||||
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
|
|
||||||
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
|
|
||||||
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<metadata name="SEP_3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="SEP_3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
@@ -169,12 +153,19 @@
|
|||||||
<metadata name="MENU_VIEW_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="MENU_VIEW_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<metadata name="MENU_VIEW_SEP_3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
<metadata name="MENU_VIEW_SEP_2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="MENU_VIEW_SEP_2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<metadata name="TRAY_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
<metadata name="Toolbar_TOP.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="Toolbar_TOP.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>132, 17</value>
|
<value>132, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
<data name="BTT_DOWN_VIDEO.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="BTT_DOWN_VIDEO.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||||
@@ -307,6 +298,207 @@
|
|||||||
At+48gfYvPlXp/n+iqDm2Lj4f73w4kt1S+yWJa3+1e9fQ5Bp8ZkfwPMCwN9yOBn2+KfAk+ChX8G+Dps/
|
At+48gfYvPlXp/n+iqDm2Lj4f73w4kt1S+yWJa3+1e9fQ5Bp8ZkfwPMCwN9yOBn2+KfAk+ChX8G+Dps/
|
||||||
r1u/xd3D6+rf/v5+9YqVq6Sv/vF9Xh2XnFf8yCt5XGzeWrdeY+/glPLrtRte+M1bG1dBlPfP4uvT/xKb
|
r1u/xd3D6+rf/v5+9YqVq6Sv/vF9Xh2XnFf8yCt5XGzeWrdeY+/glPLrtRte+M1bG1dBlPfP4uvT/xKb
|
||||||
N95xYLfifeVScsnnXMZvA+8pi/7fhb+CbP4D9GPXvMEwYYwAAAAASUVORK5CYII=
|
N95xYLfifeVScsnnXMZvA+8pi/7fhb+CbP4D9GPXvMEwYYwAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="TrayIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>525, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TRAY_CONTEXT.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>623, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="BTT_TRAY_CLOSE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="TrayIcon.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACOMzL/jjMy/44zMv+OMzL/jjMy/44zMv9Ts2//U7Nv/1Ozb/9Ts2//U7Nv/1Oz
|
||||||
|
b/891/H/Pdfx/z3X8f891/H/Pdfx/z3X8f8ukuD/LpLg/y6S4P8ukuD/LpLg/y6S4P8vOs7/LzrO/y86
|
||||||
|
zv8vOs7/LzrO/y86zv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8vLx+OMzL/jjMy/44zMv+OMzL/jjMy/4w4NOJTs2//U7Nv/1Oz
|
||||||
|
b/9Ts2//U7Nv/1O0cuI91/H/Pdfx/z3X8f891/H/Pdfx/z3X8f8ukuD/LpLg/y6S4P8ukuD/LpLg/y6S
|
||||||
|
4P8vOs7/LzrO/y86zv8vOs7/LzrO/y86zv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI0yMjeOMzL/jjMy/44zMv+OMzL/jjMy/4tD
|
||||||
|
N9NTs2//U7Nv/1Ozb/9Ts2//U7Nv/1K1fNM91/H/Pdfx/z3X8f891/H/Pdfx/zzW8OkukuD/LpLg/y6S
|
||||||
|
4P8ukuD/LpLg/y6R4PcvOs7/LzrO/y86zv8vOs7/LzrO/y86zuYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwzM0+OMzL/jjMy/44z
|
||||||
|
Mv+OMzL/jjMy/4hRPcdTs2//U7Nv/1Ozb/9Ts2//U7Nv/1G4h8c91/H/Pdfx/z3X8f891/H/Pdfx/zzV
|
||||||
|
8eIukuD/LpLg/y6S4P8ukuD/LpLg/y2R4OIvOs7/LzrO/y86zv8vOs7/LzrO/y46zd4AAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4z
|
||||||
|
MZ6OMzL/jjMy/44zMv+OMzL/jjMy/4NiRMBTs2//U7Nv/1Ozb/9Ts2//U7Nv/067mMA91/H/Pdfx/z3X
|
||||||
|
8f891/H/Pdfx/zzR78sukuD/LpLg/y6S4P8ukuD/LpLg/y2Q39cvOs7/LzrO/y86zv8vOs7/LzrO/y86
|
||||||
|
ztYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAI0zMu6OMzL/jjMy/44zMv+OMzL/jjMy/26RXMdTs2//U7Nv/1Ozb/9Ts2//U7Nv/0vB
|
||||||
|
rr491/H/Pdfx/z3X8f891/H/Pdfx/zjI7b8ukuD/LpLg/y6S4P8ukuD/LpLg/y2J3cUvOs7/LzrO/y86
|
||||||
|
zv8vOs7/LzrO/y46zq4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAjzMzP44zMv+OMzL/jjMy/44zMv+OMzL/jjIx91SwbvZTs2//U7Nv/1Oz
|
||||||
|
b/9Ts2//U7Nv/0XM1M491/H/Pdfx/z3X8f891/H/Pdfx/za66cAukuD/LpLg/y6S4P8ukuD/LpLg/y55
|
||||||
|
2b4vOs7/LzrO/y86zv8vOs7/LzrO/y46zo4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjjIxro4zMv+OMzL/jjMy/44zMv+OMzL/iUw7y1Oz
|
||||||
|
b/9Ts2//U7Nv/1Ozb/9Ts2//U7Nv7z3X8f891/H/Pdfx/z3X8f891/H/Pdfx/zCk49cukuD/LpLg/y6S
|
||||||
|
4P8ukuD/LpLg/y1p1ccvOs7/LzrO/y86zv8vOs7/LzrO/y46zWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPNC4vjjMy/44zMv+OMzL/jjMy/44z
|
||||||
|
Mv+OMzL/dIdXwlOzb/9Ts2//U7Nv/1Ozb/9Ts2//T7qSwj3X8f891/H/Pdfx/z3X8f891/H/PNXx4i6S
|
||||||
|
4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y5N0OIvOs7/LzrO/y86zv8vOs7/LzrO/y07zDcAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNMjLOjjMy/44z
|
||||||
|
Mv+OMzL/jjMy/44zMv+NNDLvWqpr6FOzb/9Ts2//U7Nv/1Ozb/9Ts2//RsnKxz3X8f891/H/Pdfx/z3X
|
||||||
|
8f891/H/OcvtwC6S4P8ukuD/LpLg/y6S4P8ukuD/LZHg4i86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y4+
|
||||||
|
zw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4z
|
||||||
|
MHeOMzL/jjMy/44zMv+OMzL/jjMy/44zMv95flG/U7Nv/1Ozb/9Ts2//U7Nv/1Ozb/9Ssm/3PdXt9j3X
|
||||||
|
8f891/H/Pdfx/z3X8f891/H/M63myi6S4P8ukuD/LpLg/y6S4P8ukuD/Lobcwi86zv8vOs7/LzrO/y86
|
||||||
|
zv8vOs7/LjnNzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAjDMzT44zMv+OMzL/jjMy/44zMv+OMzL/jjMy/441MulUsG72U7Nv/1Ozb/9Ts2//U7Nv/1Oz
|
||||||
|
b/9PuI3FPdfx/z3X8f891/H/Pdfx/z3X8f881/HvLpTh9i6S4P8ukuD/LpLg/y6S4P8ukuD/LXDXwi86
|
||||||
|
zv8vOs7/LzrO/y86zv8vOs7/LjrOjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACvhoQ4jzg39o4zMv+OMzL/jjMy/44zMv+OMzL/jjMy/3SHV8JTs2//U7Nv/1Oz
|
||||||
|
b/9Ts2//U7Nv/1Ozb/9D0NzXPdfx/z3X8f891/H/Pdfx/z3X8f87zu7FLpLg/y6S4P8ukuD/LpLg/y6S
|
||||||
|
4P8ukuD/Lk3Q4i86zv8vOs7/LzrO/y86zv8vOs7/LznMTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAALKPjmi5mpn4roaG/485OP+OMzL/jjMy/44zMv+OMzL/i0c5zlOz
|
||||||
|
b/9Ts2//U7Nv/1Ozb/9Ts2//U7Nv/067mMA91/H/Pdfx/z3X8f891/H/Pdfx/z3X8f82uOjCLpLg/y6S
|
||||||
|
4P8ukuD/LpLg/y6S4P8ujt/ULzrO/y86zv8vOs7/LzrO/y86zv8vOs7/Lj7PDwAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtJKSkrmamv+5mpr/uZqa/66Ghv+POTj/jjMy/44z
|
||||||
|
Mv+MODTiWqpr6FOzb/9Ts2//U7Nv/1Ozb/9Ts2//UrJv9z/U5+g91/H/Pdfx/z3X8f891/H/Pdfx/zzW
|
||||||
|
8OkulOH2LpLg/y6S4P8ukuD/LpLg/y6S4P8ucdfFLzrO/y86zv8vOs7/LzrO/y86zv8uOs6+AAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKPj1+4l5fguZqa/7mamv+5mpr/uZqa/7ma
|
||||||
|
mv+uhob/jzk4/44yMfdkoGTXU7Nv/1Ozb/9Ts2//U7Nv/1Ozb/9Ts2//Tr2dvz3X8f891/H/Pdfx/z3X
|
||||||
|
8f891/H/Pdfx/za46MIukuD/LpLg/y6S4P8ukuD/LpLg/y6R4PcvQ8/2LzrO/y86zv8vOs7/LzrO/y86
|
||||||
|
zv8uOs1nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKd+fhuzkJBxtZKS2bmamv+5mpr/uZqa/7ma
|
||||||
|
mv+5mpr/uZqa/7mamv+5mpr/roaG/3GTYMdTs2//U7Nv/1Ozb/9Ts2//U7Nv/1Ozb/9SsnHpP9Tn6D3X
|
||||||
|
8f891/H/Pdfx/z3X8f891/H/PNXw1y6S4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y6C278vOs7/LzrO/y86
|
||||||
|
zv8vOs7/LzrO/y85zvYuPs8PAAAAAAAAAACzjY1Ns42NTbOQkHG0kpKSt5aWzLmamv+5mpr/uZqa/7ma
|
||||||
|
mv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+7nZzzssOu2ZHGnf9WtHH/U7Nv/1Ozb/9Ts2//U7Nv/1Ky
|
||||||
|
b/dFzNTOPdfx/z3X8f891/H/Pdfx/z3X8f891/H/NLDmxy6S4P8ukuD/LpLg/y6S4P8ukuD/LpHg9y5K
|
||||||
|
0OgvOs7/LzrO/y86zv8vOs7/LzrO/y46zq4AAAAAAAAAAAAAAAC5mpr/uZqa/7mamv+5mpr/uZqa/7ma
|
||||||
|
mv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/72hoOerya7mos2s/6LNrP+Rxp3/VrRx/1Oz
|
||||||
|
b/9Ts2//U7Nv/0nFusA91/H/Pdfx/z3X8f891/H/Pdfx/z3X8f880vDOLpLg/y6S4P8ukuD/LpLg/y6S
|
||||||
|
4P8ukuD/LoDbyS86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y85zE8AAAAAAAAAAAAAAAC5mpr/uZqa/7ma
|
||||||
|
mv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/vaml2qbMrPOizaz/os2s/6LN
|
||||||
|
rP+izaz/kcad/1a0cf9Ts2//Tr2dvz3X8f891/H/Pdfx/z3X8f891/H/Pdfx/z3X8f8wpOPXLpLg/y6S
|
||||||
|
4P8ukuD/LpLg/y6S4P8ukODpLkDP9i86zv8vOs7/LzrO/y86zv8vOs7/LjnNzgAAAAAAAAAAAAAAAAAA
|
||||||
|
AAC5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/72jouOyw67Zos2s/6LN
|
||||||
|
rP+izaz/os2s/6LNrP+izaz/os2s/5HGnf9VuIbLPdfx/z3X8f891/H/Pdfx/z3X8f891/H/Pdfx/zjG
|
||||||
|
7L4ukuD/LpLg/y6S4P8ukuD/LpLg/y6S4P8td9i/LzrO/y86zv8vOs7/LzrO/y86zv8vOs7/LznMTwAA
|
||||||
|
AAAAAAAAAAAAAAAAAAC5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+8np7vtr6t1KLN
|
||||||
|
rP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6vUvdeK3/H3Qtfx/z3X8f891/H/Pdfx/z3X
|
||||||
|
8f891/H/O9Dvxy6S4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y6Q4OsuQM/2LzrO/y86zv8vOs7/LzrO/y86
|
||||||
|
zv8uOc3OAAAAAAAAAAAAAAAAAAAAAAAAAAC5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+8oJ/qvLGp07LD
|
||||||
|
rtmizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/rNjL0Zzk9f+c5PX/ieD0/0LX
|
||||||
|
8f891/H/Pdfx/z3X8f871O/eLpTh9i6S4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y1p1ccvOs7/LzrO/y86
|
||||||
|
zv8vOs7/LzrO/y86zv8vOcxPAAAAAAAAAAAAAAAAAAAAAAAAAAC+p6Tcvqek3L2vqNS6t6vSurms0a3H
|
||||||
|
reOizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6PNrfmp3dzVnOT1/5zk
|
||||||
|
9f+c5PX/nOT1/4ng9P9C1/H/Pdfx/zzX8fAwnuLiLpLg/y6S4P8ukuD/LpLg/y6S4P8ukuD/Lo3e0C86
|
||||||
|
zv8vOs7/LzrO/y86zv8vOs7/LzrO/y45zc4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACizaz/os2s/6LN
|
||||||
|
rP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/pc6v76Xg
|
||||||
|
5d+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+J4PT/Qdbw9zKr5dQukuD/LpLg/y6S4P8ukuD/LpLg/y6S
|
||||||
|
4P8tkeDjLkPO7y86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y46zy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AACizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6TP
|
||||||
|
rvOr2tDRnePy+Jzk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+d4/T5j8nt2TST4P8ukuD/LpLg/y6S
|
||||||
|
4P8ukuD/LpLg/y6R4PcuVdHkLzrO/y86zv8vOs7/LzrO/y86zv8vOs7/LjnOngAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LN
|
||||||
|
rP+jza35rNjI0p/j8fOc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5/k9e+hyu7jmbvq/4Wx
|
||||||
|
5/80k+D/LpLg/y6S4P8ukuD/LpLg/y5o1cwvOs7/LzrO/y86zv8vOs7/LzrO/y86zv8uOc3uKTTJFwAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LN
|
||||||
|
rP+izaz/ptCx6qvXxdOh4e3qnOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/ouP15JzD
|
||||||
|
6/SZu+r/mbvq/5m76v+Fsef/NJPg/y6S4P8ukuD/LXvZxi86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y86
|
||||||
|
zv8uOM1HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACizaz/os2s/6LNrP+izaz/os2s/6LN
|
||||||
|
rP+izaz/p9Cz56vZztKk4ejjnOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk
|
||||||
|
9f+l4PTZmr3q+Jm76v+Zu+r/mbvq/5m76v+Zu+r/hbHn/zST4P8uiN3MLzrO/y86zv8vOs7/LzrO/y86
|
||||||
|
zv8vOs7/LzrO/y84zG8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACp0rjcqdK43KvW
|
||||||
|
wtSr2c7Sq9rQ0aff5Nyh4e3qnOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk
|
||||||
|
9f+c5PX/nOT1/6ba8teZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/42z5941Rc/2LzrO/y86
|
||||||
|
zv8vOs7/LzrO/y86zv8vOs7/LznOlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk
|
||||||
|
9f+c5PX/nOT1/5zk9f+l4fTbncPr75m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/o73p2Zqe
|
||||||
|
3/iFiNr/NT/O/y86zv8vOs7/LzrO/y86zv8uOs6+HD2+BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk
|
||||||
|
9f+c5PX/nOT1/5zk9f+c5PX/pOL13qHK7uOZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7
|
||||||
|
6v+ltufVmZve/5mb3v+Zm97/hYja/zU/zv8vOs7/LzrO/y46zd4uPs8PAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk
|
||||||
|
9f+c5PX/nOT1/5zk9f+c5PX/nOT1/6Hj9Oeiz+/fmbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7
|
||||||
|
6v+Zu+r/nL3q86Ku5N6Zm97/mZve/5mb3v+Zm97/mZve/4WI2v81P87/LjnN7iw5zCcAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk
|
||||||
|
9f+c5PX/nOT1/5zk9f+c5PX/nOT1/6Hj9eun3vPSoszu4Jm76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7
|
||||||
|
6v+Zu+r/mbvq/5m76v+fvurnn6fh5pmb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Fh9n3LjjNRwAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk
|
||||||
|
9f+c5PX/nOT1/5zk9f+c5PX/nOT1/6Tk9OCn2PHSoMfs5pm76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7
|
||||||
|
6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/6O/6tqcoN/zmZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5aY
|
||||||
|
3fJ/gtlJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AACl4/XcpeP13KXj9dyl4/Xcp93z0afY8dKjze7cnMDr85m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7
|
||||||
|
6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+gv+rjoq7j3Jmb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb
|
||||||
|
3v+Zm97/lJbc2X6A2SUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7
|
||||||
|
6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/nr7q6qWz5dWZm97/mZve/5mb3v+Zm97/mZve/5mb
|
||||||
|
3v+Zm97/mZve/5mb3v+Sld2+aXDWEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7
|
||||||
|
6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5y96vOmuOfSmp7f+Jmb3v+Zm97/mZve/5mb
|
||||||
|
3v+Zm97/mZve/5mb3v+Zm97/mZve/4mL2pYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZu+r/mbvq/5m76v+Zu+r/mbvq/5m7
|
||||||
|
6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+dvervprrn0pyg3/OZm97/mZve/5mb
|
||||||
|
3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+WmN34io3aZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZu+r/mbvq/5m7
|
||||||
|
6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+avOr5pL7q1qOw5NmZm97/mZve/5mb
|
||||||
|
3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5OW3eyEh9o4AAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AACZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+iv+rcprrn0qKu49yZm97/mZve/5mb
|
||||||
|
3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm974i43al4SLzwgAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACiv+rcor/q3KK/6tyiv+rcpL7q16a659KksuXXoKni45mb3v+Zm97/mZve/5mb
|
||||||
|
3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5SW3cWEh9gvAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb
|
||||||
|
3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Vl93MjY/cTQAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZm97/mZve/5mb3v+Zm97/mZve/5mb
|
||||||
|
3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/kJLcy42P
|
||||||
|
3E0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZm97/mZve/5mb
|
||||||
|
3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/lZfd7I2P
|
||||||
|
26aEh9o4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AACZm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mJre7JOV
|
||||||
|
3bCHitlUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACZm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Ymt3ylJbdvo+R
|
||||||
|
23mMj9oxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVl93MlZfdzJWX3cyVl93MlJbdxZGT25KPkdpxjY/cTYSL
|
||||||
|
zwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAAAAAAP//gAAAAAAA//+AAAAA
|
||||||
|
AAD//4AAAAAAAP//gAAAAAAA//+AAAAAAAD//wAAAAAAAP//AAAAAAAA//4AAAAAAAD//gAAAAAAAP/8
|
||||||
|
AAAAAQAA//gAAAABAAD/8AAAAAEAAP/gAAAAAQAA/8AAAAADAAD/AAAAAAMAAPgAAAAAAwAAAAAAAAAH
|
||||||
|
AAAAAAAAAAcAAAAAAAAADwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAA/AAAAAAAAAD8AAAAA
|
||||||
|
AAAAfwAAAAAAAAB/AAAAAAAAAP8AAAAAAAAB/wAAAAAAAAP/AAAAAAAAA/8AAAAAAAAH/wAAAAAAAA//
|
||||||
|
AAAAAAAAH/8AAAAAAAA//wAAAAAAAH//AAAAAAAA//8AAAAAAAP//wAAAAAAB///AAAAAAAP//8AAAAA
|
||||||
|
AB///wAAAAAAf///AAAAAAH///8AAAAAB////wAAAAAf////AAAAAP////8AAAAH/////wAAAH//////
|
||||||
|
AAA=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
Imports System.ComponentModel
|
' 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.ComponentModel
|
||||||
Imports System.Globalization
|
Imports System.Globalization
|
||||||
Imports System.Threading
|
Imports System.Threading
|
||||||
Imports PersonalUtilities.Forms
|
Imports PersonalUtilities.Forms
|
||||||
@@ -9,6 +17,7 @@ Public Class MainFrame
|
|||||||
Private MyView As FormsView
|
Private MyView As FormsView
|
||||||
Private ReadOnly _VideoDownloadingMode As Boolean = False
|
Private ReadOnly _VideoDownloadingMode As Boolean = False
|
||||||
Private MyChannels As ChannelViewForm
|
Private MyChannels As ChannelViewForm
|
||||||
|
Private MySavedPosts As DownloadSavedPostsForm
|
||||||
Private _UFinit As Boolean = True
|
Private _UFinit As Boolean = True
|
||||||
Public Sub New()
|
Public Sub New()
|
||||||
InitializeComponent()
|
InitializeComponent()
|
||||||
@@ -21,36 +30,50 @@ Public Class MainFrame
|
|||||||
If Args.ListExists(2) AndAlso Args(1) = "v" Then
|
If Args.ListExists(2) AndAlso Args(1) = "v" Then
|
||||||
Using f As New VideosDownloaderForm : f.ShowDialog() : End Using
|
Using f As New VideosDownloaderForm : f.ShowDialog() : End Using
|
||||||
_VideoDownloadingMode = True
|
_VideoDownloadingMode = True
|
||||||
Else
|
|
||||||
Downloader = New TDownloader
|
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub MainFrame_Load(sender As Object, e As EventArgs) Handles Me.Load
|
Private Sub MainFrame_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||||
If _VideoDownloadingMode Then GoTo FormClosingInvoker
|
If _VideoDownloadingMode Then GoTo FormClosingInvoker
|
||||||
|
Settings.DeleteCachPath()
|
||||||
|
MainProgress = New Toolbars.MyProgress(Toolbar_BOTTOM, PR_MAIN, LBL_STATUS) With {.DropCurrentProgressOnTotalChange = False, .Enabled = False}
|
||||||
|
MainProgressInst = New Toolbars.MyProgress(Toolbar_BOTTOM, PR_INST, LBL_STATUS_INST) With {.DropCurrentProgressOnTotalChange = False, .Enabled = False}
|
||||||
|
Downloader = New TDownloader
|
||||||
InfoForm = New DownloadedInfoForm
|
InfoForm = New DownloadedInfoForm
|
||||||
AddHandler Downloader.OnJobsChange, AddressOf Downloader_UpdateJobsCount
|
AddHandler Downloader.OnJobsChange, AddressOf Downloader_UpdateJobsCount
|
||||||
AddHandler Downloader.OnDownloading, AddressOf Downloader_OnDownloading
|
AddHandler Downloader.OnDownloading, AddressOf Downloader_OnDownloading
|
||||||
AddHandler Downloader.OnDownloadCountChange, AddressOf InfoForm.Downloader_OnDownloadCountChange
|
AddHandler Downloader.OnDownloadCountChange, AddressOf InfoForm.Downloader_OnDownloadCountChange
|
||||||
|
AddHandler Downloader.SendNotification, AddressOf NotificationMessage
|
||||||
Settings.LoadUsers()
|
Settings.LoadUsers()
|
||||||
MyView = New FormsView(Me)
|
MyView = New FormsView(Me)
|
||||||
MyView.ImportFromXML(Settings.Design)
|
MyView.ImportFromXML(Settings.Design)
|
||||||
MyView.SetMeSize()
|
MyView.SetMeSize()
|
||||||
MainProgress = New Toolbars.MyProgress(Toolbar_BOTTOM, PR_MAIN, LBL_STATUS) With {.DropCurrentProgressOnTotalChange = False}
|
If Settings.CloseToTray Then TrayIcon.Visible = True
|
||||||
Dim gk$
|
Dim gk$
|
||||||
With LIST_PROFILES.Groups
|
With LIST_PROFILES.Groups
|
||||||
gk = GetLviGroupName(Sites.Undefined, False, False, True)
|
'Collections
|
||||||
|
gk = GetLviGroupName(Sites.Undefined, False, True, True, False)
|
||||||
.Add(New ListViewGroup(gk, gk))
|
.Add(New ListViewGroup(gk, gk))
|
||||||
gk = GetLviGroupName(Sites.Undefined, False, True, True)
|
gk = GetLviGroupName(Sites.Undefined, False, False, True, False)
|
||||||
.Add(New ListViewGroup(gk, gk))
|
.Add(New ListViewGroup(gk, gk))
|
||||||
gk = GetLviGroupName(Sites.Undefined, True, False, True)
|
gk = GetLviGroupName(Sites.Undefined, True, False, True, False)
|
||||||
.Add(New ListViewGroup(gk, gk))
|
.Add(New ListViewGroup(gk, gk))
|
||||||
For Each s In {Sites.Reddit, Sites.Twitter}
|
'Channels
|
||||||
gk = GetLviGroupName(s, False, True, False)
|
gk = GetLviGroupName(Sites.Undefined, False, True, False, True)
|
||||||
.Add(New ListViewGroup(gk, gk))
|
.Add(New ListViewGroup(gk, gk))
|
||||||
gk = GetLviGroupName(s, False, False, False)
|
gk = GetLviGroupName(Sites.Undefined, False, False, False, True)
|
||||||
.Add(New ListViewGroup(gk, gk))
|
.Add(New ListViewGroup(gk, gk))
|
||||||
gk = GetLviGroupName(s, True, False, False)
|
gk = GetLviGroupName(Sites.Undefined, True, False, False, True)
|
||||||
.Add(New ListViewGroup(gk, gk))
|
.Add(New ListViewGroup(gk, gk))
|
||||||
|
'Sites
|
||||||
|
For Each s As Sites In [Enum].GetValues(GetType(Sites))
|
||||||
|
If Not s = Sites.Undefined Then
|
||||||
|
gk = GetLviGroupName(s, False, True, False, False)
|
||||||
|
.Add(New ListViewGroup(gk, gk))
|
||||||
|
gk = GetLviGroupName(s, False, False, False, False)
|
||||||
|
.Add(New ListViewGroup(gk, gk))
|
||||||
|
gk = GetLviGroupName(s, True, False, False, False)
|
||||||
|
.Add(New ListViewGroup(gk, gk))
|
||||||
|
End If
|
||||||
Next
|
Next
|
||||||
If Settings.Labels.Count > 0 Then Settings.Labels.ToList.ForEach(Sub(l) .Add(New ListViewGroup(l, l)))
|
If Settings.Labels.Count > 0 Then Settings.Labels.ToList.ForEach(Sub(l) .Add(New ListViewGroup(l, l)))
|
||||||
.Add(Settings.Labels.NoLabel)
|
.Add(Settings.Labels.NoLabel)
|
||||||
@@ -64,6 +87,8 @@ Public Class MainFrame
|
|||||||
UpdateLabelsGroups()
|
UpdateLabelsGroups()
|
||||||
SetShowButtonsCheckers(Settings.ShowingMode.Value)
|
SetShowButtonsCheckers(Settings.ShowingMode.Value)
|
||||||
CheckVersion(False)
|
CheckVersion(False)
|
||||||
|
BTT_SITE_ALL.Checked = Settings.SelectedSites.Count = 0
|
||||||
|
BTT_SITE_SPECIFIC.Checked = Settings.SelectedSites.Count > 0
|
||||||
_UFinit = False
|
_UFinit = False
|
||||||
GoTo EndFunction
|
GoTo EndFunction
|
||||||
FormClosingInvoker:
|
FormClosingInvoker:
|
||||||
@@ -71,39 +96,80 @@ FormClosingInvoker:
|
|||||||
EndFunction:
|
EndFunction:
|
||||||
End Sub
|
End Sub
|
||||||
Private _CloseInvoked As Boolean = False
|
Private _CloseInvoked As Boolean = False
|
||||||
|
Private _IgnoreTrayOptions As Boolean = False
|
||||||
|
Private _IgnoreCloseConfirm As Boolean = False
|
||||||
Private Async Sub MainFrame_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
|
Private Async Sub MainFrame_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
|
||||||
If Not _VideoDownloadingMode Then
|
If Settings.CloseToTray And Not _IgnoreTrayOptions Then
|
||||||
If _CloseInvoked Then GoTo CloseResume
|
e.Cancel = True
|
||||||
Dim ChannelsWorking As Func(Of Boolean) = Function() If(MyChannels?.Working, False)
|
Hide()
|
||||||
If (Not Downloader.Working And Not ChannelsWorking.Invoke) OrElse
|
Else
|
||||||
MsgBoxE({"Program still downloading something..." & vbNewLine &
|
If Not _VideoDownloadingMode Then
|
||||||
"Do you really want to stop downloading and exit of program?",
|
If CheckForClose(_IgnoreCloseConfirm) Then
|
||||||
"Downloading in progress"},
|
If _CloseInvoked Then GoTo CloseResume
|
||||||
MsgBoxStyle.Exclamation,,,
|
Dim ChannelsWorking As Func(Of Boolean) = Function() If(MyChannels?.Working, False)
|
||||||
{"Stop downloading and close", "Cancel"}) = 0 Then
|
Dim SP_Working As Func(Of Boolean) = Function() If(MySavedPosts?.Working, False)
|
||||||
If Downloader.Working Then _CloseInvoked = True : Downloader.Stop()
|
If (Not Downloader.Working And Not ChannelsWorking.Invoke And Not SP_Working.Invoke) OrElse
|
||||||
If ChannelsWorking.Invoke Then _CloseInvoked = True : MyChannels.Stop(False)
|
MsgBoxE({"Program still downloading something..." & vbNewLine &
|
||||||
If _CloseInvoked Then
|
"Do you really want to stop downloading and exit of program?",
|
||||||
e.Cancel = True
|
"Downloading in progress"},
|
||||||
Await Task.Run(Sub()
|
MsgBoxStyle.Exclamation,,,
|
||||||
While Downloader.Working Or ChannelsWorking.Invoke : Thread.Sleep(500) : End While
|
{"Stop downloading and close", "Cancel"}) = 0 Then
|
||||||
End Sub)
|
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()
|
||||||
|
If _CloseInvoked Then
|
||||||
|
e.Cancel = True
|
||||||
|
Await Task.Run(Sub()
|
||||||
|
While Downloader.Working Or ChannelsWorking.Invoke Or SP_Working.Invoke : Thread.Sleep(500) : End While
|
||||||
|
End Sub)
|
||||||
|
End If
|
||||||
|
Downloader.Dispose()
|
||||||
|
InfoForm.Dispose()
|
||||||
|
If Not MyChannels Is Nothing Then MyChannels.Dispose()
|
||||||
|
If Not VideoDownloader Is Nothing Then VideoDownloader.Dispose()
|
||||||
|
If Not MySavedPosts Is Nothing Then MySavedPosts.Dispose()
|
||||||
|
MyView.Dispose(Settings.Design)
|
||||||
|
Settings.Dispose()
|
||||||
|
Else
|
||||||
|
GoTo DropCloseParams
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
GoTo DropCloseParams
|
||||||
End If
|
End If
|
||||||
Downloader.Dispose()
|
|
||||||
InfoForm.Dispose()
|
|
||||||
If Not MyChannels Is Nothing Then MyChannels.Dispose()
|
|
||||||
If Not VideoDownloader Is Nothing Then VideoDownloader.Dispose()
|
|
||||||
MyView.Dispose(Settings.Design)
|
|
||||||
Settings.Dispose()
|
|
||||||
Else
|
|
||||||
e.Cancel = True
|
|
||||||
Exit Sub
|
|
||||||
End If
|
End If
|
||||||
End If
|
GoTo CloseContinue
|
||||||
If Not MyMainLOG.IsEmptyString Then SaveLogToFile()
|
DropCloseParams:
|
||||||
If _CloseInvoked Then Close()
|
e.Cancel = True
|
||||||
|
_IgnoreTrayOptions = False
|
||||||
|
_IgnoreCloseConfirm = False
|
||||||
|
_CloseInvoked = False
|
||||||
|
Exit Sub
|
||||||
|
CloseContinue:
|
||||||
|
If Not MyMainLOG.IsEmptyString Then SaveLogToFile()
|
||||||
|
If _CloseInvoked Then Close()
|
||||||
CloseResume:
|
CloseResume:
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
#Region "Tray"
|
||||||
|
Private Sub TrayIcon_MouseClick(sender As Object, e As MouseEventArgs) Handles TrayIcon.MouseClick
|
||||||
|
If e.Button = MouseButtons.Left Then
|
||||||
|
If Visible Then Hide() Else Show()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_TRAY_SHOW_HIDE_Click(sender As Object, e As EventArgs) Handles BTT_TRAY_SHOW_HIDE.Click
|
||||||
|
If Visible Then Hide() Else Show()
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_TRAY_CLOSE_Click(sender As Object, e As EventArgs) Handles BTT_TRAY_CLOSE.Click
|
||||||
|
If CheckForClose(False) Then _IgnoreTrayOptions = True : _IgnoreCloseConfirm = True : Close()
|
||||||
|
End Sub
|
||||||
|
Private Function CheckForClose(ByVal _Ignore As Boolean) As Boolean
|
||||||
|
If Settings.ExitConfirm And Not _Ignore Then
|
||||||
|
Return MsgBoxE({"Do you want to close the program?", "Closing the program"}, MsgBoxStyle.YesNo) = MsgBoxResult.Yes
|
||||||
|
Else
|
||||||
|
Return True
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
Private Sub MainFrame_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
Private Sub MainFrame_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
||||||
Dim b As Boolean = True
|
Dim b As Boolean = True
|
||||||
Select Case e.KeyCode
|
Select Case e.KeyCode
|
||||||
@@ -162,6 +228,17 @@ CloseResume:
|
|||||||
Case View.SmallIcon : .SmallImageList.Images.Add(User.LVIKey, User.GetPicture())
|
Case View.SmallIcon : .SmallImageList.Images.Add(User.LVIKey, User.GetPicture())
|
||||||
End Select
|
End Select
|
||||||
.Items.Add(User.GetLVI(LIST_PROFILES))
|
.Items.Add(User.GetLVI(LIST_PROFILES))
|
||||||
|
If Not User.Exists Then
|
||||||
|
With .Items(.Items.Count - 1)
|
||||||
|
.BackColor = ColorBttDeleteBack
|
||||||
|
.ForeColor = ColorBttDeleteFore
|
||||||
|
End With
|
||||||
|
ElseIf User.Suspended Then
|
||||||
|
With .Items(.Items.Count - 1)
|
||||||
|
.BackColor = ColorBttEditBack
|
||||||
|
.ForeColor = ColorBttEditFore
|
||||||
|
End With
|
||||||
|
End If
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
Else
|
Else
|
||||||
@@ -180,6 +257,16 @@ CloseResume:
|
|||||||
End Select
|
End Select
|
||||||
.Items(i).Text = User.ToString
|
.Items(i).Text = User.ToString
|
||||||
.Items(i).Group = User.GetLVIGroup(LIST_PROFILES)
|
.Items(i).Group = User.GetLVIGroup(LIST_PROFILES)
|
||||||
|
If Not User.Exists Then
|
||||||
|
.Items(i).BackColor = ColorBttDeleteBack
|
||||||
|
.Items(i).ForeColor = ColorBttDeleteFore
|
||||||
|
ElseIf User.Suspended Then
|
||||||
|
.Items(i).BackColor = ColorBttEditBack
|
||||||
|
.Items(i).ForeColor = ColorBttEditFore
|
||||||
|
Else
|
||||||
|
.Items(i).BackColor = SystemColors.Window
|
||||||
|
.Items(i).ForeColor = SystemColors.WindowText
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
@@ -211,10 +298,16 @@ CloseResume:
|
|||||||
#Region "Toolbar buttons"
|
#Region "Toolbar buttons"
|
||||||
#Region "Settings"
|
#Region "Settings"
|
||||||
Private Sub BTT_SETTINGS_REDDIT_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_REDDIT.Click
|
Private Sub BTT_SETTINGS_REDDIT_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_REDDIT.Click
|
||||||
Using f As New RedditEditorForm : f.ShowDialog() : End Using
|
Using f As New SiteEditorForm(Sites.Reddit) : f.ShowDialog() : End Using
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_SETTINGS_TWITTER_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_TWITTER.Click
|
Private Sub BTT_SETTINGS_TWITTER_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_TWITTER.Click
|
||||||
Using f As New TwitterEditorForm : f.ShowDialog() : End Using
|
Using f As New SiteEditorForm(Sites.Twitter) : f.ShowDialog() : End Using
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_SETTINGS_INSTAGRAM_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_INSTAGRAM.Click
|
||||||
|
Using f As New SiteEditorForm(Sites.Instagram) : f.ShowDialog() : End Using
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_SETTINGS_REDGIFS_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_REDGIFS.Click
|
||||||
|
Using f As New SiteEditorForm(Sites.RedGifs) : f.ShowDialog() : End Using
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_SETTINGS_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS.Click
|
Private Sub BTT_SETTINGS_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS.Click
|
||||||
Dim mhl% = Settings.MaxLargeImageHeigh.Value
|
Dim mhl% = Settings.MaxLargeImageHeigh.Value
|
||||||
@@ -223,6 +316,7 @@ CloseResume:
|
|||||||
f.ShowDialog()
|
f.ShowDialog()
|
||||||
If f.DialogResult = DialogResult.OK Then
|
If f.DialogResult = DialogResult.OK Then
|
||||||
If Not Settings.MaxLargeImageHeigh = mhl Or Not Settings.MaxSmallImageHeigh = mhs Then RefillList()
|
If Not Settings.MaxLargeImageHeigh = mhl Or Not Settings.MaxSmallImageHeigh = mhs Then RefillList()
|
||||||
|
TrayIcon.Visible = Settings.CloseToTray
|
||||||
End If
|
End If
|
||||||
End Using
|
End Using
|
||||||
End Sub
|
End Sub
|
||||||
@@ -231,27 +325,32 @@ CloseResume:
|
|||||||
Private Sub BTT_ADD_USER_Click(sender As Object, e As EventArgs) Handles BTT_ADD_USER.Click
|
Private Sub BTT_ADD_USER_Click(sender As Object, e As EventArgs) Handles BTT_ADD_USER.Click
|
||||||
Using f As New UserCreatorForm
|
Using f As New UserCreatorForm
|
||||||
f.ShowDialog()
|
f.ShowDialog()
|
||||||
If f.DialogResult = DialogResult.OK Then
|
If f.DialogResult = DialogResult.OK Or f.StartIndex >= 0 Then
|
||||||
Dim i%
|
Dim i%
|
||||||
If f.StartIndex >= 0 Then
|
If f.StartIndex >= 0 Then
|
||||||
OnUsersAddedHandler(f.StartIndex)
|
OnUsersAddedHandler(f.StartIndex)
|
||||||
Else
|
Else
|
||||||
i = Settings.Users.FindIndex(Function(u) u.Site = f.User.Site And u.Name = f.User.Name)
|
Dim SimpleUser As Predicate(Of IUserData) = Function(u) u.Site = f.User.Site And u.Name = f.User.Name
|
||||||
|
i = Settings.Users.FindIndex(Function(u) If(u.IsCollection, DirectCast(u, UserDataBind).Collections.Exists(SimpleUser), SimpleUser.Invoke(u)))
|
||||||
If i < 0 Then
|
If i < 0 Then
|
||||||
If Not UserBanned(f.User.Name) Then
|
If Not UserBanned(f.User.Name) Then
|
||||||
Settings.UpdateUsersList(f.User)
|
Settings.UpdateUsersList(f.User)
|
||||||
Settings.Users.Add(UserDataBase.GetInstance(f.User))
|
Settings.Users.Add(UserDataBase.GetInstance(f.User))
|
||||||
With Settings.Users(Settings.Users.Count - 1)
|
With Settings.Users.Last
|
||||||
.Favorite = f.UserFavorite
|
If Not .FileExists Then
|
||||||
.Temporary = f.UserTemporary
|
.Favorite = f.UserFavorite
|
||||||
.ParseUserMediaOnly = f.UserMediaOnly
|
.Temporary = f.UserTemporary
|
||||||
.ReadyForDownload = f.UserReady
|
.ParseUserMediaOnly = f.UserMediaOnly
|
||||||
.FriendlyName = f.UserFriendly
|
.ReadyForDownload = f.UserReady
|
||||||
.Description = f.UserDescr
|
.DownloadImages = f.DownloadImages
|
||||||
.Labels.ListAddList(f.UserLabels, LAP.ClearBeforeAdd, LAP.NotContainsOnly)
|
.DownloadVideos = f.DownloadVideos
|
||||||
.UpdateUserInformation()
|
.FriendlyName = f.UserFriendly
|
||||||
|
.Description = f.UserDescr
|
||||||
|
.Self.Labels.ListAddList(f.UserLabels, LAP.ClearBeforeAdd, LAP.NotContainsOnly)
|
||||||
|
.UpdateUserInformation()
|
||||||
|
End If
|
||||||
End With
|
End With
|
||||||
UserListUpdate(Settings.Users(Settings.Users.Count - 1), True)
|
UserListUpdate(Settings.Users.Last, True)
|
||||||
i = LIST_PROFILES.Items.IndexOfKey(Settings.Users(Settings.Users.Count - 1).LVIKey)
|
i = LIST_PROFILES.Items.IndexOfKey(Settings.Users(Settings.Users.Count - 1).LVIKey)
|
||||||
If i >= 0 Then
|
If i >= 0 Then
|
||||||
LIST_PROFILES.SelectedIndices.Clear()
|
LIST_PROFILES.SelectedIndices.Clear()
|
||||||
@@ -306,9 +405,19 @@ CloseResume:
|
|||||||
If MyChannels Is Nothing Then
|
If MyChannels Is Nothing Then
|
||||||
MyChannels = New ChannelViewForm
|
MyChannels = New ChannelViewForm
|
||||||
AddHandler MyChannels.OnUsersAdded, AddressOf OnUsersAddedHandler
|
AddHandler MyChannels.OnUsersAdded, AddressOf OnUsersAddedHandler
|
||||||
|
AddHandler MyChannels.OnDownloadDone, AddressOf NotificationMessage
|
||||||
End If
|
End If
|
||||||
If MyChannels.Visible Then MyChannels.BringToFront() Else MyChannels.Show()
|
If MyChannels.Visible Then MyChannels.BringToFront() Else MyChannels.Show()
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub BTT_DOWN_SAVED_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_SAVED.Click
|
||||||
|
If MySavedPosts Is Nothing Then
|
||||||
|
MySavedPosts = New DownloadSavedPostsForm
|
||||||
|
AddHandler MySavedPosts.OnDownloadDone, AddressOf NotificationMessage
|
||||||
|
End If
|
||||||
|
With MySavedPosts
|
||||||
|
If .Visible Then .BringToFront() Else .Show()
|
||||||
|
End With
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Download"
|
#Region "Download"
|
||||||
Private Sub BTT_DOWN_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_SELECTED.Click
|
Private Sub BTT_DOWN_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_SELECTED.Click
|
||||||
@@ -357,6 +466,25 @@ CloseResume:
|
|||||||
BTT_VIEW_LIST.Checked = List
|
BTT_VIEW_LIST.Checked = List
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "View Site"
|
||||||
|
Private Sub BTT_SITE_ALL_Click(sender As Object, e As EventArgs) Handles BTT_SITE_ALL.Click
|
||||||
|
Settings.SelectedSites = Nothing
|
||||||
|
If Not BTT_SITE_ALL.Checked Then Settings.SelectedSites = Nothing : RefillList()
|
||||||
|
BTT_SITE_ALL.Checked = True
|
||||||
|
BTT_SITE_SPECIFIC.Checked = False
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_SITE_SPECIFIC_Click(sender As Object, e As EventArgs) Handles BTT_SITE_SPECIFIC.Click
|
||||||
|
Using f As New SiteSelectionForm(Settings.SelectedSites)
|
||||||
|
f.ShowDialog()
|
||||||
|
If f.DialogResult = DialogResult.OK Then
|
||||||
|
Settings.SelectedSites = f.SelectedSites
|
||||||
|
BTT_SITE_SPECIFIC.Checked = Settings.SelectedSites.Count > 0
|
||||||
|
BTT_SITE_ALL.Checked = Settings.SelectedSites.Count = 0
|
||||||
|
RefillList()
|
||||||
|
End If
|
||||||
|
End Using
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
#Region "Labels"
|
#Region "Labels"
|
||||||
Private Sub BTT_SHOW_ALL_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_ALL.Click
|
Private Sub BTT_SHOW_ALL_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_ALL.Click
|
||||||
SetShowButtonsCheckers(ShowingModes.All)
|
SetShowButtonsCheckers(ShowingModes.All)
|
||||||
@@ -403,7 +531,7 @@ CloseResume:
|
|||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
Settings.ShowingMode.Value = m
|
Settings.ShowingMode.Value = m
|
||||||
If Not m = ShowingModes.All Then BTT_DOWN_ALL.Enabled = False
|
BTT_DOWN_ALL.Enabled = m = ShowingModes.All
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_SELECT_LABELS_Click(sender As Object, e As EventArgs) Handles BTT_SELECT_LABELS.Click
|
Private Sub BTT_SELECT_LABELS_Click(sender As Object, e As EventArgs) Handles BTT_SELECT_LABELS.Click
|
||||||
OpenLabelsForm()
|
OpenLabelsForm()
|
||||||
@@ -435,6 +563,9 @@ CloseResume:
|
|||||||
Private Sub BTT_LOG_Click(sender As Object, e As EventArgs) Handles BTT_LOG.Click
|
Private Sub BTT_LOG_Click(sender As Object, e As EventArgs) Handles BTT_LOG.Click
|
||||||
MyMainLOG_ShowForm(Settings.Design)
|
MyMainLOG_ShowForm(Settings.Design)
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub BTT_DONATE_Click(sender As Object, e As EventArgs) Handles BTT_DONATE.Click
|
||||||
|
Try : Process.Start("https://ko-fi.com/andyprogram") : Catch : End Try
|
||||||
|
End Sub
|
||||||
#Region "List functions"
|
#Region "List functions"
|
||||||
Private _LatestSelected As Integer = -1
|
Private _LatestSelected As Integer = -1
|
||||||
Private Sub LIST_PROFILES_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_PROFILES.SelectedIndexChanged
|
Private Sub LIST_PROFILES_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_PROFILES.SelectedIndexChanged
|
||||||
@@ -483,6 +614,16 @@ CloseResume:
|
|||||||
End Sub)
|
End Sub)
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub BTT_CONTEXT_READY_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_READY.Click
|
||||||
|
Dim users As List(Of IUserData) = GetSelectedUserArray()
|
||||||
|
If AskForMassReplace(users, "Ready for download") Then
|
||||||
|
Dim r As Boolean = MsgBoxE({"What state do you want to set for selected users", "Select ready state"}, vbQuestion,,, {"Not Ready", "Ready"}).Index
|
||||||
|
users.ForEach(Sub(u)
|
||||||
|
u.ReadyForDownload = r
|
||||||
|
u.UpdateUserInformation()
|
||||||
|
End Sub)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
Private Sub BTT_CONTEXT_GROUPS_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_GROUPS.Click
|
Private Sub BTT_CONTEXT_GROUPS_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_GROUPS.Click
|
||||||
Try
|
Try
|
||||||
Dim users As List(Of IUserData) = GetSelectedUserArray()
|
Dim users As List(Of IUserData) = GetSelectedUserArray()
|
||||||
@@ -500,7 +641,7 @@ CloseResume:
|
|||||||
If .Count > 0 Then .Collections.ForEach(Sub(uu) uu.Labels.ListAddList(f.LabelsList, lp))
|
If .Count > 0 Then .Collections.ForEach(Sub(uu) uu.Labels.ListAddList(f.LabelsList, lp))
|
||||||
End With
|
End With
|
||||||
Else
|
Else
|
||||||
u.Labels.ListAddList(f.LabelsList, lp)
|
u.Self.Labels.ListAddList(f.LabelsList, lp)
|
||||||
End If
|
End If
|
||||||
u.UpdateUserInformation()
|
u.UpdateUserInformation()
|
||||||
End Sub)
|
End Sub)
|
||||||
@@ -590,6 +731,86 @@ CloseResume:
|
|||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub BTT_CONTEXT_CHANGE_FOLDER_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_CHANGE_FOLDER.Click
|
||||||
|
Try
|
||||||
|
Dim users As List(Of IUserData) = GetSelectedUserArray()
|
||||||
|
If users.ListExists Then
|
||||||
|
If users.Count = 1 Then
|
||||||
|
Dim CutOption% = 1
|
||||||
|
Dim _IsCollection As Boolean = False
|
||||||
|
With users(0)
|
||||||
|
If .IsCollection Then
|
||||||
|
_IsCollection = True
|
||||||
|
With DirectCast(.Self, UserDataBind)
|
||||||
|
If .Count = 0 Then
|
||||||
|
Throw New ArgumentOutOfRangeException("Collection", "Collection is empty")
|
||||||
|
Else
|
||||||
|
With DirectCast(.Collections(0).Self, UserDataBase)
|
||||||
|
If Not .User.Merged Then CutOption = 2
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
|
||||||
|
Dim CurrDir As SFile = users(0).File.CutPath(CutOption)
|
||||||
|
Dim NewDest As SFile = SFile.GetPath(InputBoxE($"Enter a new destination for user [{users(0)}]", "Change user folder", CurrDir.Path))
|
||||||
|
If Not NewDest.IsEmptyString Then
|
||||||
|
If MsgBoxE({$"You are changing the user's [{users(0)}] destination" & vbCr &
|
||||||
|
$"Current destination: {CurrDir.PathNoSeparator}" & vbCr &
|
||||||
|
$"New destination: {NewDest.Path}",
|
||||||
|
"Changing user destination"}, MsgBoxStyle.Exclamation,,, {"Confirm", "Cancel"}) = 0 Then
|
||||||
|
If Not NewDest.IsEmptyString AndAlso
|
||||||
|
(Not NewDest.Exists(SFO.Path, False) OrElse
|
||||||
|
(
|
||||||
|
SFile.GetFiles(NewDest,, IO.SearchOption.AllDirectories, EDP.ThrowException).ListIfNothing.Count = 0 AndAlso
|
||||||
|
NewDest.Delete(SFO.Path, False, False, EDP.ThrowException) AndAlso
|
||||||
|
Not NewDest.Exists(SFO.Path, False)
|
||||||
|
)
|
||||||
|
) Then
|
||||||
|
NewDest.CutPath.Exists(SFO.Path)
|
||||||
|
IO.Directory.Move(CurrDir.Path, NewDest.Path)
|
||||||
|
Dim ApplyChanges As Action(Of IUserData) = Sub(ByVal __user As IUserData)
|
||||||
|
With DirectCast(__user.Self, UserDataBase)
|
||||||
|
Dim u As UserInfo = .User.Clone
|
||||||
|
Settings.UsersList.Remove(u)
|
||||||
|
Dim d As SFile = Nothing
|
||||||
|
If _IsCollection Then d = SFile.GetPath($"{NewDest.PathWithSeparator}{u.File.PathFolders(1).LastOrDefault}")
|
||||||
|
If d.IsEmptyString Then d = NewDest
|
||||||
|
u.SpecialPath = d.PathWithSeparator
|
||||||
|
u.UpdateUserFile()
|
||||||
|
Settings.UpdateUsersList(u)
|
||||||
|
.User = u.Clone
|
||||||
|
.UpdateUserInformation()
|
||||||
|
End With
|
||||||
|
End Sub
|
||||||
|
If users(0).IsCollection Then
|
||||||
|
With DirectCast(users(0), UserDataBind)
|
||||||
|
For Each user In .Collections : ApplyChanges(user) : Next
|
||||||
|
End With
|
||||||
|
Else
|
||||||
|
ApplyChanges(users(0))
|
||||||
|
End If
|
||||||
|
MsgBoxE($"User data has been moved")
|
||||||
|
Else
|
||||||
|
MsgBoxE($"Unable to move user data to new destination [{NewDest}]{vbCr}Operation canceled", MsgBoxStyle.Critical)
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
MsgBoxE("Operation canceled")
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
MsgBoxE("You have not entered a new destination" & vbCr & "Operation canceled", MsgBoxStyle.Exclamation)
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
MsgBoxE("You have selected multiple users. You can change the folder only for one user!", MsgBoxStyle.Critical)
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
MsgBoxE("No one user selected", MsgBoxStyle.Exclamation)
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.ShowAllMsg, ex, "Error while moving user")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
Private Sub BTT_CONTEXT_OPEN_PATH_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_PATH.Click
|
Private Sub BTT_CONTEXT_OPEN_PATH_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_PATH.Click
|
||||||
OpenFolder()
|
OpenFolder()
|
||||||
End Sub
|
End Sub
|
||||||
@@ -599,7 +820,7 @@ CloseResume:
|
|||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_CONTEXT_INFO_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_INFO.Click
|
Private Sub BTT_CONTEXT_INFO_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_INFO.Click
|
||||||
Dim user As IUserData = GetSelectedUser()
|
Dim user As IUserData = GetSelectedUser()
|
||||||
If Not user Is Nothing Then MsgBoxE(DirectCast(user, UserDataBase).GetUserInformation())
|
If Not user Is Nothing Then MsgBoxE(DirectCast(user.Self, UserDataBase).GetUserInformation())
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub USER_CONTEXT_VisibleChanged(sender As Object, e As EventArgs) Handles USER_CONTEXT.VisibleChanged
|
Private Sub USER_CONTEXT_VisibleChanged(sender As Object, e As EventArgs) Handles USER_CONTEXT.VisibleChanged
|
||||||
Try
|
Try
|
||||||
@@ -688,7 +909,7 @@ CloseResume:
|
|||||||
On Error Resume Next
|
On Error Resume Next
|
||||||
If user.IsCollection Then
|
If user.IsCollection Then
|
||||||
If USER_CONTEXT.Visible Then USER_CONTEXT.Hide()
|
If USER_CONTEXT.Visible Then USER_CONTEXT.Hide()
|
||||||
MsgBoxE("This is collection!{vbNewLine}Edit collections does not allowed!", vbExclamation)
|
MsgBoxE($"This is collection!{vbNewLine}Edit collections does not allowed!", vbExclamation)
|
||||||
Else
|
Else
|
||||||
Using f As New UserCreatorForm(user)
|
Using f As New UserCreatorForm(user)
|
||||||
f.ShowDialog()
|
f.ShowDialog()
|
||||||
@@ -704,26 +925,51 @@ CloseResume:
|
|||||||
If USER_CONTEXT.Visible Then USER_CONTEXT.Hide()
|
If USER_CONTEXT.Visible Then USER_CONTEXT.Hide()
|
||||||
Dim ugn As Func(Of IUserData, String) = Function(u) $"{IIf(u.IsCollection, "Collection", "User")}: {u.Name}"
|
Dim ugn As Func(Of IUserData, String) = Function(u) $"{IIf(u.IsCollection, "Collection", "User")}: {u.Name}"
|
||||||
Dim m As New MMessage(users.Select(ugn).ListToString(, vbNewLine), "Users deleting",
|
Dim m As New MMessage(users.Select(ugn).ListToString(, vbNewLine), "Users deleting",
|
||||||
{New Messaging.MsgBoxButton("Delete and ban") With {.ToolTip = "Users will be deleted and added to the blacklist"},
|
{New Messaging.MsgBoxButton("Delete and ban") With {.ToolTip = "Users and their data will be deleted and added to the blacklist"},
|
||||||
|
New Messaging.MsgBoxButton("Delete user only and ban") With {
|
||||||
|
.ToolTip = "Users will be deleted and added to the blacklist (user data will not be deleted)"},
|
||||||
New Messaging.MsgBoxButton("Delete and ban with reason") With {
|
New Messaging.MsgBoxButton("Delete and ban with reason") With {
|
||||||
.ToolTip = "Users will be deleted and added to the blacklist with set a reason to delete"},
|
.ToolTip = "Users and their data will be deleted and added to the blacklist with set a reason to delete"},
|
||||||
"Delete", "Cancel"}, MsgBoxStyle.Exclamation) With {.ButtonsPerRow = 2}
|
New Messaging.MsgBoxButton("Delete user only and ban with reason") With {
|
||||||
|
.ToolTip = "Users will be deleted and added to the blacklist with set a reason to delete (user data will not be deleted)"},
|
||||||
|
New Messaging.MsgBoxButton("Delete") With {.ToolTip = "Delete users and their data"},
|
||||||
|
New Messaging.MsgBoxButton("Delete user only") With {.ToolTip = "Delete users but keep data"}, "Cancel"},
|
||||||
|
MsgBoxStyle.Exclamation) With {.ButtonsPerRow = 2, .ButtonsPlacing = MMessage.ButtonsPlacings.StartToEnd}
|
||||||
m.Text = $"The following users ({users.Count}) will be deleted:{vbNewLine}{m.Text}"
|
m.Text = $"The following users ({users.Count}) will be deleted:{vbNewLine}{m.Text}"
|
||||||
Dim result% = MsgBoxE(m)
|
Dim result% = MsgBoxE(m)
|
||||||
If result < 3 Then
|
If result < 6 Then
|
||||||
Dim removedUsers As New List(Of String)
|
Dim removedUsers As New List(Of String)
|
||||||
|
Dim keepData As Boolean = Not (result Mod 2) = 0
|
||||||
|
Dim banUser As Boolean = result < 4
|
||||||
|
Dim setReason As Boolean = banUser And result > 1
|
||||||
Dim leftUsers As New List(Of String)
|
Dim leftUsers As New List(Of String)
|
||||||
Dim l As New ListAddParams(LAP.NotContainsOnly)
|
Dim l As New ListAddParams(LAP.NotContainsOnly)
|
||||||
Dim b As Boolean = False
|
Dim b As Boolean = False
|
||||||
Dim reason$ = String.Empty
|
Dim reason$ = String.Empty
|
||||||
If result = 1 Then reason = InputBoxE("Enter a deletion reason:", "Deletion reason")
|
If setReason Then reason = InputBoxE("Enter a deletion reason:", "Deletion reason")
|
||||||
For Each user In users
|
For Each user In users
|
||||||
If user.Delete > 0 Then
|
If keepData Then
|
||||||
If result < 2 Then Settings.BlackList.ListAddValue(New UserBan(user.Name, reason), l) : b = True
|
If banUser Then Settings.BlackList.ListAddValue(New UserBan(user.Name, reason), l) : b = True
|
||||||
|
If user.IsCollection Then
|
||||||
|
With DirectCast(user, UserDataBind)
|
||||||
|
If .Count > 0 Then .Collections.ForEach(Sub(c) Settings.UsersList.Remove(DirectCast(c.Self, UserDataBase).User))
|
||||||
|
End With
|
||||||
|
Else
|
||||||
|
Settings.UsersList.Remove(DirectCast(user.Self, UserDataBase).User)
|
||||||
|
End If
|
||||||
|
Settings.Users.Remove(user)
|
||||||
|
Settings.UpdateUsersList()
|
||||||
RemoveUserFromList(user)
|
RemoveUserFromList(user)
|
||||||
removedUsers.Add(ugn(user))
|
removedUsers.Add(ugn(user))
|
||||||
|
user.Dispose()
|
||||||
Else
|
Else
|
||||||
leftUsers.Add(ugn(user))
|
If user.Delete > 0 Then
|
||||||
|
If banUser Then Settings.BlackList.ListAddValue(New UserBan(user.Name, reason), l) : b = True
|
||||||
|
RemoveUserFromList(user)
|
||||||
|
removedUsers.Add(ugn(user))
|
||||||
|
Else
|
||||||
|
leftUsers.Add(ugn(user))
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
m = New MMessage(String.Empty, "Users deleting")
|
m = New MMessage(String.Empty, "Users deleting")
|
||||||
@@ -757,7 +1003,7 @@ CloseResume:
|
|||||||
Dim l%? = Nothing
|
Dim l%? = Nothing
|
||||||
If UseLimits Then
|
If UseLimits Then
|
||||||
Do
|
Do
|
||||||
l = AConvert(Of Integer)(InputBoxE("Enter top posts limit for downloading:", "Download limit", 10), Nothing)
|
l = AConvert(Of Integer)(InputBoxE("Enter top posts limit for downloading:", "Download limit", 10), AModes.Var, Nothing)
|
||||||
If l.HasValue Then
|
If l.HasValue Then
|
||||||
Select Case MsgBoxE(New MMessage($"You are set up downloading top [{l.Value}] posts", "Download limit",
|
Select Case MsgBoxE(New MMessage($"You are set up downloading top [{l.Value}] posts", "Download limit",
|
||||||
{"Confirm", "Try again", "Disable limit", "Cancel"}) With {.ButtonsPerRow = 2}).Index
|
{"Confirm", "Try again", "Disable limit", "Cancel"}) With {.ButtonsPerRow = 2}).Index
|
||||||
@@ -798,21 +1044,33 @@ ResumeDownloadingOperation:
|
|||||||
If Not user Is Nothing Then user.OpenFolder()
|
If Not user Is Nothing Then user.OpenFolder()
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
Friend Sub User_OnPictureUpdated(ByVal User As IUserData)
|
Friend Sub User_OnUserUpdated(ByVal User As IUserData)
|
||||||
UserListUpdate(User, False)
|
UserListUpdate(User, False)
|
||||||
End Sub
|
End Sub
|
||||||
Private _LogVisible As Boolean = False
|
Private _LogColorChanged As Boolean = False
|
||||||
Private Sub Downloader_UpdateJobsCount(ByVal TotalCount As Integer)
|
Private Sub Downloader_UpdateJobsCount(ByVal Site As Sites, ByVal TotalCount As Integer)
|
||||||
Dim a As Action = Sub() LBL_JOBS_COUNT.Text = IIf(TotalCount = 0, String.Empty, $"[Jobs {TotalCount}]")
|
Dim a As Action
|
||||||
|
If Site = Sites.Instagram Then
|
||||||
|
a = Sub() LBL_JOBS_INST_COUNT.Text = IIf(TotalCount = 0, String.Empty, $"[Jobs {TotalCount}]")
|
||||||
|
Else
|
||||||
|
a = Sub() LBL_JOBS_COUNT.Text = IIf(TotalCount = 0, String.Empty, $"[Jobs {TotalCount}]")
|
||||||
|
End If
|
||||||
If Toolbar_BOTTOM.InvokeRequired Then Toolbar_BOTTOM.Invoke(a) Else a.Invoke
|
If Toolbar_BOTTOM.InvokeRequired Then Toolbar_BOTTOM.Invoke(a) Else a.Invoke
|
||||||
If Not _LogVisible AndAlso Not MyMainLOG.IsEmptyString Then
|
If Not _LogColorChanged AndAlso Not MyMainLOG.IsEmptyString Then
|
||||||
a = Sub() BTT_LOG.ControlChangeColor(False)
|
a = Sub() BTT_LOG.ControlChangeColor(False)
|
||||||
If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke
|
If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke
|
||||||
_LogVisible = True
|
_LogColorChanged = True
|
||||||
|
ElseIf _LogColorChanged And MyMainLOG.IsEmptyString Then
|
||||||
|
a = Sub() BTT_LOG.ControlChangeColor(SystemColors.Control, SystemColors.ControlText)
|
||||||
|
If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke
|
||||||
|
_LogColorChanged = False
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Downloader_OnDownloading(ByVal Value As Boolean)
|
Private Sub Downloader_OnDownloading(ByVal Value As Boolean)
|
||||||
Dim a As Action = Sub() BTT_DOWN_STOP.Enabled = Not Value
|
Dim a As Action = Sub() BTT_DOWN_STOP.Enabled = Value
|
||||||
If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke
|
If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub NotificationMessage(ByVal Message As String)
|
||||||
|
If Settings.ShowNotifications Then TrayIcon.ShowBalloonTip(2000, TrayIcon.BalloonTipTitle, Message, ToolTipIcon.Info)
|
||||||
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
@@ -1,15 +1,27 @@
|
|||||||
Imports PersonalUtilities.Functions.XML
|
' 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.Functions.XML
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
|
Imports PersonalUtilities.Tools.WEB
|
||||||
|
Imports PersonalUtilities.Forms.Toolbars
|
||||||
Imports SCrawler.API
|
Imports SCrawler.API
|
||||||
Imports SCrawler.API.Base
|
Imports SCrawler.API.Base
|
||||||
Friend Module MainMod
|
Friend Module MainMod
|
||||||
Friend Settings As SettingsCLS
|
Friend Settings As SettingsCLS
|
||||||
Friend Const SettingsFolderName As String = "Settings"
|
Friend Const SettingsFolderName As String = "Settings"
|
||||||
Friend ReadOnly LinkPattern As New RegexStructure("[htps:]{0,6}[/]{0,2}(.+)", 1)
|
Friend ReadOnly LinkPattern As RParams = RParams.DMS("[htps:]{0,6}[/]{0,2}(.+)", 1)
|
||||||
Friend ReadOnly FilesPattern As New RegexStructure("[^\./]+?\.\w+", True, False, 1)
|
Friend ReadOnly FilesPattern As RParams = RParams.DM("[^\./]+?\.\w+", 1, EDP.ReturnValue)
|
||||||
Friend Const LVI_TempOption As String = "Temp"
|
Friend Const LVI_TempOption As String = "Temp"
|
||||||
Friend Const LVI_FavOption As String = "Favorite"
|
Friend Const LVI_FavOption As String = "Favorite"
|
||||||
Friend Const CannelsLabelName As String = "Channels"
|
Friend Const CannelsLabelName As String = "Channels"
|
||||||
Friend Const LVI_CollectionOption As String = "Collection"
|
Friend Const LVI_CollectionOption As String = "Collection"
|
||||||
|
Friend Const LVI_ChannelOption As String = "Channel"
|
||||||
Friend Enum ViewModes As Integer
|
Friend Enum ViewModes As Integer
|
||||||
IconLarge = 0
|
IconLarge = 0
|
||||||
IconSmall = 2
|
IconSmall = 2
|
||||||
@@ -27,8 +39,21 @@ Friend Module MainMod
|
|||||||
Friend InfoForm As DownloadedInfoForm
|
Friend InfoForm As DownloadedInfoForm
|
||||||
Friend VideoDownloader As VideosDownloaderForm
|
Friend VideoDownloader As VideosDownloaderForm
|
||||||
Friend ReadOnly ParsersDataDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
|
Friend ReadOnly ParsersDataDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
|
||||||
Friend Property MainProgress As PersonalUtilities.Forms.Toolbars.MyProgress
|
#Region "File name operations"
|
||||||
Friend Function GetLviGroupName(ByVal Site As Sites, ByVal Temp As Boolean, ByVal Fav As Boolean, ByVal IsCollection As Boolean) As String
|
Friend FileDateAppenderProvider As IFormatProvider
|
||||||
|
''' <summary>File, Date</summary>
|
||||||
|
Friend FileDateAppenderPattern As String
|
||||||
|
Friend Class NumberedFile : Inherits SFileNumbers
|
||||||
|
Friend Sub New(ByVal f As SFile)
|
||||||
|
FileName = f.Name
|
||||||
|
NumberProvider = New ANumbers With {.Format = ANumbers.Formats.NumberGroup, .GroupSize = 5}
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
|
#End Region
|
||||||
|
Friend Property MainProgress As MyProgress
|
||||||
|
Friend Property MainProgressInst As MyProgress
|
||||||
|
Friend Function GetLviGroupName(ByVal Site As Sites, ByVal Temp As Boolean, ByVal Fav As Boolean,
|
||||||
|
ByVal IsCollection As Boolean, ByVal IsChannel As Boolean) As String
|
||||||
Dim Opt$ = String.Empty
|
Dim Opt$ = String.Empty
|
||||||
If Temp Then
|
If Temp Then
|
||||||
Opt = LVI_TempOption
|
Opt = LVI_TempOption
|
||||||
@@ -38,6 +63,8 @@ Friend Module MainMod
|
|||||||
If Not Opt.IsEmptyString Then Opt = $" ({Opt})"
|
If Not Opt.IsEmptyString Then Opt = $" ({Opt})"
|
||||||
If IsCollection Then
|
If IsCollection Then
|
||||||
Return $"{LVI_CollectionOption}{Opt}"
|
Return $"{LVI_CollectionOption}{Opt}"
|
||||||
|
ElseIf IsChannel Then
|
||||||
|
Return $"{LVI_ChannelOption}{Opt}"
|
||||||
Else
|
Else
|
||||||
Return $"{Site}{Opt}"
|
Return $"{Site}{Opt}"
|
||||||
End If
|
End If
|
||||||
@@ -46,32 +73,38 @@ Friend Module MainMod
|
|||||||
Undefined = 0
|
Undefined = 0
|
||||||
Reddit = 1
|
Reddit = 1
|
||||||
Twitter = 2
|
Twitter = 2
|
||||||
|
Instagram = 3
|
||||||
|
RedGifs = 4
|
||||||
End Enum
|
End Enum
|
||||||
Friend Structure UserInfo : Implements IComparable(Of UserInfo), IEquatable(Of UserInfo), ICloneable
|
Friend Structure UserInfo : Implements IComparable(Of UserInfo), IEquatable(Of UserInfo), ICloneable
|
||||||
Friend Const Name_Site As String = "Site"
|
Friend Const Name_Site As String = "Site"
|
||||||
Friend Const Name_Collection As String = "Collection"
|
Friend Const Name_Collection As String = "Collection"
|
||||||
Friend Const Name_Merged As String = "Merged"
|
Friend Const Name_Merged As String = "Merged"
|
||||||
Friend Const Name_IsChannel As String = "IsChannel"
|
Friend Const Name_IsChannel As String = "IsChannel"
|
||||||
|
Friend Const Name_SpecialPath As String = "SpecialPath"
|
||||||
Friend Name As String
|
Friend Name As String
|
||||||
Friend Site As Sites
|
Friend Site As Sites
|
||||||
Friend File As SFile
|
Friend File As SFile
|
||||||
|
Friend SpecialPath As SFile
|
||||||
Friend Merged As Boolean
|
Friend Merged As Boolean
|
||||||
Friend IncludedInCollection As Boolean
|
Friend IncludedInCollection As Boolean
|
||||||
Friend CollectionName As String
|
Friend CollectionName As String
|
||||||
Friend IsChannel As Boolean
|
Friend IsChannel As Boolean
|
||||||
Friend Sub New(ByVal _Name As String, ByVal s As Sites, Optional ByVal Collection As String = Nothing,
|
Friend Sub New(ByVal _Name As String, ByVal s As Sites, Optional ByVal Collection As String = Nothing,
|
||||||
Optional ByVal _Merged As Boolean = False)
|
Optional ByVal _Merged As Boolean = False, Optional ByVal _SpecialPath As SFile = Nothing)
|
||||||
Name = _Name
|
Name = _Name
|
||||||
Site = s
|
Site = s
|
||||||
IncludedInCollection = Not Collection.IsEmptyString
|
IncludedInCollection = Not Collection.IsEmptyString
|
||||||
CollectionName = Collection
|
CollectionName = Collection
|
||||||
Merged = _Merged
|
Merged = _Merged
|
||||||
|
SpecialPath = _SpecialPath
|
||||||
UpdateUserFile()
|
UpdateUserFile()
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub New(ByVal x As EContainer)
|
Friend Sub New(ByVal x As EContainer)
|
||||||
Me.New(x.Value,
|
Me.New(x.Value,
|
||||||
x.Attribute(Name_Site).Value.FromXML(Of Integer)(CInt(Sites.Undefined)),
|
x.Attribute(Name_Site).Value.FromXML(Of Integer)(CInt(Sites.Undefined)),
|
||||||
x.Attribute(Name_Collection).Value, x.Attribute(Name_Merged).Value.FromXML(Of Boolean)(False))
|
x.Attribute(Name_Collection).Value, x.Attribute(Name_Merged).Value.FromXML(Of Boolean)(False),
|
||||||
|
SFile.GetPath(x.Attribute(Name_SpecialPath).Value))
|
||||||
IsChannel = x.Attribute(Name_IsChannel).Value.FromXML(Of Boolean)(False)
|
IsChannel = x.Attribute(Name_IsChannel).Value.FromXML(Of Boolean)(False)
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub New(ByVal c As Reddit.Channel)
|
Friend Sub New(ByVal c As Reddit.Channel)
|
||||||
@@ -104,13 +137,15 @@ Friend Module MainMod
|
|||||||
}
|
}
|
||||||
End Sub
|
End Sub
|
||||||
Private Function GetFilePathByParams() As String
|
Private Function GetFilePathByParams() As String
|
||||||
If Merged And IncludedInCollection Then
|
If Not SpecialPath.IsEmptyString Then
|
||||||
|
Return $"{SpecialPath.PathWithSeparator}{SettingsFolderName}"
|
||||||
|
ElseIf Merged And IncludedInCollection Then
|
||||||
Return $"{Settings.CollectionsPathF.PathNoSeparator}\{CollectionName}\{SettingsFolderName}"
|
Return $"{Settings.CollectionsPathF.PathNoSeparator}\{CollectionName}\{SettingsFolderName}"
|
||||||
Else
|
Else
|
||||||
If IncludedInCollection Then
|
If IncludedInCollection Then
|
||||||
Return $"{Settings.CollectionsPathF.PathNoSeparator}\{CollectionName}\{Site}_{Name}\{SettingsFolderName}"
|
Return $"{Settings.CollectionsPathF.PathNoSeparator}\{CollectionName}\{Site}_{Name}\{SettingsFolderName}"
|
||||||
Else
|
Else
|
||||||
Return $"{Settings.Site(Site).Path.PathNoSeparator}\{Name}\{SettingsFolderName}"
|
Return $"{Settings(Site).Path.PathNoSeparator}\{Name}\{SettingsFolderName}"
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
@@ -118,7 +153,8 @@ Friend Module MainMod
|
|||||||
Return New EContainer("User", Name, {New EAttribute(Name_Site, CInt(Site)),
|
Return New EContainer("User", Name, {New EAttribute(Name_Site, CInt(Site)),
|
||||||
New EAttribute(Name_Collection, CollectionName),
|
New EAttribute(Name_Collection, CollectionName),
|
||||||
New EAttribute(Name_Merged, Merged.BoolToInteger),
|
New EAttribute(Name_Merged, Merged.BoolToInteger),
|
||||||
New EAttribute(Name_IsChannel, IsChannel.BoolToInteger)})
|
New EAttribute(Name_IsChannel, IsChannel.BoolToInteger),
|
||||||
|
New EAttribute(Name_SpecialPath, SpecialPath.PathWithSeparator)})
|
||||||
End Function
|
End Function
|
||||||
Friend Function CompareTo(ByVal Other As UserInfo) As Integer Implements IComparable(Of UserInfo).CompareTo
|
Friend Function CompareTo(ByVal Other As UserInfo) As Integer Implements IComparable(Of UserInfo).CompareTo
|
||||||
If Site = Other.Site Then
|
If Site = Other.Site Then
|
||||||
@@ -138,12 +174,15 @@ Friend Module MainMod
|
|||||||
.Name = Name,
|
.Name = Name,
|
||||||
.Site = Site,
|
.Site = Site,
|
||||||
.File = File,
|
.File = File,
|
||||||
|
.SpecialPath = SpecialPath,
|
||||||
.Merged = Merged,
|
.Merged = Merged,
|
||||||
.IncludedInCollection = IncludedInCollection,
|
.IncludedInCollection = IncludedInCollection,
|
||||||
.CollectionName = CollectionName
|
.CollectionName = CollectionName,
|
||||||
|
.IsChannel = IsChannel
|
||||||
}
|
}
|
||||||
End Function
|
End Function
|
||||||
End Structure
|
End Structure
|
||||||
|
#Region "Image Handlers management"
|
||||||
Friend Sub ImageHandler(ByVal User As IUserData)
|
Friend Sub ImageHandler(ByVal User As IUserData)
|
||||||
ImageHandler(User, False)
|
ImageHandler(User, False)
|
||||||
ImageHandler(User, True)
|
ImageHandler(User, True)
|
||||||
@@ -151,9 +190,9 @@ Friend Module MainMod
|
|||||||
Friend Sub ImageHandler(ByVal User As IUserData, ByVal Add As Boolean)
|
Friend Sub ImageHandler(ByVal User As IUserData, ByVal Add As Boolean)
|
||||||
Try
|
Try
|
||||||
If Add Then
|
If Add Then
|
||||||
AddHandler User.OnPictureUpdated, AddressOf MainFrame.User_OnPictureUpdated
|
AddHandler User.Self.OnUserUpdated, AddressOf MainFrame.User_OnUserUpdated
|
||||||
Else
|
Else
|
||||||
RemoveHandler User.OnPictureUpdated, AddressOf MainFrame.User_OnPictureUpdated
|
RemoveHandler User.Self.OnUserUpdated, AddressOf MainFrame.User_OnUserUpdated
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
End Try
|
End Try
|
||||||
@@ -164,6 +203,8 @@ Friend Module MainMod
|
|||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Standalone video download functions"
|
||||||
Friend Function GetCurrentBuffer() As String
|
Friend Function GetCurrentBuffer() As String
|
||||||
Dim b$ = BufferText
|
Dim b$ = BufferText
|
||||||
If Not (Not b.IsEmptyString AndAlso b.Length > 4 AndAlso b.StartsWith("http")) Then b = String.Empty
|
If Not (Not b.IsEmptyString AndAlso b.Length > 4 AndAlso b.StartsWith("http")) Then b = String.Empty
|
||||||
@@ -171,7 +212,7 @@ Friend Module MainMod
|
|||||||
End Function
|
End Function
|
||||||
Friend Function GetNewVideoURL() As String
|
Friend Function GetNewVideoURL() As String
|
||||||
Dim b$ = GetCurrentBuffer()
|
Dim b$ = GetCurrentBuffer()
|
||||||
Dim URL$ = InputBox("Enter video URL:", "Download video by URL", b)
|
Dim URL$ = InputBoxE("Enter video URL:", "Download video by URL", b)
|
||||||
If Not URL.IsEmptyString Then Return URL Else Return String.Empty
|
If Not URL.IsEmptyString Then Return URL Else Return String.Empty
|
||||||
End Function
|
End Function
|
||||||
Friend Sub DownloadVideoByURL()
|
Friend Sub DownloadVideoByURL()
|
||||||
@@ -185,66 +226,98 @@ Friend Module MainMod
|
|||||||
Friend Function DownloadVideoByURL(ByVal URL As String, ByVal AskForPath As Boolean, ByVal Silent As Boolean) As Boolean
|
Friend Function DownloadVideoByURL(ByVal URL As String, ByVal AskForPath As Boolean, ByVal Silent As Boolean) As Boolean
|
||||||
Dim e As New ErrorsDescriber(Not Silent, Not Silent, True, False)
|
Dim e As New ErrorsDescriber(Not Silent, Not Silent, True, False)
|
||||||
Try
|
Try
|
||||||
|
Dim Result As Boolean = False
|
||||||
If Not URL.IsEmptyString Then
|
If Not URL.IsEmptyString Then
|
||||||
Dim u As UserMedia = Nothing
|
Dim um As IEnumerable(Of UserMedia) = Nothing
|
||||||
|
Dim site As Sites
|
||||||
|
Dim IsImgur As Boolean = False
|
||||||
If URL.Contains("twitter") Then
|
If URL.Contains("twitter") Then
|
||||||
u = Twitter.UserData.GetVideoInfo(URL)
|
um = Twitter.UserData.GetVideoInfo(URL)
|
||||||
|
site = Sites.Twitter
|
||||||
ElseIf URL.Contains("redgifs") Then
|
ElseIf URL.Contains("redgifs") Then
|
||||||
u = Reddit.UserData.GetVideoInfo(URL)
|
um = Reddit.UserData.GetVideoInfo(URL)
|
||||||
|
site = Sites.Reddit
|
||||||
|
ElseIf URL.Contains("instagram.com") Then
|
||||||
|
um = Instagram.UserData.GetVideoInfo(URL)
|
||||||
|
site = Sites.Instagram
|
||||||
|
ElseIf URL.Contains("imgur.com") Then
|
||||||
|
um = Imgur.Envir.GetVideoInfo(URL)
|
||||||
|
IsImgur = True
|
||||||
Else
|
Else
|
||||||
MsgBoxE("Site of video URL does not recognized" & vbCr & "Operation canceled", MsgBoxStyle.Exclamation, e)
|
MsgBoxE("Site of video URL does not recognized" & vbCr & "Operation canceled", MsgBoxStyle.Exclamation, e)
|
||||||
Return False
|
Return False
|
||||||
End If
|
End If
|
||||||
|
|
||||||
If Not u.URL.IsEmptyString Or Not u.URL_BASE.IsEmptyString Then
|
If um.ListExists Then
|
||||||
Dim f As SFile = u.File
|
Dim f As SFile, ff As SFile
|
||||||
If f.Name.IsEmptyString Then f.Name = $"video_{u.Post.ID}"
|
For Each u As UserMedia In um
|
||||||
If f.Extension.IsEmptyString Then f.Extension = "mp4"
|
If Not u.URL.IsEmptyString Or Not u.URL_BASE.IsEmptyString Then
|
||||||
If Not Settings.LatestSavingPath.IsEmptyString And
|
f = u.File
|
||||||
Settings.LatestSavingPath.Value.Exists(SFO.Path, False) Then f.Path = Settings.LatestSavingPath.Value
|
If f.Name.IsEmptyString Then f.Name = $"video_{u.Post.ID}"
|
||||||
If AskForPath OrElse Not f.Exists(SFO.Path, False) Then
|
If f.Extension.IsEmptyString Then f.Extension = "mp4"
|
||||||
|
If Not Settings.LatestSavingPath.IsEmptyString And
|
||||||
|
Settings.LatestSavingPath.Value.Exists(SFO.Path, False) Then f.Path = Settings.LatestSavingPath.Value
|
||||||
|
If AskForPath OrElse Not f.Exists(SFO.Path, False) Then
|
||||||
#Disable Warning BC40000
|
#Disable Warning BC40000
|
||||||
f = SFile.SaveAs(f, "Video file destination", True, "mp4", "Video|*.mp4|All files|*.*", EDP.ReturnValue)
|
If site = Sites.Instagram Or IsImgur Then
|
||||||
#Enable Warning
|
ff = SFile.SaveAs(f, "Files destination",,,, EDP.ReturnValue)
|
||||||
End If
|
If Not ff.IsEmptyString Then
|
||||||
If Not f.IsEmptyString Then
|
f.Path = ff.Path
|
||||||
Settings.LatestSavingPath.Value = f.PathWithSeparator
|
Else
|
||||||
Dim dURL$
|
f = Nothing
|
||||||
Dim FileDownloaded As Boolean = False
|
End If
|
||||||
Using w As New Net.WebClient
|
Else
|
||||||
For i% = 0 To 1
|
f = SFile.SaveAs(f, "Video file destination", True, "mp4", "Video|*.mp4|All files|*.*", EDP.ReturnValue)
|
||||||
If i = 0 Then dURL = u.URL Else dURL = u.URL_BASE
|
|
||||||
If Not dURL.IsEmptyString Then
|
|
||||||
Try
|
|
||||||
w.DownloadFile(dURL, f)
|
|
||||||
FileDownloaded = True
|
|
||||||
Exit For
|
|
||||||
Catch wex As Exception
|
|
||||||
ErrorsDescriber.Execute(EDP.SendInLog, wex, "DownloadVideoByURL")
|
|
||||||
End Try
|
|
||||||
End If
|
End If
|
||||||
Next
|
#Enable Warning
|
||||||
End Using
|
AskForPath = False
|
||||||
If FileDownloaded Then
|
End If
|
||||||
MsgBoxE($"File downloaded to [{f}]",, e)
|
If Not f.IsEmptyString Then
|
||||||
Return True
|
Settings.LatestSavingPath.Value = f.PathWithSeparator
|
||||||
|
Dim dURL$
|
||||||
|
Dim FileDownloaded As Boolean = False
|
||||||
|
Using w As New Net.WebClient
|
||||||
|
For i% = 0 To 1
|
||||||
|
If i = 0 Then dURL = u.URL Else dURL = u.URL_BASE
|
||||||
|
If Not dURL.IsEmptyString Then
|
||||||
|
Try
|
||||||
|
w.DownloadFile(dURL, f)
|
||||||
|
FileDownloaded = True
|
||||||
|
Exit For
|
||||||
|
Catch wex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendInLog, wex, "DownloadVideoByURL")
|
||||||
|
End Try
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
End Using
|
||||||
|
If FileDownloaded Then
|
||||||
|
If um.Count = 1 Then
|
||||||
|
MsgBoxE($"File downloaded to [{f}]",, e)
|
||||||
|
Return True
|
||||||
|
Else
|
||||||
|
Result = True
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
If um.Count = 1 Then MsgBoxE("File does not downloaded", MsgBoxStyle.Critical, e)
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
If um.Count = 1 Then MsgBoxE("File destination does not pointed" & vbCr & "Operation canceled",, e)
|
||||||
|
End If
|
||||||
Else
|
Else
|
||||||
MsgBoxE("File does not downloaded", MsgBoxStyle.Critical, e)
|
If um.Count = 1 Then MsgBoxE("File URL does not found!", MsgBoxStyle.Critical, e)
|
||||||
End If
|
End If
|
||||||
Else
|
Next
|
||||||
MsgBoxE("File destination does not pointed" & vbCr & "Operation canceled",, e)
|
|
||||||
End If
|
|
||||||
Else
|
|
||||||
MsgBoxE("File URL does not found!", MsgBoxStyle.Critical, e)
|
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
MsgBoxE("URL is empty", MsgBoxStyle.Exclamation, e)
|
MsgBoxE("URL is empty", MsgBoxStyle.Exclamation, e)
|
||||||
End If
|
End If
|
||||||
Return False
|
Return Result
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Return ErrorsDescriber.Execute(e, ex, "Downloading video by URL error", False)
|
Return ErrorsDescriber.Execute(e, ex, "Downloading video by URL error", False)
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
#End Region
|
||||||
|
#Region "Blacklist Support"
|
||||||
Friend Structure UserBan
|
Friend Structure UserBan
|
||||||
Friend ReadOnly Name As String
|
Friend ReadOnly Name As String
|
||||||
Friend ReadOnly Reason As String
|
Friend ReadOnly Reason As String
|
||||||
@@ -330,4 +403,10 @@ Friend Module MainMod
|
|||||||
Friend Function UserBanned(ByVal UserName As String) As Boolean
|
Friend Function UserBanned(ByVal UserName As String) As Boolean
|
||||||
Return UserBanned({UserName}).ListExists
|
Return UserBanned({UserName}).ListExists
|
||||||
End Function
|
End Function
|
||||||
|
#End Region
|
||||||
|
Friend Sub CheckVersion(ByVal Force As Boolean)
|
||||||
|
If Settings.CheckUpdatesAtStart Or Force Then _
|
||||||
|
GitHub.DefaultVersionChecker(My.Application.Info.Version, "AAndyProgram", "SCrawler",
|
||||||
|
Settings.LatestVersion.Value, Settings.ShowNewVersionNotification.Value, Force)
|
||||||
|
End Sub
|
||||||
End Module
|
End Module
|
||||||
@@ -10,7 +10,7 @@ Imports System.Runtime.InteropServices
|
|||||||
' Review the values of the assembly attributes
|
' Review the values of the assembly attributes
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("Socials media data Crawler")>
|
<Assembly: AssemblyTitle("Socials media data Crawler")>
|
||||||
<Assembly: AssemblyDescription("Twitter and Reddit media crawler")>
|
<Assembly: AssemblyDescription("Social networks media downloader")>
|
||||||
<Assembly: AssemblyCompany("AndyProgram")>
|
<Assembly: AssemblyCompany("AndyProgram")>
|
||||||
<Assembly: AssemblyProduct("SCrawler")>
|
<Assembly: AssemblyProduct("SCrawler")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2022")>
|
<Assembly: AssemblyCopyright("Copyright © 2022")>
|
||||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
|||||||
' by using the '*' as shown below:
|
' by using the '*' as shown below:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("1.0.0.1")>
|
<Assembly: AssemblyVersion("2.0.0.4")>
|
||||||
<Assembly: AssemblyFileVersion("1.0.0.1")>
|
<Assembly: AssemblyFileVersion("2.0.0.4")>
|
||||||
<Assembly: NeutralResourcesLanguage("en")>
|
<Assembly: NeutralResourcesLanguage("en")>
|
||||||
|
|||||||
60
SCrawler/My Project/Resources.Designer.vb
generated
@@ -60,6 +60,16 @@ Namespace My.Resources
|
|||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
'''</summary>
|
||||||
|
Friend ReadOnly Property BookmarkBlack_16() As System.Drawing.Bitmap
|
||||||
|
Get
|
||||||
|
Dim obj As Object = ResourceManager.GetObject("BookmarkBlack_16", resourceCulture)
|
||||||
|
Return CType(obj,System.Drawing.Bitmap)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
|
||||||
'''<summary>
|
'''<summary>
|
||||||
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
'''</summary>
|
'''</summary>
|
||||||
@@ -100,6 +110,16 @@ Namespace My.Resources
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
'''</summary>
|
||||||
|
Friend ReadOnly Property HeartPic_32() As System.Drawing.Bitmap
|
||||||
|
Get
|
||||||
|
Dim obj As Object = ResourceManager.GetObject("HeartPic_32", resourceCulture)
|
||||||
|
Return CType(obj,System.Drawing.Bitmap)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
|
||||||
'''<summary>
|
'''<summary>
|
||||||
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
'''</summary>
|
'''</summary>
|
||||||
@@ -110,6 +130,26 @@ Namespace My.Resources
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||||
|
'''</summary>
|
||||||
|
Friend ReadOnly Property InstagramIcon() As System.Drawing.Icon
|
||||||
|
Get
|
||||||
|
Dim obj As Object = ResourceManager.GetObject("InstagramIcon", resourceCulture)
|
||||||
|
Return CType(obj,System.Drawing.Icon)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
'''</summary>
|
||||||
|
Friend ReadOnly Property InstagramPic76() As System.Drawing.Bitmap
|
||||||
|
Get
|
||||||
|
Dim obj As Object = ResourceManager.GetObject("InstagramPic76", resourceCulture)
|
||||||
|
Return CType(obj,System.Drawing.Bitmap)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
|
||||||
'''<summary>
|
'''<summary>
|
||||||
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
'''</summary>
|
'''</summary>
|
||||||
@@ -210,6 +250,16 @@ Namespace My.Resources
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
'''</summary>
|
||||||
|
Friend ReadOnly Property SettingsPic_16() As System.Drawing.Bitmap
|
||||||
|
Get
|
||||||
|
Dim obj As Object = ResourceManager.GetObject("SettingsPic_16", resourceCulture)
|
||||||
|
Return CType(obj,System.Drawing.Bitmap)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
|
||||||
'''<summary>
|
'''<summary>
|
||||||
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
'''</summary>
|
'''</summary>
|
||||||
@@ -239,5 +289,15 @@ Namespace My.Resources
|
|||||||
Return CType(obj,System.Drawing.Icon)
|
Return CType(obj,System.Drawing.Icon)
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
'''</summary>
|
||||||
|
Friend ReadOnly Property TwitterPic400() As System.Drawing.Bitmap
|
||||||
|
Get
|
||||||
|
Dim obj As Object = ResourceManager.GetObject("TwitterPic400", resourceCulture)
|
||||||
|
Return CType(obj,System.Drawing.Bitmap)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
End Module
|
End Module
|
||||||
End Namespace
|
End Namespace
|
||||||
|
|||||||
@@ -118,41 +118,56 @@
|
|||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
<data name="GlobeBlue_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
|
||||||
<value>..\Content\Pictures\GlobeBlue_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
|
||||||
</data>
|
|
||||||
<data name="StarPic_24" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="StarPic_24" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\StarPic_24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\StarPic_24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PrevPIC2" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="PrevPIC2" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\PrevPIC2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\PrevPIC2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PicturePic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="StartPic_01_Green_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\PicturePic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\StartPic_01_Green_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
|
||||||
<data name="NextPIC2" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
|
||||||
<value>..\Content\Pictures\NextPIC2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
|
||||||
</data>
|
|
||||||
<data name="Folder_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
|
||||||
<value>..\Content\Pictures\Folder_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
|
||||||
</data>
|
</data>
|
||||||
<data name="PencilPic_01_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="PencilPic_01_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\PencilPic_01_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\PencilPic_01_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="NextPIC2" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\NextPIC2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="BookmarkBlack_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\BookmarkBlack_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="Folder_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\Folder_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="TwitterPic400" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\TwitterPic400.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
<data name="PlusPIC" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="PlusPIC" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\PlusPIC.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\PlusPIC.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TwitterIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Icons\TwitterIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
<data name="Delete" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="Delete" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="InstagramPic76" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\InstagramPic76.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="InstagramIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Icons\InstagramIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="GlobeBlue_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\GlobeBlue_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
<data name="InfoPic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="InfoPic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\InfoPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\InfoPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Refresh" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="Refresh" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\Refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\Refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DBPic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="PicturePic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\DBPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\PicturePic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RedditIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="RedditIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Icons\RedditIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Icons\RedditIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
@@ -163,13 +178,16 @@
|
|||||||
<data name="Pin_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="Pin_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\Pin_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\Pin_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="StartPic_01_Green_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
|
||||||
<value>..\Content\Pictures\StartPic_01_Green_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
|
||||||
</data>
|
|
||||||
<data name="RedditPic512" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="RedditPic512" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\RedditPic512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\RedditPic512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TwitterIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="DBPic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Icons\TwitterIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\DBPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsPic_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\SettingsPic_16.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="HeartPic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\HeartPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
<Deterministic>true</Deterministic>
|
<Deterministic>true</Deterministic>
|
||||||
|
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||||
<PublishUrl>publish\</PublishUrl>
|
<PublishUrl>publish\</PublishUrl>
|
||||||
<Install>true</Install>
|
<Install>true</Install>
|
||||||
<InstallFrom>Disk</InstallFrom>
|
<InstallFrom>Disk</InstallFrom>
|
||||||
@@ -26,7 +27,6 @@
|
|||||||
<MapFileExtensions>true</MapFileExtensions>
|
<MapFileExtensions>true</MapFileExtensions>
|
||||||
<ApplicationRevision>0</ApplicationRevision>
|
<ApplicationRevision>0</ApplicationRevision>
|
||||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
|
||||||
<UseApplicationTrust>false</UseApplicationTrust>
|
<UseApplicationTrust>false</UseApplicationTrust>
|
||||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@@ -133,17 +133,31 @@
|
|||||||
<Import Include="System.Threading.Tasks" />
|
<Import Include="System.Threading.Tasks" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="API\Base\Declarations.vb" />
|
||||||
<Compile Include="API\Base\SiteSettings.vb" />
|
<Compile Include="API\Base\SiteSettings.vb" />
|
||||||
<Compile Include="API\Base\Structures.vb" />
|
<Compile Include="API\Base\Structures.vb" />
|
||||||
<Compile Include="API\Base\UserDataBase.vb" />
|
<Compile Include="API\Base\UserDataBase.vb" />
|
||||||
|
<Compile Include="API\Imgur\Envir.vb" />
|
||||||
|
<Compile Include="API\Instagram\Declarations.vb" />
|
||||||
|
<Compile Include="API\Instagram\ProfileSaved.vb" />
|
||||||
|
<Compile Include="API\Instagram\UserData.vb" />
|
||||||
<Compile Include="API\Reddit\Channel.vb" />
|
<Compile Include="API\Reddit\Channel.vb" />
|
||||||
<Compile Include="API\Reddit\ChannelsCollection.vb" />
|
<Compile Include="API\Reddit\ChannelsCollection.vb" />
|
||||||
<Compile Include="API\Reddit\Declarations.vb" />
|
<Compile Include="API\Reddit\Declarations.vb" />
|
||||||
<Compile Include="API\Reddit\M3U8.vb" />
|
<Compile Include="API\Reddit\M3U8.vb" />
|
||||||
|
<Compile Include="API\Reddit\ProfileSaved.vb" />
|
||||||
<Compile Include="API\Reddit\UserData.vb" />
|
<Compile Include="API\Reddit\UserData.vb" />
|
||||||
|
<Compile Include="API\Redgifs\Declarations.vb" />
|
||||||
|
<Compile Include="API\Redgifs\UserData.vb" />
|
||||||
<Compile Include="API\Twitter\Declarations.vb" />
|
<Compile Include="API\Twitter\Declarations.vb" />
|
||||||
<Compile Include="API\Twitter\UserData.vb" />
|
<Compile Include="API\Twitter\UserData.vb" />
|
||||||
<Compile Include="API\UserDataBind.vb" />
|
<Compile Include="API\UserDataBind.vb" />
|
||||||
|
<Compile Include="Channels\ChannelsStatsForm.Designer.vb">
|
||||||
|
<DependentUpon>ChannelsStatsForm.vb</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Channels\ChannelsStatsForm.vb">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Channels\ChannelViewForm.Designer.vb">
|
<Compile Include="Channels\ChannelViewForm.Designer.vb">
|
||||||
<DependentUpon>ChannelViewForm.vb</DependentUpon>
|
<DependentUpon>ChannelViewForm.vb</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -156,6 +170,12 @@
|
|||||||
<Compile Include="DownloadedInfoForm.vb">
|
<Compile Include="DownloadedInfoForm.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="DownloadSavedPostsForm.Designer.vb">
|
||||||
|
<DependentUpon>DownloadSavedPostsForm.vb</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="DownloadSavedPostsForm.vb">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Editors\CollectionEditorForm.Designer.vb">
|
<Compile Include="Editors\CollectionEditorForm.Designer.vb">
|
||||||
<DependentUpon>CollectionEditorForm.vb</DependentUpon>
|
<DependentUpon>CollectionEditorForm.vb</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -174,16 +194,19 @@
|
|||||||
<Compile Include="Editors\LabelsForm.vb">
|
<Compile Include="Editors\LabelsForm.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Editors\RedditEditorForm.Designer.vb">
|
<Compile Include="Editors\SiteDefaults.vb">
|
||||||
<DependentUpon>RedditEditorForm.vb</DependentUpon>
|
<SubType>Component</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Editors\RedditEditorForm.vb">
|
<Compile Include="Editors\SiteSelectionForm.Designer.vb">
|
||||||
|
<DependentUpon>SiteSelectionForm.vb</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Editors\SiteSelectionForm.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Editors\TwitterEditorForm.Designer.vb">
|
<Compile Include="Editors\SiteEditorForm.Designer.vb">
|
||||||
<DependentUpon>TwitterEditorForm.vb</DependentUpon>
|
<DependentUpon>SiteEditorForm.vb</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Editors\TwitterEditorForm.vb">
|
<Compile Include="Editors\SiteEditorForm.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Editors\UserCreatorForm.Designer.vb">
|
<Compile Include="Editors\UserCreatorForm.Designer.vb">
|
||||||
@@ -192,7 +215,6 @@
|
|||||||
<Compile Include="Editors\UserCreatorForm.vb">
|
<Compile Include="Editors\UserCreatorForm.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Info\InfoMod.vb" />
|
|
||||||
<Compile Include="LabelsKeeper.vb" />
|
<Compile Include="LabelsKeeper.vb" />
|
||||||
<Compile Include="MainFrame.vb">
|
<Compile Include="MainFrame.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
@@ -229,12 +251,18 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="Channels\ChannelsStatsForm.resx">
|
||||||
|
<DependentUpon>ChannelsStatsForm.vb</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Channels\ChannelViewForm.resx">
|
<EmbeddedResource Include="Channels\ChannelViewForm.resx">
|
||||||
<DependentUpon>ChannelViewForm.vb</DependentUpon>
|
<DependentUpon>ChannelViewForm.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="DownloadedInfoForm.resx">
|
<EmbeddedResource Include="DownloadedInfoForm.resx">
|
||||||
<DependentUpon>DownloadedInfoForm.vb</DependentUpon>
|
<DependentUpon>DownloadedInfoForm.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="DownloadSavedPostsForm.resx">
|
||||||
|
<DependentUpon>DownloadSavedPostsForm.vb</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Editors\CollectionEditorForm.resx">
|
<EmbeddedResource Include="Editors\CollectionEditorForm.resx">
|
||||||
<DependentUpon>CollectionEditorForm.vb</DependentUpon>
|
<DependentUpon>CollectionEditorForm.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
@@ -244,11 +272,11 @@
|
|||||||
<EmbeddedResource Include="Editors\LabelsForm.resx">
|
<EmbeddedResource Include="Editors\LabelsForm.resx">
|
||||||
<DependentUpon>LabelsForm.vb</DependentUpon>
|
<DependentUpon>LabelsForm.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Editors\RedditEditorForm.resx">
|
<EmbeddedResource Include="Editors\SiteSelectionForm.resx">
|
||||||
<DependentUpon>RedditEditorForm.vb</DependentUpon>
|
<DependentUpon>SiteSelectionForm.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Editors\TwitterEditorForm.resx">
|
<EmbeddedResource Include="Editors\SiteEditorForm.resx">
|
||||||
<DependentUpon>TwitterEditorForm.vb</DependentUpon>
|
<DependentUpon>SiteEditorForm.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Editors\UserCreatorForm.resx">
|
<EmbeddedResource Include="Editors\UserCreatorForm.resx">
|
||||||
<DependentUpon>UserCreatorForm.vb</DependentUpon>
|
<DependentUpon>UserCreatorForm.vb</DependentUpon>
|
||||||
@@ -267,6 +295,7 @@
|
|||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include=".editorconfig" />
|
||||||
<None Include="My Project\app.manifest" />
|
<None Include="My Project\app.manifest" />
|
||||||
<None Include="My Project\Application.myapp">
|
<None Include="My Project\Application.myapp">
|
||||||
<Generator>MyApplicationCodeGenerator</Generator>
|
<Generator>MyApplicationCodeGenerator</Generator>
|
||||||
@@ -286,6 +315,12 @@
|
|||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="Content\Icons\InstagramIcon.ico" />
|
||||||
|
<None Include="Content\Pictures\SettingsPic_16.bmp" />
|
||||||
|
<None Include="Content\Pictures\TwitterPic400.png" />
|
||||||
|
<None Include="Content\Pictures\InstagramPic76.png" />
|
||||||
|
<None Include="Content\Pictures\BookmarkBlack_16.png" />
|
||||||
|
<None Include="Content\Pictures\HeartPic_32.png" />
|
||||||
<Content Include="ffmpeg.exe">
|
<Content Include="ffmpeg.exe">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
|||||||
@@ -1,9 +1,19 @@
|
|||||||
Imports PersonalUtilities.Functions.XML
|
' 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.Functions.XML
|
||||||
Imports PersonalUtilities.Functions.XML.Base
|
Imports PersonalUtilities.Functions.XML.Base
|
||||||
Imports SCrawler.API
|
Imports SCrawler.API
|
||||||
Imports SCrawler.API.Base
|
Imports SCrawler.API.Base
|
||||||
Friend Class SettingsCLS : Implements IDisposable
|
Friend Class SettingsCLS : Implements IDisposable
|
||||||
Friend Const DefaultMaxDownloadingTasks As Integer = 5
|
Friend Const DefaultMaxDownloadingTasks As Integer = 5
|
||||||
|
Friend Const Name_Node_Sites As String = "Sites"
|
||||||
|
Private Const SitesValuesSeparator As String = ","
|
||||||
Friend ReadOnly Design As XmlFile
|
Friend ReadOnly Design As XmlFile
|
||||||
Private ReadOnly MyXML As XmlFile
|
Private ReadOnly MyXML As XmlFile
|
||||||
Friend ReadOnly OS64 As Boolean
|
Friend ReadOnly OS64 As Boolean
|
||||||
@@ -27,8 +37,7 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
FfmpegFile = "ffmpeg.exe"
|
FfmpegFile = "ffmpeg.exe"
|
||||||
FfmpegExists = FfmpegFile.Exists
|
FfmpegExists = FfmpegFile.Exists
|
||||||
If OS64 And Not FfmpegExists Then MsgBoxE("[ffmpeg.exe] is missing", vbExclamation)
|
If OS64 And Not FfmpegExists Then MsgBoxE("[ffmpeg.exe] is missing", vbExclamation)
|
||||||
Design = New XmlFile("Settings\Design.xml")
|
Design = New XmlFile("Settings\Design.xml", Protector.Modes.All)
|
||||||
Design.DefaultsLoading(False)
|
|
||||||
MyXML = New XmlFile(Nothing) With {.AutoUpdateFile = True}
|
MyXML = New XmlFile(Nothing) With {.AutoUpdateFile = True}
|
||||||
Users = New List(Of IUserData)
|
Users = New List(Of IUserData)
|
||||||
UsersList = New List(Of UserInfo)
|
UsersList = New List(Of UserInfo)
|
||||||
@@ -36,16 +45,23 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
|
|
||||||
GlobalPath = New XMLValue(Of SFile)("GlobalPath", New SFile($"{SFile.GetPath(Application.StartupPath).PathWithSeparator}Data\"), MyXML,,
|
GlobalPath = New XMLValue(Of SFile)("GlobalPath", New SFile($"{SFile.GetPath(Application.StartupPath).PathWithSeparator}Data\"), MyXML,,
|
||||||
XMLValue(Of SFile).ToFilePath)
|
XMLValue(Of SFile).ToFilePath)
|
||||||
MySites = New Dictionary(Of Sites, SiteSettings) From {
|
|
||||||
{Sites.Reddit, New SiteSettings(Sites.Reddit, MyXML, GlobalPath.Value)},
|
|
||||||
{Sites.Twitter, New SiteSettings(Sites.Twitter, MyXML, GlobalPath.Value)}
|
|
||||||
}
|
|
||||||
MySites(Sites.Reddit).Responser.Decoders.Add(SymbolsConverter.Converters.Unicode)
|
|
||||||
|
|
||||||
SeparateVideoFolder = New XMLValue(Of Boolean)("SeparateVideoFolder", True, MyXML)
|
SeparateVideoFolder = New XMLValue(Of Boolean)("SeparateVideoFolder", True, MyXML)
|
||||||
CollectionsPath = New XMLValue(Of String)("CollectionsPath", "Collections", MyXML)
|
CollectionsPath = New XMLValue(Of String)("CollectionsPath", "Collections", MyXML)
|
||||||
DefaultTemporary = New XMLValue(Of Boolean)("DefaultTemporary", False, MyXML)
|
|
||||||
MaxUsersJobsCount = New XMLValue(Of Integer)("MaxUsersJobsCount", DefaultMaxDownloadingTasks, MyXML)
|
Dim n() As String = {"Defaults"}
|
||||||
|
DefaultTemporary = New XMLValue(Of Boolean)("Temporary", False, MyXML, n)
|
||||||
|
DefaultDownloadImages = New XMLValue(Of Boolean)("DownloadImages", True, MyXML, n)
|
||||||
|
DefaultDownloadVideos = New XMLValue(Of Boolean)("DownloadVideos", True, MyXML, n)
|
||||||
|
ChangeReadyForDownOnTempChange = New XMLValue(Of Boolean)("ChangeReadyForDownOnTempChange", True, MyXML, n)
|
||||||
|
|
||||||
|
MySites = New Dictionary(Of Sites, SiteSettings) From {
|
||||||
|
{Sites.Reddit, New SiteSettings(Sites.Reddit, MyXML, GlobalPath.Value, DefaultTemporary, DefaultDownloadImages, DefaultDownloadVideos)},
|
||||||
|
{Sites.Twitter, New SiteSettings(Sites.Twitter, MyXML, GlobalPath.Value, DefaultTemporary, DefaultDownloadImages, DefaultDownloadVideos)},
|
||||||
|
{Sites.Instagram, New SiteSettings(Sites.Instagram, MyXML, GlobalPath.Value, DefaultTemporary, DefaultDownloadImages, DefaultDownloadVideos)},
|
||||||
|
{Sites.RedGifs, New SiteSettings(Sites.RedGifs, MyXML, GlobalPath.Value, DefaultTemporary, DefaultDownloadImages, DefaultDownloadVideos)}
|
||||||
|
}
|
||||||
|
MySites(Sites.Reddit).Responser.Decoders.Add(SymbolsConverter.Converters.Unicode)
|
||||||
|
|
||||||
MaxLargeImageHeigh = New XMLValue(Of Integer)("MaxLargeImageHeigh", 150, MyXML)
|
MaxLargeImageHeigh = New XMLValue(Of Integer)("MaxLargeImageHeigh", 150, MyXML)
|
||||||
MaxSmallImageHeigh = New XMLValue(Of Integer)("MaxSmallImageHeigh", 15, MyXML)
|
MaxSmallImageHeigh = New XMLValue(Of Integer)("MaxSmallImageHeigh", 15, MyXML)
|
||||||
@@ -57,48 +73,92 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
LatestSelectedLabels = New XMLValue(Of String)("LatestSelectedLabels",, MyXML)
|
LatestSelectedLabels = New XMLValue(Of String)("LatestSelectedLabels",, MyXML)
|
||||||
LatestSelectedChannel = New XMLValue(Of String)("LatestSelectedChannel",, MyXML)
|
LatestSelectedChannel = New XMLValue(Of String)("LatestSelectedChannel",, MyXML)
|
||||||
|
|
||||||
ChannelsImagesRows = New XMLValue(Of Integer)("ChannelsImagesRows", 2, MyXML)
|
XMLSelectedSites = New XMLValue(Of String)("SelectedSites", String.Empty, MyXML, {Name_Node_Sites})
|
||||||
ChannelsImagesColumns = New XMLValue(Of Integer)("ChannelsImagesColumns", 5, MyXML)
|
If Not XMLSelectedSites.IsEmptyString Then
|
||||||
ChannelsHideExistsUser = New XMLValue(Of Boolean)("ChannelsHideExistsUser", True, MyXML)
|
_SelectedSites = XMLSelectedSites.Value.StringToList(Of Sites)(SitesValuesSeparator)
|
||||||
ChannelsMaxJobsCount = New XMLValue(Of Integer)("ChannelsMaxJobsCount", DefaultMaxDownloadingTasks, MyXML)
|
End If
|
||||||
FromChannelDownloadTop = New XMLValue(Of Integer)("FromChannelDownloadTop", 10, MyXML)
|
If _SelectedSites Is Nothing Then _SelectedSites = New List(Of Sites)
|
||||||
FromChannelDownloadTopUse = New XMLValue(Of Boolean)("FromChannelDownloadTopUse", False, MyXML)
|
|
||||||
FromChannelCopyImageToUser = New XMLValue(Of Boolean)("FromChannelCopyImageToUser", True, MyXML)
|
ImgurClientID = New XMLValue(Of String)("ImgurClientID", String.Empty, MyXML, {Name_Node_Sites})
|
||||||
|
|
||||||
|
n = {Name_Node_Sites, "Channels"}
|
||||||
|
ChannelsDefaultReadyForDownload = New XMLValue(Of Boolean)("ChannelsDefaultReadyForDownload", False, MyXML, n)
|
||||||
|
ChannelsDefaultTemporary = New XMLValue(Of Boolean)("ChannelsDefaultTemporary", True, MyXML, n)
|
||||||
|
ChannelsRegularCheckMD5 = New XMLValue(Of Boolean)("ChannelsRegularCheckMD5", False, MyXML, n)
|
||||||
|
ChannelsImagesRows = New XMLValue(Of Integer)("ImagesRows", 2, MyXML, n)
|
||||||
|
ChannelsImagesColumns = New XMLValue(Of Integer)("ImagesColumns", 5, MyXML, n)
|
||||||
|
ChannelsHideExistsUser = New XMLValue(Of Boolean)("HideExistsUser", True, MyXML, n)
|
||||||
|
ChannelsMaxJobsCount = New XMLValue(Of Integer)("MaxJobsCount", DefaultMaxDownloadingTasks, MyXML, n)
|
||||||
|
|
||||||
|
n = {"Users"}
|
||||||
|
FromChannelDownloadTop = New XMLValue(Of Integer)("FromChannelDownloadTop", 10, MyXML, n)
|
||||||
|
FromChannelDownloadTopUse = New XMLValue(Of Boolean)("FromChannelDownloadTopUse", False, MyXML, n)
|
||||||
|
FromChannelCopyImageToUser = New XMLValue(Of Boolean)("FromChannelCopyImageToUser", True, MyXML, n)
|
||||||
|
|
||||||
|
n = {"Users", "FileName"}
|
||||||
|
MaxUsersJobsCount = New XMLValue(Of Integer)("MaxJobsCount", DefaultMaxDownloadingTasks, MyXML, n)
|
||||||
|
FileAddDateToFileName = New XMLValue(Of Boolean)("FileAddDateToFileName", False, MyXML, n) With {.OnChangeFunction = AddressOf ChangeDateProvider}
|
||||||
|
FileAddTimeToFileName = New XMLValue(Of Boolean)("FileAddTimeToFileName", False, MyXML, n) With {.OnChangeFunction = AddressOf ChangeDateProvider}
|
||||||
|
FileDateTimePositionEnd = New XMLValue(Of Boolean)("FileDateTimePositionEnd", True, MyXML, n) With {.OnChangeFunction = AddressOf ChangeDateProvider}
|
||||||
|
FileReplaceNameByDate = New XMLValue(Of Boolean)("FileReplaceNameByDate", False, MyXML, n)
|
||||||
|
|
||||||
CheckUpdatesAtStart = New XMLValue(Of Boolean)("CheckUpdatesAtStart", True, MyXML)
|
CheckUpdatesAtStart = New XMLValue(Of Boolean)("CheckUpdatesAtStart", True, MyXML)
|
||||||
ShowNewVersionNotification = New XMLValue(Of Boolean)("ShowNewVersionNotification", True, MyXML)
|
ShowNewVersionNotification = New XMLValue(Of Boolean)("ShowNewVersionNotification", True, MyXML)
|
||||||
LatestVersion = New XMLValue(Of String)("LatestVersion", String.Empty, MyXML)
|
LatestVersion = New XMLValue(Of String)("LatestVersion", String.Empty, MyXML)
|
||||||
|
|
||||||
MyXML.DefaultsLoading(False)
|
ExitConfirm = New XMLValue(Of Boolean)("ExitConfirm", True, MyXML)
|
||||||
If MyXML.ChangesDetected Then MyXML.UpdateData()
|
CloseToTray = New XMLValue(Of Boolean)("CloseToTray", True, MyXML)
|
||||||
|
ShowNotifications = New XMLValue(Of Boolean)("ShowNotifications", True, MyXML)
|
||||||
|
|
||||||
|
If MyXML.ChangesDetected Then MyXML.Sort() : MyXML.UpdateData()
|
||||||
|
|
||||||
Labels = New LabelsKeeper
|
Labels = New LabelsKeeper
|
||||||
If Not LatestSelectedLabels.IsEmptyString Then Labels.CurrentSelection.ListAddList(LatestSelectedLabels.Value.StringToList(Of String, List(Of String))("|"))
|
If Not LatestSelectedLabels.IsEmptyString Then Labels.CurrentSelection.ListAddList(LatestSelectedLabels.Value.StringToList(Of String, List(Of String))("|"))
|
||||||
If BlackListFile.Exists Then
|
If BlackListFile.Exists Then
|
||||||
BlackList.ListAddList(IO.File.ReadAllLines(BlackListFile), LAP.NotContainsOnly)
|
BlackList.ListAddList(IO.File.ReadAllLines(BlackListFile), LAP.NotContainsOnly)
|
||||||
If BlackList.Count > 0 Then BlackList.RemoveAll(Function(b) Not b.Exists)
|
If BlackList.Count > 0 Then BlackList.RemoveAll(Function(b) Not b.Exists)
|
||||||
End If
|
End If
|
||||||
|
_UpdatesSuspended = False
|
||||||
|
ChangeDateProvider(Nothing, Nothing, Nothing)
|
||||||
|
End Sub
|
||||||
|
Private Sub ChangeDateProvider(ByVal Sender As Object, ByVal Name As String, ByVal Value As Object)
|
||||||
|
If Not _UpdatesSuspended Then
|
||||||
|
Dim p$ = String.Empty
|
||||||
|
If FileAddDateToFileName Then p = "yyyyMMdd"
|
||||||
|
If FileAddTimeToFileName Then p.StringAppend("HHmmss", "_")
|
||||||
|
If Not p.IsEmptyString Then FileDateAppenderProvider = New ADateTime(p) Else FileDateAppenderProvider = New ADateTime("yyyyMMdd_HHmmss")
|
||||||
|
If FileDateTimePositionEnd Then FileDateAppenderPattern = "{0}_{1}" Else FileDateAppenderPattern = "{1}_{0}"
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub LoadUsers()
|
Friend Sub LoadUsers()
|
||||||
Try
|
Try
|
||||||
Users.Clear()
|
Users.Clear()
|
||||||
If UsersSettingsFile.Exists Then
|
If UsersSettingsFile.Exists Then
|
||||||
Using x As New XmlFile(UsersSettingsFile, ProtectionLevels.All, False) With {.AllowSameNames = True}
|
Using x As New XmlFile(UsersSettingsFile, Protector.Modes.All, False) With {.AllowSameNames = True}
|
||||||
x.LoadData()
|
x.LoadData()
|
||||||
x.DefaultsLoading(False)
|
|
||||||
If x.Count > 0 Then x.ForEach(Sub(xx) UsersList.Add(xx))
|
If x.Count > 0 Then x.ForEach(Sub(xx) UsersList.Add(xx))
|
||||||
End Using
|
End Using
|
||||||
Dim PNC As Func(Of UserInfo, Boolean) = Function(u) Not u.IncludedInCollection
|
Dim PNC As Func(Of UserInfo, Boolean) = Function(u) Not u.IncludedInCollection
|
||||||
|
Dim NeedUpdate As Boolean = False
|
||||||
If UsersList.Count > 0 Then
|
If UsersList.Count > 0 Then
|
||||||
Dim cUsers As List(Of UserInfo) = UsersList.Where(Function(u) u.IncludedInCollection).ToList
|
Dim cUsers As List(Of UserInfo) = UsersList.Where(Function(u) u.IncludedInCollection).ToList
|
||||||
If cUsers.ListExists Then
|
If cUsers.ListExists Then
|
||||||
Dim d As New Dictionary(Of SFile, List(Of UserInfo))
|
Dim d As New Dictionary(Of SFile, List(Of UserInfo))
|
||||||
cUsers = cUsers.ListForEachCopy(Of List(Of UserInfo))(Function(ByVal f As UserInfo, ByVal f_indx As Integer) As UserInfo
|
cUsers = cUsers.ListForEachCopy(Of List(Of UserInfo))(Function(ByVal f As UserInfo, ByVal f_indx As Integer) As UserInfo
|
||||||
If Not d.ContainsKey(f.File.CutPath(2).Path) Then
|
Dim m% = IIf(f.Merged, 1, 2)
|
||||||
d.Add(f.File.CutPath(2).Path, New List(Of UserInfo) From {f})
|
If SFile.GetPath(f.File.CutPath(m - 1).Path).Exists(SFO.Path, False) Then
|
||||||
|
Dim fp As SFile = SFile.GetPath(f.File.CutPath(m).Path)
|
||||||
|
If Not d.ContainsKey(fp) Then
|
||||||
|
d.Add(fp, New List(Of UserInfo) From {f})
|
||||||
|
Else
|
||||||
|
d(f.File.CutPath(m).Path).Add(f)
|
||||||
|
End If
|
||||||
|
Return f
|
||||||
Else
|
Else
|
||||||
d(f.File.CutPath(2).Path).Add(f)
|
NeedUpdate = True
|
||||||
|
UsersList.Remove(f)
|
||||||
|
Return Nothing
|
||||||
End If
|
End If
|
||||||
Return f
|
|
||||||
End Function, True)
|
End Function, True)
|
||||||
Dim v%
|
Dim v%
|
||||||
If d.Count > 0 Then
|
If d.Count > 0 Then
|
||||||
@@ -120,8 +180,8 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
t.Clear()
|
t.Clear()
|
||||||
Dim du As List(Of UserInfo) = (From u As IUserData In Users
|
Dim du As List(Of UserInfo) = (From u As IUserData In Users
|
||||||
Where Not u.IsCollection AndAlso Not u.FileExists
|
Where Not u.IsCollection AndAlso Not u.FileExists
|
||||||
Select DirectCast(u, UserDataBase).User).ToList
|
Select DirectCast(u.Self, UserDataBase).User).ToList
|
||||||
If Not du Is Nothing AndAlso du.Count > 0 Then du.ForEach(Sub(u) UsersList.Remove(u)) : du.Clear()
|
If du.ListExists Then du.ForEach(Sub(u) UsersList.Remove(u)) : du.Clear()
|
||||||
Users.ListDisposeRemoveAll(Function(ByVal u As IUserData) As Boolean
|
Users.ListDisposeRemoveAll(Function(ByVal u As IUserData) As Boolean
|
||||||
If u.IsCollection Then
|
If u.IsCollection Then
|
||||||
With DirectCast(u, UserDataBind)
|
With DirectCast(u, UserDataBind)
|
||||||
@@ -140,6 +200,7 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
End If
|
End If
|
||||||
End Function)
|
End Function)
|
||||||
End If
|
End If
|
||||||
|
If NeedUpdate Then UpdateUsersList()
|
||||||
End If
|
End If
|
||||||
If Users.Count > 0 Then
|
If Users.Count > 0 Then
|
||||||
Labels.ToList.ListAddList(Users.SelectMany(Function(u) u.Labels), LAP.NotContainsOnly)
|
Labels.ToList.ListAddList(Users.SelectMany(Function(u) u.Labels), LAP.NotContainsOnly)
|
||||||
@@ -148,6 +209,12 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
Private _UserListUpdateRequired As Boolean = False
|
||||||
|
Friend ReadOnly Property UserListUpdateRequired As Boolean
|
||||||
|
Get
|
||||||
|
Return _UserListUpdateRequired
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
Friend Overloads Sub UpdateUsersList(ByVal u As UserInfo)
|
Friend Overloads Sub UpdateUsersList(ByVal u As UserInfo)
|
||||||
Dim i% = UsersList.IndexOf(u)
|
Dim i% = UsersList.IndexOf(u)
|
||||||
If i >= 0 Then
|
If i >= 0 Then
|
||||||
@@ -158,13 +225,17 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
UpdateUsersList()
|
UpdateUsersList()
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overloads Sub UpdateUsersList()
|
Friend Overloads Sub UpdateUsersList()
|
||||||
If UsersList.Count > 0 Then
|
Try
|
||||||
Using x As New XmlFile With {.AllowSameNames = True, .Name = "Users"}
|
If UsersList.Count > 0 Then
|
||||||
x.DefaultsLoading(False)
|
Using x As New XmlFile With {.AllowSameNames = True, .Name = "Users"}
|
||||||
UsersList.ForEach(Sub(u) x.Add(u.GetContainer()))
|
UsersList.ForEach(Sub(u) x.Add(u.GetContainer()))
|
||||||
x.Save(UsersSettingsFile)
|
x.Save(UsersSettingsFile)
|
||||||
End Using
|
End Using
|
||||||
End If
|
End If
|
||||||
|
_UserListUpdateRequired = False
|
||||||
|
Catch ex As Exception
|
||||||
|
_UserListUpdateRequired = True
|
||||||
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub UpdateBlackList()
|
Friend Sub UpdateBlackList()
|
||||||
If BlackList.Count > 0 Then
|
If BlackList.Count > 0 Then
|
||||||
@@ -173,6 +244,10 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
If BlackListFile.Exists Then BlackListFile.Delete()
|
If BlackListFile.Exists Then BlackListFile.Delete()
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
Friend Sub DeleteCachPath()
|
||||||
|
If Reddit.ChannelsCollection.ChannelsPathCache.Exists(SFO.Path, False) Then _
|
||||||
|
Reddit.ChannelsCollection.ChannelsPathCache.Delete(SFO.Path, False, False, EDP.None)
|
||||||
|
End Sub
|
||||||
Friend Overloads Function UserExists(ByVal s As Sites, ByVal UserID As String) As Boolean
|
Friend Overloads Function UserExists(ByVal s As Sites, ByVal UserID As String) As Boolean
|
||||||
Dim UserFinderBase As Predicate(Of IUserData) = Function(user) user.Site = s And user.Name = UserID
|
Dim UserFinderBase As Predicate(Of IUserData) = Function(user) user.Site = s And user.Name = UserID
|
||||||
Dim UserFinder As Predicate(Of IUserData) = Function(ByVal user As IUserData) As Boolean
|
Dim UserFinder As Predicate(Of IUserData) = Function(ByVal user As IUserData) As Boolean
|
||||||
@@ -192,14 +267,18 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
Friend Overloads Function UserExists(ByVal _User As UserInfo) As Boolean
|
Friend Overloads Function UserExists(ByVal _User As UserInfo) As Boolean
|
||||||
Return UserExists(_User.Site, _User.Name)
|
Return UserExists(_User.Site, _User.Name)
|
||||||
End Function
|
End Function
|
||||||
|
Private _UpdatesSuspended As Boolean = True
|
||||||
Friend Sub BeginUpdate()
|
Friend Sub BeginUpdate()
|
||||||
MyXML.BeginUpdate()
|
MyXML.BeginUpdate()
|
||||||
|
_UpdatesSuspended = True
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub EndUpdate()
|
Friend Sub EndUpdate()
|
||||||
MyXML.EndUpdate()
|
MyXML.EndUpdate()
|
||||||
If MyXML.ChangesDetected Then MyXML.UpdateData()
|
If MyXML.ChangesDetected Then MyXML.UpdateData()
|
||||||
|
_UpdatesSuspended = False
|
||||||
|
ChangeDateProvider(Nothing, Nothing, Nothing)
|
||||||
End Sub
|
End Sub
|
||||||
Friend ReadOnly Property Site(ByVal s As Sites) As SiteSettings
|
Default Friend ReadOnly Property Site(ByVal s As Sites) As SiteSettings
|
||||||
Get
|
Get
|
||||||
Return MySites(s)
|
Return MySites(s)
|
||||||
End Get
|
End Get
|
||||||
@@ -216,8 +295,25 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
End If
|
End If
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Friend ReadOnly Property DefaultTemporary As XMLValue(Of Boolean)
|
|
||||||
Friend ReadOnly Property MaxUsersJobsCount As XMLValue(Of Integer)
|
Friend ReadOnly Property MaxUsersJobsCount As XMLValue(Of Integer)
|
||||||
|
Friend ReadOnly Property ImgurClientID As XMLValue(Of String)
|
||||||
|
#Region "Defaults"
|
||||||
|
Friend ReadOnly Property DefaultTemporary As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property DefaultDownloadImages As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property DefaultDownloadVideos As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property ChangeReadyForDownOnTempChange As XMLValue(Of Boolean)
|
||||||
|
#End Region
|
||||||
|
#Region "User data"
|
||||||
|
Friend ReadOnly Property FromChannelDownloadTop As XMLValue(Of Integer)
|
||||||
|
Friend ReadOnly Property FromChannelDownloadTopUse As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property FromChannelCopyImageToUser As XMLValue(Of Boolean)
|
||||||
|
#Region "File naming"
|
||||||
|
Friend ReadOnly Property FileAddDateToFileName As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property FileAddTimeToFileName As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property FileDateTimePositionEnd As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property FileReplaceNameByDate As XMLValue(Of Boolean)
|
||||||
|
#End Region
|
||||||
|
#End Region
|
||||||
#Region "View"
|
#Region "View"
|
||||||
Friend ReadOnly Property MaxLargeImageHeigh As XMLValue(Of Integer)
|
Friend ReadOnly Property MaxLargeImageHeigh As XMLValue(Of Integer)
|
||||||
Friend ReadOnly Property MaxSmallImageHeigh As XMLValue(Of Integer)
|
Friend ReadOnly Property MaxSmallImageHeigh As XMLValue(Of Integer)
|
||||||
@@ -232,6 +328,22 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Friend ReadOnly Property ShowingMode As XMLValue(Of Integer)
|
Friend ReadOnly Property ShowingMode As XMLValue(Of Integer)
|
||||||
|
Private ReadOnly Property XMLSelectedSites As XMLValue(Of String)
|
||||||
|
Private ReadOnly _SelectedSites As List(Of Sites)
|
||||||
|
Friend Property SelectedSites As List(Of Sites)
|
||||||
|
Get
|
||||||
|
Return _SelectedSites
|
||||||
|
End Get
|
||||||
|
Set(ByVal s As List(Of Sites))
|
||||||
|
_SelectedSites.Clear()
|
||||||
|
If s.ListExists Then
|
||||||
|
_SelectedSites.ListAddList(s)
|
||||||
|
XMLSelectedSites.Value = ListAddList(Of Integer, Sites)(Nothing, s).ListToString(, SitesValuesSeparator)
|
||||||
|
Else
|
||||||
|
XMLSelectedSites.Value = String.Empty
|
||||||
|
End If
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Latest values"
|
#Region "Latest values"
|
||||||
Friend ReadOnly Property LatestSavingPath As XMLValue(Of SFile)
|
Friend ReadOnly Property LatestSavingPath As XMLValue(Of SFile)
|
||||||
@@ -239,28 +351,33 @@ Friend Class SettingsCLS : Implements IDisposable
|
|||||||
Friend ReadOnly Property LatestSelectedChannel As XMLValue(Of String)
|
Friend ReadOnly Property LatestSelectedChannel As XMLValue(Of String)
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Channels properties"
|
#Region "Channels properties"
|
||||||
|
Friend ReadOnly Property ChannelsDefaultReadyForDownload As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property ChannelsDefaultTemporary As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property ChannelsRegularCheckMD5 As XMLValue(Of Boolean)
|
||||||
Friend ReadOnly Property ChannelsImagesRows As XMLValue(Of Integer)
|
Friend ReadOnly Property ChannelsImagesRows As XMLValue(Of Integer)
|
||||||
Friend ReadOnly Property ChannelsImagesColumns As XMLValue(Of Integer)
|
Friend ReadOnly Property ChannelsImagesColumns As XMLValue(Of Integer)
|
||||||
Friend ReadOnly Property ChannelsHideExistsUser As XMLValue(Of Boolean)
|
Friend ReadOnly Property ChannelsHideExistsUser As XMLValue(Of Boolean)
|
||||||
Friend ReadOnly Property ChannelsMaxJobsCount As XMLValue(Of Integer)
|
Friend ReadOnly Property ChannelsMaxJobsCount As XMLValue(Of Integer)
|
||||||
Friend ReadOnly Property FromChannelDownloadTop As XMLValue(Of Integer)
|
|
||||||
Friend ReadOnly Property FromChannelDownloadTopUse As XMLValue(Of Boolean)
|
|
||||||
Friend ReadOnly Property FromChannelCopyImageToUser As XMLValue(Of Boolean)
|
|
||||||
#End Region
|
#End Region
|
||||||
#Region "New version properties"
|
#Region "New version properties"
|
||||||
Friend ReadOnly Property CheckUpdatesAtStart As XMLValue(Of Boolean)
|
Friend ReadOnly Property CheckUpdatesAtStart As XMLValue(Of Boolean)
|
||||||
Friend ReadOnly Property ShowNewVersionNotification As XMLValue(Of Boolean)
|
Friend ReadOnly Property ShowNewVersionNotification As XMLValue(Of Boolean)
|
||||||
Friend ReadOnly Property LatestVersion As XMLValue(Of String)
|
Friend ReadOnly Property LatestVersion As XMLValue(Of String)
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "Other program properties"
|
||||||
|
Friend ReadOnly Property ExitConfirm As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property CloseToTray As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property ShowNotifications As XMLValue(Of Boolean)
|
||||||
|
#End Region
|
||||||
#Region "IDisposable Support"
|
#Region "IDisposable Support"
|
||||||
Private disposedValue As Boolean = False
|
Private disposedValue As Boolean = False
|
||||||
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
|
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
|
||||||
If Not disposedValue Then
|
If Not disposedValue Then
|
||||||
If disposing Then
|
If disposing Then
|
||||||
|
If UserListUpdateRequired Then UpdateUsersList()
|
||||||
If Not Channels Is Nothing Then
|
If Not Channels Is Nothing Then
|
||||||
Channels.Dispose()
|
Channels.Dispose()
|
||||||
If Reddit.ChannelsCollection.ChannelsPathCache.Exists(SFO.Path, False) Then _
|
DeleteCachPath()
|
||||||
Reddit.ChannelsCollection.ChannelsPathCache.Delete(SFO.Path, False, False, EDP.None)
|
|
||||||
End If
|
End If
|
||||||
For Each kv In MySites : kv.Value.Dispose() : Next
|
For Each kv In MySites : kv.Value.Dispose() : Next
|
||||||
MySites.Clear()
|
MySites.Clear()
|
||||||
|
|||||||
@@ -1,139 +1,273 @@
|
|||||||
Imports System.Threading
|
' Copyright (C) 2022 Andy
|
||||||
Imports EOptions = PersonalUtilities.Forms.Toolbars.MyProgress.EnableOptions
|
' 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.Forms.Toolbars
|
||||||
|
Imports EOptions = PersonalUtilities.Forms.Toolbars.IMyProgress.EnableOptions
|
||||||
Imports SCrawler.API
|
Imports SCrawler.API
|
||||||
Imports SCrawler.API.Base
|
Imports SCrawler.API.Base
|
||||||
Friend Class TDownloader : Implements IDisposable
|
Friend Class TDownloader : Implements IDisposable
|
||||||
Friend Event OnJobsChange(ByVal JobsCount As Integer)
|
Friend Event OnJobsChange(ByVal Site As Sites, ByVal JobsCount As Integer)
|
||||||
Friend Event OnDownloadCountChange()
|
Friend Event OnDownloadCountChange()
|
||||||
Friend Event OnDownloading(ByVal Value As Boolean)
|
Friend Event OnDownloading(ByVal Value As Boolean)
|
||||||
Private TokenSource As CancellationTokenSource
|
Friend Event SendNotification(ByVal Message As String)
|
||||||
Private ReadOnly Items As List(Of IUserData)
|
|
||||||
Friend ReadOnly Property Downloaded As List(Of IUserData)
|
Friend ReadOnly Property Downloaded As List(Of IUserData)
|
||||||
Private ReadOnly NProv As IFormatProvider
|
Private ReadOnly NProv As IFormatProvider
|
||||||
Private _Working As Boolean = False
|
Friend ReadOnly Property Working(Optional ByVal Site As Sites = Sites.Undefined) As Boolean
|
||||||
Friend ReadOnly Property Working As Boolean
|
|
||||||
Get
|
Get
|
||||||
Return _Working
|
If Site = Sites.Instagram Then
|
||||||
|
Return JobInst.Working
|
||||||
|
Else
|
||||||
|
Return JobDefault.Working Or JobInst.Working
|
||||||
|
End If
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Private DThread As Thread
|
Friend Property InstagramSavedPostsDownloading As Boolean = False
|
||||||
Friend ReadOnly Property Count As Integer
|
#Region "Jobs"
|
||||||
Get
|
Friend Structure Job
|
||||||
Return Items.Count
|
Friend Site As Sites
|
||||||
End Get
|
Private TokenSource As CancellationTokenSource
|
||||||
End Property
|
Private Token As CancellationToken
|
||||||
Friend Sub New()
|
Private [Thread] As Thread
|
||||||
Items = New List(Of IUserData)
|
Private _Working As Boolean
|
||||||
Downloaded = New List(Of IUserData)
|
Friend ReadOnly Items As List(Of IUserData)
|
||||||
NProv = New ANumbers(ANumbers.Modes.USA) With {
|
Friend ReadOnly Property Count As Integer
|
||||||
.FormatMode = ANumbers.Formats.Number,
|
Get
|
||||||
.GroupSize = 3,
|
Return Items.Count
|
||||||
.GroupSeparator = ANumbers.DefaultGroupSeparator,
|
End Get
|
||||||
.DecimalDigits = 0
|
End Property
|
||||||
}
|
Friend ReadOnly Property Working As Boolean
|
||||||
End Sub
|
Get
|
||||||
Friend Sub [Start]()
|
Return _Working OrElse If(Thread?.IsAlive, False)
|
||||||
If Not _Working AndAlso Count > 0 AndAlso Not If(DThread?.IsAlive, False) Then
|
End Get
|
||||||
DThread = New Thread(New ThreadStart(AddressOf StartDownloading))
|
End Property
|
||||||
DThread.SetApartmentState(ApartmentState.MTA)
|
Friend ReadOnly Progress As MyProgress
|
||||||
DThread.Start()
|
Friend Sub New(ByRef _Progress As MyProgress)
|
||||||
End If
|
Progress = _Progress
|
||||||
End Sub
|
Items = New List(Of IUserData)
|
||||||
Private Sub StartDownloading()
|
End Sub
|
||||||
Dim Token As CancellationToken
|
Public Shared Widening Operator CType(ByVal j As Job) As CancellationToken
|
||||||
RaiseEvent OnDownloading(True)
|
Return j.Token
|
||||||
Try
|
End Operator
|
||||||
_Working = True
|
Public Shared Widening Operator CType(ByVal j As Job) As Boolean
|
||||||
|
Return j.Working
|
||||||
|
End Operator
|
||||||
|
Public Shared Operator And(ByVal x As Job, ByVal y As Job) As Boolean
|
||||||
|
Return x.Working And y.Working
|
||||||
|
End Operator
|
||||||
|
Public Shared Operator And(ByVal x As Job, ByVal y As Boolean) As Boolean
|
||||||
|
Return x.Working And y
|
||||||
|
End Operator
|
||||||
|
Public Shared Operator And(ByVal x As Boolean, ByVal y As Job) As Boolean
|
||||||
|
Return x And y.Working
|
||||||
|
End Operator
|
||||||
|
Public Shared Operator Or(ByVal x As Job, ByVal y As Job) As Boolean
|
||||||
|
Return x.Working Or y.Working
|
||||||
|
End Operator
|
||||||
|
Public Shared Operator Or(ByVal x As Job, ByVal y As Boolean) As Boolean
|
||||||
|
Return x.Working Or y
|
||||||
|
End Operator
|
||||||
|
Public Shared Operator Or(ByVal x As Boolean, ByVal y As Job) As Boolean
|
||||||
|
Return x Or y.Working
|
||||||
|
End Operator
|
||||||
|
Public Shared Operator Not(ByVal j As Job) As Boolean
|
||||||
|
Return Not j.Working
|
||||||
|
End Operator
|
||||||
|
Friend Sub ThrowIfCancellationRequested()
|
||||||
|
Token.ThrowIfCancellationRequested()
|
||||||
|
End Sub
|
||||||
|
Friend ReadOnly Property IsCancellationRequested As Boolean
|
||||||
|
Get
|
||||||
|
Return Token.IsCancellationRequested
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Friend ReadOnly Property IsInstagram As Boolean
|
||||||
|
Get
|
||||||
|
Return Site = Sites.Instagram
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Friend Sub [Start](ByVal [ThreadStart] As ThreadStart)
|
||||||
|
Thread = New Thread(ThreadStart) With {.IsBackground = True}
|
||||||
|
Thread.SetApartmentState(ApartmentState.MTA)
|
||||||
|
Thread.Start()
|
||||||
|
End Sub
|
||||||
|
Friend Sub [Start]()
|
||||||
TokenSource = New CancellationTokenSource
|
TokenSource = New CancellationTokenSource
|
||||||
Token = TokenSource.Token
|
Token = TokenSource.Token
|
||||||
MainProgress.TotalCount = 0
|
_Working = True
|
||||||
MainProgress.CurrentCounter = 0
|
End Sub
|
||||||
Do While Count > 0
|
Friend Sub [Stop]()
|
||||||
Token.ThrowIfCancellationRequested()
|
If Not TokenSource Is Nothing Then TokenSource.Cancel()
|
||||||
UpdateJobsLabel()
|
End Sub
|
||||||
DownloadData(Token)
|
Friend Sub Stopped()
|
||||||
Token.ThrowIfCancellationRequested()
|
|
||||||
Thread.Sleep(500)
|
|
||||||
Loop
|
|
||||||
MainProgress.InformationTemporary = "All data downloaded"
|
|
||||||
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
|
||||||
MainProgress.InformationTemporary = "Downloading canceled"
|
|
||||||
Catch ex As Exception
|
|
||||||
MainProgress.InformationTemporary = "Downloading error"
|
|
||||||
ErrorsDescriber.Execute(EDP.SendInLog, ex, "TDownloader.Start")
|
|
||||||
Finally
|
|
||||||
_Working = False
|
_Working = False
|
||||||
TokenSource = Nothing
|
TokenSource = Nothing
|
||||||
UpdateJobsLabel()
|
Try
|
||||||
|
If Not Thread Is Nothing Then
|
||||||
|
If Thread.IsAlive Then Thread.Abort()
|
||||||
|
Thread = Nothing
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
End Structure
|
||||||
|
Private JobDefault As Job
|
||||||
|
Private JobInst As Job
|
||||||
|
#End Region
|
||||||
|
Friend Sub New()
|
||||||
|
Downloaded = New List(Of IUserData)
|
||||||
|
NProv = New ANumbers With {.FormatOptions = ANumbers.Options.GroupIntegral}
|
||||||
|
JobDefault = New Job(MainProgress)
|
||||||
|
JobInst = New Job(MainProgressInst) With {.Site = Sites.Instagram}
|
||||||
|
End Sub
|
||||||
|
Friend Sub [Start]()
|
||||||
|
If Not JobDefault.Working And JobDefault.Count > 0 Then JobDefault.Start(New ThreadStart(Sub() StartDownloading(JobDefault)))
|
||||||
|
If Not JobInst.Working And JobInst.Count > 0 And Not InstagramSavedPostsDownloading Then _
|
||||||
|
JobInst.Start(New ThreadStart(Sub() StartDownloading(JobInst)))
|
||||||
|
End Sub
|
||||||
|
Private Sub StartDownloading(ByRef _Job As Job)
|
||||||
|
RaiseEvent OnDownloading(True)
|
||||||
|
Dim isInst As Boolean = _Job.IsInstagram
|
||||||
|
Dim pt As Func(Of String, String) = Function(ByVal t As String) As String
|
||||||
|
Dim _t$ = If(isInst, $"Instagram {Left(t, 1).ToLower}{Right(t, t.Length - 1)}", t)
|
||||||
|
RaiseEvent SendNotification(_t)
|
||||||
|
Return _t
|
||||||
|
End Function
|
||||||
|
Try
|
||||||
|
_Job.Start()
|
||||||
|
_Job.Progress.TotalCount = 0
|
||||||
|
_Job.Progress.CurrentCounter = 0
|
||||||
|
_Job.Progress.Enabled = True
|
||||||
|
Do While _Job.Count > 0
|
||||||
|
_Job.ThrowIfCancellationRequested()
|
||||||
|
UpdateJobsLabel(_Job)
|
||||||
|
DownloadData(_Job, _Job)
|
||||||
|
_Job.ThrowIfCancellationRequested()
|
||||||
|
Thread.Sleep(500)
|
||||||
|
Loop
|
||||||
|
_Job.Progress.InformationTemporary = pt("All data downloaded")
|
||||||
|
Catch oex As OperationCanceledException When _Job.IsCancellationRequested
|
||||||
|
_Job.Progress.InformationTemporary = pt("Downloading canceled")
|
||||||
|
Catch ex As Exception
|
||||||
|
_Job.Progress.InformationTemporary = pt("Downloading error")
|
||||||
|
ErrorsDescriber.Execute(EDP.SendInLog, ex, "TDownloader.Start")
|
||||||
|
Finally
|
||||||
|
_Job.Stopped()
|
||||||
|
UpdateJobsLabel(_Job)
|
||||||
|
If _Job.Site = Sites.Instagram Then
|
||||||
|
Settings(Sites.Instagram).InstagramLastDownloadDate.Value = Now
|
||||||
|
If Settings(Sites.Instagram).InstaHashUpdateRequired Then MyMainLOG = "Check your Instagram credentials"
|
||||||
|
End If
|
||||||
|
_Job.Progress.Enabled(EOptions.ProgressBar) = False
|
||||||
RaiseEvent OnDownloading(False)
|
RaiseEvent OnDownloading(False)
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub [Stop]()
|
Friend Sub [Stop]()
|
||||||
If _Working Then TokenSource.Cancel()
|
If JobDefault.Working Then JobDefault.Stop()
|
||||||
|
If JobInst.Working Then JobInst.Stop()
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub UpdateJobsLabel()
|
Private Overloads Sub UpdateJobsLabel()
|
||||||
RaiseEvent OnJobsChange(Count)
|
UpdateJobsLabel(JobDefault)
|
||||||
|
UpdateJobsLabel(JobInst)
|
||||||
End Sub
|
End Sub
|
||||||
Private _CurrentDownloadingTasks As Integer = 0
|
Private Overloads Sub UpdateJobsLabel(ByVal _Job As Job)
|
||||||
Private Sub DownloadData(ByVal Token As CancellationToken)
|
RaiseEvent OnJobsChange(_Job.Site, _Job.Count)
|
||||||
|
End Sub
|
||||||
|
Private _InstagramNextWNM As Instagram.UserData.WNM = Instagram.UserData.WNM.Notify
|
||||||
|
Private Sub DownloadData(ByRef _Job As Job, ByVal Token As CancellationToken)
|
||||||
Try
|
Try
|
||||||
If Items.Count > 0 Then
|
If _Job.Count > 0 Then
|
||||||
Const nf As ANumbers.Formats = ANumbers.Formats.Number
|
Const nf As ANumbers.Formats = ANumbers.Formats.Number
|
||||||
Dim t As New List(Of Task)
|
Dim t As New List(Of Task)
|
||||||
Dim i% = -1
|
Dim i% = 0
|
||||||
Dim j% = Settings.MaxUsersJobsCount - 1
|
Dim j% = Settings.MaxUsersJobsCount
|
||||||
|
Dim limit% = IIf(_Job.Site = Sites.Instagram, 1, j)
|
||||||
Dim Keys As New List(Of String)
|
Dim Keys As New List(Of String)
|
||||||
For Each _Item As IUserData In Items
|
Dim h As Boolean = False
|
||||||
|
Dim InstaReady As Boolean = Settings(Sites.Instagram).InstagramReadyForDownload
|
||||||
|
For Each _Item As IUserData In _Job.Items
|
||||||
If Not _Item.Disposed Then
|
If Not _Item.Disposed Then
|
||||||
Keys.Add(_Item.LVIKey)
|
Keys.Add(_Item.LVIKey)
|
||||||
Token.ThrowIfCancellationRequested()
|
If Not _Item.Site = Sites.Instagram Or InstaReady Then
|
||||||
t.Add(Task.Run(Sub() _Item.DownloadData(Token)))
|
If _Item.Site = Sites.Instagram Then
|
||||||
i += 1
|
h = True
|
||||||
If i >= j Then Exit For
|
With DirectCast(_Item, Instagram.UserData)
|
||||||
|
.WaitNotificationMode = _InstagramNextWNM
|
||||||
|
If Settings(Sites.Instagram).InstagramLastDownloadDate.Value < Now.AddMinutes(60) Then
|
||||||
|
.RequestsCount = Settings(Sites.Instagram).InstagramLastRequestsCount
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
_Job.ThrowIfCancellationRequested()
|
||||||
|
t.Add(Task.Run(Sub() _Item.DownloadData(Token)))
|
||||||
|
i += 1
|
||||||
|
If i >= limit Then Exit For
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
If t.Count > 0 Then
|
If t.Count > 0 Or Keys.Count > 0 Then
|
||||||
_CurrentDownloadingTasks = t.Count
|
If h Then
|
||||||
With MainProgress
|
With Settings(Sites.Instagram)
|
||||||
|
If .InstaHash.IsEmptyString Or .InstaHashUpdateRequired Then .GatherInstaHash()
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
With _Job.Progress
|
||||||
.Enabled(EOptions.All) = True
|
.Enabled(EOptions.All) = True
|
||||||
.Information = $"Downloading {_CurrentDownloadingTasks.NumToString(nf, NProv)}/{Items.Count.NumToString(nf, NProv)} profiles' data"
|
.Information = IIf(_Job.IsInstagram, "Instagram d", "D")
|
||||||
|
.Information &= $"ownloading {t.Count.NumToString(nf, NProv)}/{_Job.Items.Count.NumToString(nf, NProv)} profiles' data"
|
||||||
.InformationTemporary = .Information
|
.InformationTemporary = .Information
|
||||||
End With
|
End With
|
||||||
Token.ThrowIfCancellationRequested()
|
If t.Count > 0 Then Task.WaitAll(t.ToArray)
|
||||||
Task.WaitAll(t.ToArray, Token)
|
|
||||||
Dim dcc As Boolean = False
|
Dim dcc As Boolean = False
|
||||||
If Keys.Count > 0 Then
|
If Keys.Count > 0 Then
|
||||||
For Each k$ In Keys
|
For Each k$ In Keys
|
||||||
i = Items.FindIndex(Function(ii) ii.LVIKey = k)
|
i = _Job.Items.FindIndex(Function(ii) ii.LVIKey = k)
|
||||||
If i >= 0 Then
|
If i >= 0 Then
|
||||||
With Items(i)
|
With _Job.Items(i)
|
||||||
|
If _Job.Site = Sites.Instagram Then
|
||||||
|
With DirectCast(.Self, Instagram.UserData)
|
||||||
|
_InstagramNextWNM = .WaitNotificationMode
|
||||||
|
If _InstagramNextWNM = Instagram.UserData.WNM.SkipTemp Or _InstagramNextWNM = Instagram.UserData.WNM.SkipCurrent Then _
|
||||||
|
_InstagramNextWNM = Instagram.UserData.WNM.Notify
|
||||||
|
Settings(Sites.Instagram).InstagramLastRequestsCount.Value = .RequestsCount
|
||||||
|
End With
|
||||||
|
End If
|
||||||
If Not .Disposed AndAlso Not .IsCollection AndAlso .DownloadedTotal(False) > 0 Then
|
If Not .Disposed AndAlso Not .IsCollection AndAlso .DownloadedTotal(False) > 0 Then
|
||||||
If Not Downloaded.Contains(.Self) Then Downloaded.Add(GetUserFromMainCollection(.Self))
|
If Not Downloaded.Contains(.Self) Then Downloaded.Add(GetUserFromMainCollection(.Self))
|
||||||
dcc = True
|
dcc = True
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
Items.RemoveAt(i)
|
_Job.Items.RemoveAt(i)
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
Keys.Clear()
|
Keys.Clear()
|
||||||
Items.RemoveAll(Function(ii) ii.Disposed)
|
_Job.Items.RemoveAll(Function(ii) ii.Disposed)
|
||||||
If dcc Then Downloaded.RemoveAll(Function(u) u Is Nothing)
|
If dcc Then Downloaded.RemoveAll(Function(u) u Is Nothing)
|
||||||
If dcc And Downloaded.Count > 0 Then RaiseEvent OnDownloadCountChange()
|
If dcc And Downloaded.Count > 0 Then RaiseEvent OnDownloadCountChange()
|
||||||
t.Clear()
|
t.Clear()
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
Catch aoex As ArgumentOutOfRangeException
|
Catch aoex As ArgumentOutOfRangeException
|
||||||
ErrorsDescriber.Execute(EDP.SendInLog, aoex, $"TDownloader.DownloadData: index out of range ({Count})")
|
ErrorsDescriber.Execute(EDP.SendInLog, aoex, $"TDownloader.DownloadData: index out of range ({_Job.Count})")
|
||||||
Catch oex As OperationCanceledException When Token.IsCancellationRequested
|
Catch oex As OperationCanceledException When _Job.IsCancellationRequested
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ErrorsDescriber.Execute(EDP.SendInLog, ex, "TDownloader.DownloadData")
|
ErrorsDescriber.Execute(EDP.SendInLog, ex, "TDownloader.DownloadData")
|
||||||
Finally
|
Finally
|
||||||
MainProgress.Enabled(EOptions.ProgressBar) = False
|
If Settings.UserListUpdateRequired Then _
|
||||||
|
Task.WaitAll(Task.Run(Sub()
|
||||||
|
While Settings.UserListUpdateRequired : Settings.UpdateUsersList() : End While
|
||||||
|
End Sub))
|
||||||
|
If _Job.Site = Sites.Instagram Then Settings(Sites.Instagram).InstagramLastDownloadDate.Value = Now
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Function GetUserFromMainCollection(ByVal User As IUserData) As IUserData
|
Private Function GetUserFromMainCollection(ByVal User As IUserData) As IUserData
|
||||||
Dim uSimple As Predicate(Of IUserData) = Function(u) u.Equals(DirectCast(User, UserDataBase))
|
Dim uSimple As Predicate(Of IUserData) = Function(u) u.Equals(DirectCast(User.Self, UserDataBase))
|
||||||
Dim uCol As Predicate(Of IUserData) = Function(ByVal u As IUserData) As Boolean
|
Dim uCol As Predicate(Of IUserData) = Function(ByVal u As IUserData) As Boolean
|
||||||
If u.IsCollection Then
|
If u.IsCollection Then
|
||||||
Return DirectCast(u, UserDataBind).Collections.Exists(uSimple)
|
Return DirectCast(u, UserDataBind).Collections.Exists(uSimple)
|
||||||
@@ -156,23 +290,37 @@ Friend Class TDownloader : Implements IDisposable
|
|||||||
End If
|
End If
|
||||||
Return Nothing
|
Return Nothing
|
||||||
End Function
|
End Function
|
||||||
Friend Sub Add(ByVal Item As IUserData)
|
Private Sub AddItem(ByVal Item As IUserData, ByVal _UpdateJobsLabel As Boolean)
|
||||||
If Not Items.Contains(Item) Then
|
If Not Contains(Item) Then
|
||||||
If Item.IsCollection Then Item.DownloadData(Nothing) Else Items.Add(Item)
|
If Item.IsCollection Then
|
||||||
UpdateJobsLabel()
|
Item.DownloadData(Nothing)
|
||||||
If Not _Working Then Start()
|
ElseIf Item.Site = Sites.Instagram Then
|
||||||
|
JobInst.Items.Add(Item)
|
||||||
|
If _UpdateJobsLabel Then UpdateJobsLabel(JobInst)
|
||||||
|
Else
|
||||||
|
JobDefault.Items.Add(Item)
|
||||||
|
If _UpdateJobsLabel Then UpdateJobsLabel(JobDefault)
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
Friend Sub Add(ByVal Item As IUserData)
|
||||||
|
AddItem(Item, True)
|
||||||
|
If JobDefault.Count > 0 Or JobInst.Count > 0 Then Start()
|
||||||
|
End Sub
|
||||||
Friend Sub AddRange(ByVal _Items As IEnumerable(Of IUserData))
|
Friend Sub AddRange(ByVal _Items As IEnumerable(Of IUserData))
|
||||||
If _Items.ListExists Then
|
If _Items.ListExists Then
|
||||||
For i% = 0 To _Items.Count - 1
|
For i% = 0 To _Items.Count - 1 : AddItem(_Items(i), False) : Next
|
||||||
'If i = 5 Then UpdateJobsLabel() : Start()
|
|
||||||
If _Items(i).IsCollection Then _Items(i).DownloadData(Nothing) Else Items.Add(_Items(i))
|
|
||||||
Next
|
|
||||||
UpdateJobsLabel()
|
UpdateJobsLabel()
|
||||||
Start()
|
|
||||||
End If
|
End If
|
||||||
|
If JobDefault.Count > 0 Or JobInst.Count > 0 Then Start()
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Function Contains(ByVal _Item As IUserData)
|
||||||
|
If _Item.Site = Sites.Instagram Then
|
||||||
|
Return JobInst.Items.Contains(_Item)
|
||||||
|
Else
|
||||||
|
Return JobDefault.Items.Contains(_Item)
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
Friend Sub UserRemove(ByVal _Item As IUserData)
|
Friend Sub UserRemove(ByVal _Item As IUserData)
|
||||||
If Downloaded.Count > 0 AndAlso Downloaded.Contains(_Item) Then Downloaded.Remove(_Item) : RaiseEvent OnDownloadCountChange()
|
If Downloaded.Count > 0 AndAlso Downloaded.Contains(_Item) Then Downloaded.Remove(_Item) : RaiseEvent OnDownloadCountChange()
|
||||||
End Sub
|
End Sub
|
||||||
@@ -182,7 +330,8 @@ Friend Class TDownloader : Implements IDisposable
|
|||||||
If Not disposedValue Then
|
If Not disposedValue Then
|
||||||
If disposing Then
|
If disposing Then
|
||||||
[Stop]()
|
[Stop]()
|
||||||
Items.Clear()
|
JobDefault.Items.Clear()
|
||||||
|
JobInst.Items.Clear()
|
||||||
Downloaded.Clear()
|
Downloaded.Clear()
|
||||||
End If
|
End If
|
||||||
disposedValue = True
|
disposedValue = True
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
Imports PersonalUtilities.Tools
|
' 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.Tools
|
||||||
Friend Class UserImage : Inherits ImageRenderer
|
Friend Class UserImage : Inherits ImageRenderer
|
||||||
Friend Const ImagePrefix As String = "UserPicture"
|
Friend Const ImagePrefix As String = "UserPicture"
|
||||||
Friend Const ImagePostfix_Large As String = "_Large"
|
Friend Const ImagePostfix_Large As String = "_Large"
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
Imports System.ComponentModel
|
' 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.ComponentModel
|
||||||
Imports PersonalUtilities.Forms
|
Imports PersonalUtilities.Forms
|
||||||
Friend Class VideosDownloaderForm
|
Friend Class VideosDownloaderForm
|
||||||
Private MyView As FormsView
|
Private MyView As FormsView
|
||||||
@@ -18,7 +26,7 @@ Friend Class VideosDownloaderForm
|
|||||||
MyView = New FormsView(Me)
|
MyView = New FormsView(Me)
|
||||||
MyView.ImportFromXML(Settings.Design)
|
MyView.ImportFromXML(Settings.Design)
|
||||||
MyView.SetMeSize()
|
MyView.SetMeSize()
|
||||||
RefillList()
|
RefillList(False)
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
@@ -28,9 +36,7 @@ Friend Class VideosDownloaderForm
|
|||||||
End Sub
|
End Sub
|
||||||
Private Sub VideosDownloaderForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
Private Sub VideosDownloaderForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
||||||
If Not MyView Is Nothing Then MyView.Dispose(Settings.Design)
|
If Not MyView Is Nothing Then MyView.Dispose(Settings.Design)
|
||||||
If UrlList.Count > 0 Then
|
If UrlList.Count > 0 Then UpdateUrlsFile()
|
||||||
TextSaver.SaveTextToFile(UrlList.ListToString(, Environment.NewLine), DownloadingUrlsFile, True,, EDP.SendInLog)
|
|
||||||
End If
|
|
||||||
UrlList.Clear()
|
UrlList.Clear()
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub VideosDownloaderForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
Private Sub VideosDownloaderForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
||||||
@@ -43,17 +49,25 @@ Friend Class VideosDownloaderForm
|
|||||||
End Select
|
End Select
|
||||||
If b Then e.Handled = True
|
If b Then e.Handled = True
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub RefillList()
|
Private Sub RefillList(Optional ByVal Update As Boolean = True)
|
||||||
Try
|
Try
|
||||||
With LIST_VIDEOS
|
With LIST_VIDEOS
|
||||||
.Items.Clear()
|
.Items.Clear()
|
||||||
If UrlList.Count > 0 Then UrlList.ForEach(Sub(u) .Items.Add(u))
|
If UrlList.Count > 0 Then UrlList.ForEach(Sub(u) .Items.Add(u))
|
||||||
If .Items.Count > 0 And _LatestSelected >= 0 And _LatestSelected <= .Items.Count - 1 Then .SelectedIndex = _LatestSelected
|
If .Items.Count > 0 And _LatestSelected >= 0 And _LatestSelected <= .Items.Count - 1 Then .SelectedIndex = _LatestSelected
|
||||||
|
If Update Then UpdateUrlsFile()
|
||||||
End With
|
End With
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on list refill")
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on list refill")
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub UpdateUrlsFile()
|
||||||
|
If UrlList.Count > 0 Then
|
||||||
|
TextSaver.SaveTextToFile(UrlList.ListToString(, Environment.NewLine), DownloadingUrlsFile, True,, EDP.SendInLog)
|
||||||
|
Else
|
||||||
|
If DownloadingUrlsFile.Exists Then DownloadingUrlsFile.Delete(,,, EDP.SendInLog)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
Private Sub BTT_ADD_Click(sender As Object, e As EventArgs) Handles BTT_ADD.Click
|
Private Sub BTT_ADD_Click(sender As Object, e As EventArgs) Handles BTT_ADD.Click
|
||||||
AddVideo()
|
AddVideo()
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||