Compare commits
114 Commits
2023.1.2.0
...
2024.6.6.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
93ea2a55ac | ||
|
|
2ae8c3acfc | ||
|
|
53dcb3e2c6 | ||
|
|
ca384e54d6 | ||
|
|
5a1b5c828a | ||
|
|
22c59b41f0 | ||
|
|
444b3521eb | ||
|
|
ec2266f1bf | ||
|
|
7d9255c916 | ||
|
|
5b5857e31d | ||
|
|
46372ec9fb | ||
|
|
7296fda977 | ||
|
|
5f90bf6a99 | ||
|
|
718eccc3c3 | ||
|
|
efa09fb457 | ||
|
|
b252d32a7e | ||
|
|
34cd510507 | ||
|
|
f5dd791941 | ||
|
|
2a2c12c651 | ||
|
|
2bacc17ac4 | ||
|
|
7a68067d77 | ||
|
|
d1eacc2db2 | ||
|
|
3f38803643 | ||
|
|
09760a6926 | ||
|
|
75039ac4d2 | ||
|
|
03e3a07947 | ||
|
|
d283d9c9f9 | ||
|
|
b9100bd3c1 | ||
|
|
0ea2156ada | ||
|
|
520280b038 | ||
|
|
10516f229b | ||
|
|
c3f0831768 | ||
|
|
74a0404670 | ||
|
|
52a43b9207 | ||
|
|
5bc559c448 | ||
|
|
b37f641582 | ||
|
|
e00dfec701 | ||
|
|
94edf23570 | ||
|
|
0246af9b69 | ||
|
|
c458f1cd1d | ||
|
|
e3da1bf1d3 | ||
|
|
dde024276b | ||
|
|
7a33c02497 | ||
|
|
5bd79ff3c2 | ||
|
|
3268bca0d3 | ||
|
|
1455a31879 | ||
|
|
64d6e6b28c | ||
|
|
da7cddc720 | ||
|
|
72be6b09ff | ||
|
|
3a0837a1b0 | ||
|
|
0657f3d195 | ||
|
|
c92314d8e8 | ||
|
|
d99243ce46 | ||
|
|
3dae40b696 | ||
|
|
ee0c773c37 | ||
|
|
ebe5f0ca01 | ||
|
|
a540aded68 | ||
|
|
0ec617c1dc | ||
|
|
45adf735a7 | ||
|
|
496c9487cd | ||
|
|
96705f1c59 | ||
|
|
f08a5f9259 | ||
|
|
95cbb6aeb1 | ||
|
|
5af0dcc46e | ||
|
|
f5789862ba | ||
|
|
12c02580f6 | ||
|
|
6def34d5e9 | ||
|
|
831d9a5a09 | ||
|
|
326e61a968 | ||
|
|
61903afe3f | ||
|
|
fa3f39b905 | ||
|
|
c76fd7f918 | ||
|
|
66085e0d95 | ||
|
|
0a1602b453 | ||
|
|
adf788781d | ||
|
|
77711965c0 | ||
|
|
7f1ac6f512 | ||
|
|
f4eb33d8da | ||
|
|
77443cedc4 | ||
|
|
a446df1f66 | ||
|
|
0026e905a4 | ||
|
|
f8116fd048 | ||
|
|
8d33fdc8f3 | ||
|
|
dab94acc32 | ||
|
|
c61c817585 | ||
|
|
3ea59a6acd | ||
|
|
2a60ace18f | ||
|
|
f0014d2874 | ||
|
|
28ae44f0ae | ||
|
|
1b1226025a | ||
|
|
58927b3113 | ||
|
|
df06a86651 | ||
|
|
bade8666d5 | ||
|
|
c70caa0035 | ||
|
|
ac532dbc6f | ||
|
|
82ef4f4410 | ||
|
|
d34414359c | ||
|
|
e51debc027 | ||
|
|
938042ea9e | ||
|
|
abdef81e5f | ||
|
|
e868c2e694 | ||
|
|
b2a9b22478 | ||
|
|
db9e2cfb88 | ||
|
|
85d8df96ca | ||
|
|
6ca90f0489 | ||
|
|
2a780a3acf | ||
|
|
290b5c4586 | ||
|
|
f5e68a7032 | ||
|
|
ece573dd40 | ||
|
|
1f1148020c | ||
|
|
fc226d549a | ||
|
|
602771d982 | ||
|
|
3e472b4f2b | ||
|
|
30c3fe3b68 |
3
.gitattributes
vendored
@@ -1,2 +1,5 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
# Declare files that will always have CRLF line endings on checkout.
|
||||
*.md text eol=crlf
|
||||
4
.github/FUNDING.yml
vendored
@@ -3,11 +3,11 @@
|
||||
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
|
||||
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: ['https://blockchair.com/bitcoin/address/BC1Q0NH839FT5TA44DD7L7RLR97XDQAG9V8D6N7XET']
|
||||
custom: ['https://github.com/AAndyProgram/SCrawler/blob/main/HowToSupport.md']
|
||||
|
||||
29
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -13,11 +13,16 @@ A clear and concise description of what the bug is.
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. **Profile URL**:
|
||||
2. Do something
|
||||
3. See error
|
||||
2. **Post URL**:
|
||||
3. Do something
|
||||
4. See error
|
||||
|
||||
**Log data**
|
||||
If the program log contains any data.
|
||||
<details>
|
||||
<summary>Log data</summary>
|
||||
<pre>
|
||||
If the program log contains any data, replace this line with the log data. If the program log does not contain any data, write here about.
|
||||
</pre>
|
||||
</details>
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
@@ -25,11 +30,17 @@ 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):**
|
||||
- OS [e.g. Windows 10, Windows 11]
|
||||
- Architecture [e.g. x86, x64]
|
||||
- Version [e.g. 2.0.0.0]
|
||||
- NET.Framework version
|
||||
**Release information:**
|
||||
|
||||
**Please complete the following information or replace the following text with data copied from SCrawler (click the top right info button in the main window, then the `Environment` button, then the `Copy` button, and paste the copied text here).**
|
||||
- OS: [e.g. Windows 10, Windows 11]
|
||||
- Architecture: [e.g. x86, x64]
|
||||
- Version: [e.g. 2023.3.5.0]
|
||||
- NET.Framework version:
|
||||
- ffmpeg version (command `ffmpeg -version`):
|
||||
- yt-dlp version (command `yt-dlp --version`):
|
||||
- gallery-dl version (command `gallery-dl --version`):
|
||||
- cURL version (command `curl --version`):
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
7
.gitignore
vendored
@@ -9,8 +9,8 @@
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
ffmpeg.exe
|
||||
ToDo.txt
|
||||
.obsidian/
|
||||
BugReporterFormDiscordWebHook.vb
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
@@ -33,10 +33,7 @@ bld/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
ffmpeg/
|
||||
cURL/
|
||||
Info/
|
||||
Hidden/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
|
||||
@@ -5,21 +5,30 @@ I welcome requests! Follow these steps to contribute:
|
||||
1. Find an [issue](https://github.com/AAndyProgram/SCrawler/issues) that needs assistance.
|
||||
1. Let me know you are working on it by posting a comment on the issue.
|
||||
1. If you find an error in the code, please provide a link to the file and the line number.
|
||||
1. If you have a code change suggestion, you can post a replacement code block. I also accept pull requests.
|
||||
1. If you have a code change suggestion, you can post a replacement code block.<!-- I also accept pull requests.-->
|
||||
|
||||
# How to report a problem
|
||||
1. Attach the **profile URLs or links** that you cannot download.
|
||||
1. Attach the **LOG** if it exists.
|
||||
1. **Attach the environment information copied from SCrawler (click the top right info button in the main window, then the `Environment` button, then the `Copy` button, and paste the copied text into the issue).**
|
||||
1. *Add screenshots to illustrate the problem (**optional**)*
|
||||
|
||||
# How to build from source
|
||||
1. Delete the "PersonalUtilities" project from the solution.
|
||||
1. Delete the "PersonalUtilities.Notifications" project from the solution.
|
||||
1. Delete the `PersonalUtilities` project from the solution.
|
||||
1. Delete the `PersonalUtilities.Notifications` project from the solution.
|
||||
1. The following libraries must be added to project references with the '**Copy to output folder**' option:
|
||||
- ```PersonalUtilities.dll```
|
||||
- ```PersonalUtilities.Notifications.dll```
|
||||
- ```Microsoft.Toolkit.Uwp.Notifications.dll```
|
||||
- ```System.ValueTuple.dll```
|
||||
1. Import PersonalUtilities.Functions for the whole project.
|
||||
- `PersonalUtilities.dll`
|
||||
- `PersonalUtilities.Notifications.dll`
|
||||
- `Microsoft.Toolkit.Uwp.Notifications.dll`
|
||||
- `System.ValueTuple.dll`
|
||||
1. Import `PersonalUtilities.Functions` for the whole project.
|
||||
|
||||
**Always use the correct libraries. You must download libraries from the same release date as the code commit date.**
|
||||
|
||||
# How to request a new site
|
||||
|
||||
**I'm currently not accepting requests to develop new sites.**
|
||||
|
||||
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.
|
||||
1. If you don't find anything, create a new issue with your request. I usually reply as soon as possible (within the next few hours).
|
||||
|
||||
@@ -36,5 +45,4 @@ I welcome requests! Follow these steps to contribute:
|
||||
If I'm interested in a site you want to add, it may be added in future releases.
|
||||
|
||||
# Sites I will never develop
|
||||
- Facebook
|
||||
- Tumblr
|
||||
773
Changelog.md
@@ -1,3 +1,776 @@
|
||||
# 2024.6.6.0
|
||||
|
||||
*2024-06-06*
|
||||
|
||||
**ATTENTION!**
|
||||
1. **To support downloading of DRM protected videos (OnlyFans), please update OF-Scraper to version [3.10](https://github.com/datawhores/OF-Scraper/releases/tag/3.10) (download `zip`, not `exe`).**
|
||||
2. **If there is a `OFScraperConfigPattern.json` file in the SCrawler settings folder, replace the text of the file with [this text](https://github.com/AAndyProgram/SCrawler/blob/main/SCrawler/API/OnlyFans/OFScraperConfigPattern.json).**
|
||||
3. **Set the value to `Dynamic rules` (in the site settings) = `https://raw.githubusercontent.com/Growik/onlyfans-dynamic-rules/main/rules.json`.**
|
||||
|
||||
- Added
|
||||
- OnlyFans: new OF-Scraper option (`keydb_api`)
|
||||
- Minor improvements
|
||||
- Fixed
|
||||
- OnlyFans: **data is not downloading**
|
||||
- Minor bugs
|
||||
|
||||
# 2024.6.4.0
|
||||
|
||||
*2024-06-04*
|
||||
|
||||
**If you were using the [`yt-dlp-TTUser`](https://github.com/bashonly/yt-dlp-TTUser) plugin, you should remove it because this plugin was added to yt-dlp itself! Read more [here](https://github.com/AAndyProgram/SCrawler/wiki/Settings#tiktok-requirements).**
|
||||
|
||||
- Added
|
||||
- Added highlighting of scheduler plans (working, stopped, pending, etc.)
|
||||
- YouTube (standalone app): add option to add the video upload date before/after the file name (`Settings` - `Defaults` - `Add date to file name`)
|
||||
- Twitter: **`Communities` downloading**
|
||||
- Feed: ability to select one of the download sessions and set it as the current session
|
||||
- Minor improvements
|
||||
- Updated
|
||||
- yt-dlp up to version **2024.05.27**
|
||||
- gallery-dl up to version **1.27.0**
|
||||
- Fixed
|
||||
- Twitter: deleting user directory when redownloading missing posts
|
||||
- Minor bugs
|
||||
|
||||
# 2024.5.19.0
|
||||
|
||||
*2024-05-19*
|
||||
|
||||
- Added
|
||||
- YouTube (standalone app): add upload date to description (request #192) (`Settings` - `Info` - `Create description files: add upload date`, `Create description files: create without description`).
|
||||
- Fixed
|
||||
- YouTube (SCrawler): advanced settings are not saved when changed
|
||||
|
||||
# 2024.5.18.0
|
||||
|
||||
*2024-05-18*
|
||||
|
||||
- Added
|
||||
- YouTube (standalone app): highlight frame rates higher/lower than this value (`Settings` - `Defaults Video` - `Highlight FPS (higher/lower)`).
|
||||
- Sites
|
||||
- Instagram: 'DownDetector' support to determine if the site is accessible
|
||||
- Reddit: change the naming method of video files (hosted on Reddit) to the `YYYYMMDD_HHMMSS` pattern
|
||||
- Twitter
|
||||
- `Likes` downloading *(user settings)*
|
||||
- **changed domain from twitter.com to x.com**
|
||||
- Site settings: group options by category
|
||||
- Minor improvements
|
||||
- PluginProvider
|
||||
- `PropertyOption` attribute: set category name when `IsAuth = True`
|
||||
- `ISiteSettings`: added `UserAgentDefault` property
|
||||
- Updated
|
||||
- gallery-dl up to version **1.27.0-dev**
|
||||
- Fixed
|
||||
- Sites
|
||||
- Instagram: incorrect definition of pinned posts
|
||||
- Threads: new posts are no longer downloaded from profiles with pinned posts
|
||||
- Reddit: bypass error 429 for saved posts
|
||||
- Twitter: **data is not downloading due to domain change from twitter.com to x.com**
|
||||
- Minor bugs
|
||||
|
||||
# 2024.5.4.0
|
||||
|
||||
*2024-05-04*
|
||||
|
||||
- Added
|
||||
- YouTube (standalone app): setting to remove specific characters (`Defaults` - `Remove characters`)
|
||||
- Instagram: simplify the `Connection closed` error
|
||||
- Users search: add `Friendly name` to search results
|
||||
- Fixed
|
||||
- YouTube (standalone app): incorrect download processing when the file name ends with a dot (Issue #188)
|
||||
- The program is freezes when editing users in some cases
|
||||
- Sites
|
||||
- Reddit: token update error
|
||||
- Threads: unable to obtain credentials (`ID`)
|
||||
|
||||
# 2024.4.26.0
|
||||
|
||||
*2024-04-26*
|
||||
|
||||
- Added
|
||||
- Site settings: the values that can be extracted from cookies immediately populate fields
|
||||
- Feed: ability to load the last session of the current day (if it exists) as the current session after restarting SCrawler
|
||||
- Users search: include friendly name matches in search result
|
||||
- Updated
|
||||
- gallery-dl up to version **1.26.9**
|
||||
- Fixed
|
||||
- xHamster: **saved posts aren't downloading**
|
||||
|
||||
# 2024.4.14.0
|
||||
|
||||
*2024-04-14*
|
||||
|
||||
- Fixed
|
||||
- Facebook: can't get tokens
|
||||
|
||||
# 2024.4.13.0
|
||||
|
||||
*2024-04-13*
|
||||
|
||||
- Added
|
||||
- Minor improvements
|
||||
- PluginProvider
|
||||
- IPluginContentProvider: added `ResetHistoryData` function
|
||||
- Fixed
|
||||
- Sites
|
||||
- TikTok: remove last download date when erasing history data
|
||||
- YouTube: remove last download date when erasing history data
|
||||
- Instagram: **saved posts aren't downloading**
|
||||
|
||||
# 2024.4.10.0
|
||||
|
||||
*2024-04-10*
|
||||
|
||||
**For those of you who use TikTok, it is highly recommended to update TikTok plugin (using [these instructions](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-install-yt-dlp-ttuser-plugin)) to the latest version!**
|
||||
|
||||
**ATTENTION! This version includes changes to downloading groups (including the scheduler) and the settings file. Once you start using it, you won't be able to downgrade. I recommend making a backup of your SCrawler settings folder. It is also recommended to check all of your download groups settings and scheduler plans settings.**
|
||||
|
||||
- Added
|
||||
- Sites
|
||||
- TikTok: more settings for standalone downloader
|
||||
- Instagram:
|
||||
- automatically reset download options after updating credentials
|
||||
- **ability to extract an image (if it exists) from a video that contains a static image**
|
||||
- updated reels downloading function
|
||||
- GraphQL support
|
||||
- request timers (per request)
|
||||
- OnlyFans:
|
||||
- **download stories**
|
||||
- option to disable timeline downloading
|
||||
- Reddit: added `Check image` setting (unchecked by default) to make Reddit downloading faster
|
||||
- **YouTube (standalone app)**:
|
||||
- **the ability to add downloaded item(s) to a playlist**
|
||||
- **the ability to create a playlist from downloaded music**
|
||||
- calculation and display of the actual size of downloaded files
|
||||
- **the ability to change audio bitrate** *(you can also set the default bitrate in `Defaults Audio` - `Bitrate`)*
|
||||
- **embed thumbnail in the extracted audio (`mp3` only) as cover art** (Settings: `Defaults Audio` - `Embed thumbnail (extracted files)`)
|
||||
- Exclude `drc` *(dynamic range compression)* from parsing results
|
||||
- Standalone downloader:
|
||||
- allow thumbnail to be saved with file
|
||||
- calculation and display of the actual size of downloaded files
|
||||
- Feed:
|
||||
- add hotkeys: `Home`, `End`, `Up`, `Page Up`, `Down`, `Page Down`
|
||||
- ability to save/load views
|
||||
- Scheduler: **`All` and `Default` options removed.** *Only `Disabled`, `Specified` and `Groups` are available.*
|
||||
- Download groups: **filter users who have been (not)downloaded in the last `x` days** *(download groups, advanced filter (main window), scheduler)*.
|
||||
- Main window:
|
||||
- ability to save/load views (`View` - `Save/Load view`)
|
||||
- **all filter options from the `View` menu have now been moved to `Filter`**
|
||||
- Settings:
|
||||
- ability to confirm mass download using the `F6` key *(to protect against accidental pressing) (`Settings` - `Behavior`)*
|
||||
- the ability to find the program environment
|
||||
- default headers (`Settings` - `Headers`)
|
||||
- Added the ability to display group users *(works in scheduler, scheduler plans, download groups)*
|
||||
- Added exclusion of last 3 days from deleting session files
|
||||
- Other improvements
|
||||
- Updated
|
||||
- **yt-dlp up to version 2024.04.09**
|
||||
- PluginProvider
|
||||
- Add `PropertyValueEventArgs` class
|
||||
- PropertyValue:
|
||||
- add `Checked` parameter
|
||||
- add `OnCheckboxCheckedChange` handler
|
||||
- ISiteSettings:
|
||||
- add `CMDEncoding`, `EnvironmentPrograms` properties
|
||||
- add `EnvironmentProgramsUpdated` function
|
||||
- Fixed
|
||||
- Sites
|
||||
- PornHub: some videos won't download
|
||||
- xHamster:
|
||||
- some videos are missing when downloading creators
|
||||
- user videos aren't downloading
|
||||
- **JustForFans: fixed video downloading**
|
||||
- TikTok (standalone downloader): files with long names aren't downloaded
|
||||
- Users: incorrect decision to set last update date, which resulted in an incorrect last download date for some users
|
||||
- Feed: a scrolling bug where the feed scrolls up after returning to it
|
||||
- Minor bugs
|
||||
|
||||
# 2024.2.25.0
|
||||
|
||||
*2024-02-25*
|
||||
|
||||
- Added
|
||||
- A `Feed` button has been added to notifications
|
||||
- Feed:
|
||||
- ability to merge multiple special feeds into one
|
||||
- ability to select all/none media
|
||||
- ability to add to a special feed(s) with removal from the current one
|
||||
- the name of the loaded feed is now displayed in the form title
|
||||
- `Refresh` button now refreshes the loaded feed
|
||||
- ability to move/copy media
|
||||
- Scheduler: the ability to move tasks (higher, lower) *(just a view attribute, doesn't affect the scheduler)*
|
||||
- YouTube (standalone app): add `Open file` to the context menu
|
||||
- YouTube (standalone app): **the ability to edit each playlist item**
|
||||
- YouTube (standalone app): **embed thumbnail in the audio/video as cover art** (Settings: `Defaults Audio` - `Embed thumbnail`; `Defaults Video` - `Embed thumbnail (video)`)
|
||||
- Instagram: the `csrftoken` can now be automatically extracted from cookies
|
||||
- Instagram: remove `x-ig-www-claim` from settings
|
||||
- Threads: the `csrftoken` can now be automatically extracted from cookies
|
||||
- Threads: simplify 500 error when updating tokens
|
||||
- Facebook: simplify token update errors
|
||||
- OnlyFans: handle 500 error
|
||||
- Plugins: added `ReplaceInternalPluginAttribute` attribute
|
||||
- Other improvements
|
||||
- Fixed
|
||||
- Main window: incorrect sorting of profiles and collections
|
||||
- Standalone downloader: url array form doesn't show scrollbars
|
||||
- Feed: image rendering bug
|
||||
- YouTube (standalone app): audio codec does not change when changing audio/video in the video options form
|
||||
- Instagram: error downloading single post
|
||||
- TikTok: files with long names aren't downloaded
|
||||
- Minor bugs
|
||||
|
||||
# 2024.1.26.0
|
||||
|
||||
*2024-01-26*
|
||||
|
||||
- Added
|
||||
- YouTube (standalone app): **the ability to reduce video FPS**
|
||||
- TikTok: the ability to use a regex to clean the title
|
||||
- YouTube (SCrawler): the ability to ignore community errors
|
||||
- Fixed
|
||||
- Instagram: stories (user) downloading with the wrong aspect ratio for some users
|
||||
- Minor bugs
|
||||
|
||||
# 2024.1.20.0
|
||||
|
||||
*2024-01-20*
|
||||
|
||||
- Added
|
||||
- Instagram: **the ability to download reels**
|
||||
- LPSG: handle 404 error
|
||||
|
||||
# 2024.1.18.0
|
||||
|
||||
*2024-01-18*
|
||||
|
||||
- Fixed
|
||||
- Main window: incorrect collection sorting
|
||||
- xHamster: some user videos were not downloaded
|
||||
- YouTube (standalone app): URL array form doesn't show scrollbars
|
||||
- Minor bugs
|
||||
|
||||
# 2024.1.12.1
|
||||
|
||||
*2024-01-12*
|
||||
|
||||
- Added
|
||||
- YouTube (SCrawler): data downloading by dates
|
||||
- Feed: ability to merge multiple session feeds into one
|
||||
- Feed: remove session number from special feeds
|
||||
- Fixed
|
||||
- **Instagram**: stories (user) downloading with the wrong aspect ratio for some users
|
||||
- YouTube: incorrect opening of a post from the feed
|
||||
- YouTube: wrong date to data parsing
|
||||
|
||||
# 2024.1.12.0
|
||||
|
||||
*2024-01-12*
|
||||
|
||||
- Added
|
||||
- Feed: added a prompt before clearing the current session
|
||||
- xHamster: creators
|
||||
- YouTube communities: add error to log
|
||||
- Added scheduler to tray menu
|
||||
- Other improvements
|
||||
- Fixed
|
||||
- Feed: there is no option to create a new feed when adding checked items
|
||||
- **Instagram**: downloading of tagged posts
|
||||
- xHamster: profiles are not downloading
|
||||
- Minor bugs
|
||||
|
||||
# 2023.12.27.0
|
||||
|
||||
*2023-12-27*
|
||||
|
||||
- Added
|
||||
- Notification of new log data
|
||||
- OnlyFans: **OF-Scrapper support to download DRM protected videos**
|
||||
- Other improvements
|
||||
- Fixed
|
||||
- The default options are changed (`Favorite`, `Temporary`, etc.) when changing an account for a created user
|
||||
- When changing the account for a created user, the new account does not apply to that user until SCrawler is restarted
|
||||
- Saved posts: session file is not updated when new data is added
|
||||
- Minor bugs
|
||||
|
||||
# 2023.12.15.0
|
||||
|
||||
*2023-12-15*
|
||||
|
||||
- Fixed
|
||||
- Twitter: some twitter profiles don't download completely
|
||||
- Minor bugs
|
||||
|
||||
# 2023.12.14.0
|
||||
|
||||
*2023-12-14*
|
||||
|
||||
- Added
|
||||
- YouTube: options `Create thumbnail files (video)` and `Create thumbnail files (music)`
|
||||
- YouTube: `Select all` and `Select none` buttons
|
||||
|
||||
# 2023.12.13.0
|
||||
|
||||
*2023-12-13*
|
||||
|
||||
- Added
|
||||
- YouTube (standalone app): additional options for downloading channels
|
||||
- Updated
|
||||
- gallery-dl up to version 1.26.4
|
||||
- Fixed
|
||||
- Feed: saved posts are added to the end of the feed
|
||||
- xHamster: some videos won't download
|
||||
|
||||
# 2023.12.10.0
|
||||
|
||||
*2023-12-10*
|
||||
|
||||
- Updated
|
||||
- gallery-dl up to version 1.26.4-dev
|
||||
- Fixed
|
||||
- Twitter: data is not downloading
|
||||
|
||||
# 2023.12.7.0
|
||||
|
||||
*2023-12-07*
|
||||
|
||||
- Added
|
||||
- Saved posts: add downloaded saved posts to the feed
|
||||
- **YouTube (SCrawler): the ability to download YouTube user community feeds**
|
||||
- Main window: add `Alt+A` hotkey to show scheduler
|
||||
- Main window: add `Alt+P` hotkey to show progress form
|
||||
- YouTube: check of adding a URL if it has already been downloaded
|
||||
- YouTube: ability to check for a new version at start
|
||||
- **Updater**
|
||||
- Fixed
|
||||
- Standalone downloader: URL files are not deleted along with the file
|
||||
- Minor bugs
|
||||
|
||||
# 2023.11.25.0
|
||||
|
||||
*2023-11-25*
|
||||
|
||||
- Fixed
|
||||
- Reddit: missing refresh token button in the settings form
|
||||
|
||||
# 2023.11.24.0
|
||||
|
||||
*2023-11-24*
|
||||
|
||||
For those of you who use TikTok, I recommend updating [TikTok plugin](https://github.com/bashonly/yt-dlp-TTUser) to the latest version using [these instructions](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-install-yt-dlp-ttuser-plugin).
|
||||
|
||||
- Added
|
||||
- Automation: manual task option
|
||||
- Scheduler: add scheduler name to form title
|
||||
- Feeds: update when users' location and/or basic information changes
|
||||
- Reddit: special notification for error 429
|
||||
- TikTok: ID, username and friendly name extraction from data
|
||||
- TikTok: new option `Use video date as file date`
|
||||
- YouTube: absolute path for a single playlist
|
||||
- Updated
|
||||
- yt-dlp up to version 2023.11.16
|
||||
- Fixed
|
||||
- Scheduler: scheduler change error
|
||||
- Twitter: JSON deserialization error
|
||||
- xHamster, XVideos, PornHub, ThisVid: incorrect parsing of search queries
|
||||
- YouTube: the file name is not changed manually
|
||||
- YouTube: path not set when adding array to download
|
||||
- Minor bugs
|
||||
|
||||
# 2023.11.17.0
|
||||
|
||||
*2023-11-17*
|
||||
|
||||
- Added
|
||||
- **Facebook**
|
||||
- **Multi-account**
|
||||
- **Special feeds**
|
||||
- Site settings: option `Download saved posts`
|
||||
- Standalone downloader: support for multiple account
|
||||
- PornHub: add playlists downloading
|
||||
- YouTube: ability to download subtitles **and** `CC` if they both exists
|
||||
- Other improvements
|
||||
- PluginProvider
|
||||
- `IDownloadableMedia`: added `AccountName` property
|
||||
- `IPluginContentProvider`: added `AccountName` property
|
||||
- `ISiteSettings`: added properties: `AccountName`, `Temporary`, `AvailableText`, `DefaultInstance`; added functions: `Clone`, `Update`, `Delete`; removed `Load` function; implement `IDisposable` interface
|
||||
- `PropertyValue`: added functions: `BeginInit`, `EndInit`, `Clone`
|
||||
- `Attributes.DoNotUse` - add `Value` field
|
||||
- Fixed
|
||||
- Instagram: handling 401 error
|
||||
- OnlyFans: handling 401 error
|
||||
- xHamster: handling 503 error
|
||||
- xHamster: incorrect parsing of search queries
|
||||
- XVideos: incorrect parsing of search queries
|
||||
- ThisVid: incorrect parsing of search queries
|
||||
- PornHub: incorrect parsing of search queries
|
||||
- Automation: handle automation start error (in some cases) when changing scheduler
|
||||
- Minor bugs
|
||||
|
||||
# 2023.10.10.0
|
||||
|
||||
*2023-10-10*
|
||||
|
||||
- Added
|
||||
- Notification if the user has disabled downloading from the site
|
||||
- Standalone downloader: new setting `Create URL files`
|
||||
- Changed the sessions naming method to be more intuitive
|
||||
- Settings that allow the user to change the number of saved session (`Settings` - `Feed` - `Store session data`)
|
||||
- **YouTube: new settings `Create URL files` and `Create description files`**
|
||||
- YouTube: added the `Clear selected` button
|
||||
- YouTube: group the `Clear and remove` buttons in the menu
|
||||
- Fixed
|
||||
- Reddit: unable to save settings without OAuth data
|
||||
- JustForFans: rewritten m3u8 downloader
|
||||
- JustForFans: downloading of missing posts
|
||||
- JustForFans: download to the date
|
||||
- JustForFans: corrupted files
|
||||
- Threads: new token is not saved if it was received during download
|
||||
- ThisVid: parsing stops when new videos are added
|
||||
- YouTube: file name is missing when destination is changed by selecting one of the saved locations
|
||||
- YouTube: missing files still appear in the list
|
||||
- Collections: labels are removed when creating a new collection
|
||||
- Standalone downloader: cached thumbnail is not removed when item is removed from the list
|
||||
- Minor bugs
|
||||
|
||||
# 2023.10.1.0
|
||||
|
||||
*2023-10-01*
|
||||
|
||||
- Added
|
||||
- **Threads.net**
|
||||
- YouTube: add URL standardization
|
||||
- Fixed
|
||||
- UserEditor: disable updating labels if they haven't changed
|
||||
- Collections: incorrect updating of colors and labels when adding a new user
|
||||
- RedGifs: incorrect handling of error 410
|
||||
- Mastodon: hide error 503
|
||||
- JustForFans: some profiles won't download
|
||||
- Minor bugs
|
||||
|
||||
# 2023.9.21.0
|
||||
|
||||
*2023-09-21*
|
||||
|
||||
- Fixed
|
||||
- PornHub: videos are not downloading
|
||||
|
||||
# 2023.9.20.0
|
||||
|
||||
*2023-09-20*
|
||||
|
||||
- Added
|
||||
- **Instagram: user active (non-pinned) stories (Issue #17)**
|
||||
- Reddit: reduce the number of token updates (refresh the token if there are Reddit users in the download queue)
|
||||
- YouTube (standalone app): priority download protocol *(`Settings` - `Defaults` - `Protocol`)* (you can now select the default protocol you want to download media on: `Any`, `https`, `m3u8`))
|
||||
- Automation: ability to change schedulers (`Download` - `Automation` - `Script icon`)
|
||||
- Collections: update colors for the added user
|
||||
- Fixed
|
||||
- YouTube: can't detect `shorts` links
|
||||
- Incorrect MD5 validation initial value
|
||||
- Instagram: handle error 500
|
||||
- Collections: update labels only for the added user
|
||||
|
||||
# 2023.8.27.0
|
||||
|
||||
*2023-08-27*
|
||||
|
||||
- Added
|
||||
- **JustForFans**
|
||||
- Advanced download (`Download` - `Download (advanced)`)
|
||||
- Advanced filter (`View` - `Advanced filter`)
|
||||
- Auto downloader: cloning plans
|
||||
- Feed: add button to go to custom page
|
||||
- Special log for non-existent users
|
||||
- Twitter: group 'limit' notifications
|
||||
- Ability to set custom color for subscription users
|
||||
- Other improvements
|
||||
- Fixed
|
||||
- Auto downloader: new plan date display bug
|
||||
- Auto downloader: downloading stuck
|
||||
- Minor bugs
|
||||
|
||||
# 2023.8.6.0
|
||||
|
||||
*2023-08-06*
|
||||
|
||||
- Added
|
||||
- The ability to remove user data and/or download history for redownload
|
||||
- **Subscription** mode
|
||||
- Settings to change the program title and information in the program information
|
||||
- Settings for saving video thumbnail along with the file or in the cache (temporary cache or permanent cache)
|
||||
- A bug report form to create a bug report or say something nice to the developer :blush:
|
||||
- Prevent adding site-specific labels when adding to a collection
|
||||
- Ability to select custom user highlighting in the main window and feed.
|
||||
- Add a notification to the log if the user is not found on the site
|
||||
- Added visualization of users download queue
|
||||
- Ability to set more than one global paths
|
||||
- Improve user paths changing: now you can also simply move the user/collection to another global location
|
||||
- Ability to move multiple user/collection to another location
|
||||
- Download groups: added `Subscription` options
|
||||
- Download groups: the ability to set the number of users to download
|
||||
- Auto downloader: new group options
|
||||
- Auto downloader: additional skip options
|
||||
- Auto downloader: added force start
|
||||
- Feed: press `Ctrl+G` to go to a specific page
|
||||
- Feed: added site icon to post
|
||||
- Feed: always using `Friendly name` instead of `UserName` if it exists
|
||||
- Missing posts: the ability to delete all missing posts
|
||||
- Standalone downloader: add the ability to store download locations and quickly select after
|
||||
- Standalone downloader: add `Ctrl+O` hotkey to select destination path
|
||||
- Standalone downloader: add `Alt+O` hotkey to select destination path and save it to download locations
|
||||
- User editor: ability to hide/show site-specific labels in collection editing mode
|
||||
- Main window: filters by subscription and user
|
||||
- Instagram: if the user is not found on the site, SCrawler will check for a new user name
|
||||
- OnlyFans: handling of `504` and `429` errors
|
||||
- OnlyFans: the `sec-ch-ua` header is now optional
|
||||
- OnlyFans: ability to download 'Highlights" and media from chats
|
||||
- PathPlugin: incorrect detection of path existence
|
||||
- PornHub: completely rewritten videos parser
|
||||
- PornHub: now you choose which videos you want to download (uploaded, tagged, private, favorites)
|
||||
- PornHub: subscription mode
|
||||
- PornHub: ability to download search queries and search categories
|
||||
- Reddit: ability to set the number of concurrent downloads
|
||||
- Reddit: added bearer token (optional)
|
||||
- Reddit: added OAuth authorization (optional)
|
||||
- Reddit: options to use the bearer token for the timeline and/or saved posts
|
||||
- Reddit: option to disable the use of cookies for the timeline
|
||||
- ThisVid: now you can also download user's favorite videos
|
||||
- ThisVid: ability to download search queries, search categories and search tags
|
||||
- ThisVid: subscription mode
|
||||
- Twitter: new options: `Use the appropriate model`, `New endpoint: search`, `New endpoint: profiles`, `Abort on limit`, `Download already parsed` and `Media Model: allow non-user tweets`
|
||||
- Twitter: new user option `Force apply`
|
||||
- xHamster: ability to download search queries, search categories and search tags
|
||||
- xHamster: subscription mode
|
||||
- xHamster: pornstars download
|
||||
- XVideos: ability to download search queries, search categories and search tags
|
||||
- XVideos: subscription mode
|
||||
- YouTube: added `Output path: ask for a name` and `Output path: auto add` settings
|
||||
- YouTube: added the ability to store download locations and quickly select after
|
||||
- YouTube: subscription mode
|
||||
- Plugins.Attributes: added `DependentFields` attribute
|
||||
- Plugins.Attributes: replace `Dependencies` with `Arguments` (`PropertyUpdater` attribute)
|
||||
- Plugins.IPluginContentProvider: added `Options` and `IsSubscription` properties
|
||||
- Plugins.ISiteSettings: added `SubscriptionsAllowed` property
|
||||
- Plugins.ExchangeOptions: added `Options` field
|
||||
- Plugins: added `ExitException`
|
||||
- Other improvements
|
||||
- Updated
|
||||
- gallery-dl up to version 1.25.8
|
||||
- yt-dlp up to version 2023.07.06
|
||||
- LibVLCSharp up to 3.7.0
|
||||
- VideoLAN up to 3.0.18
|
||||
- Fixed
|
||||
- **TikTok** supported again!
|
||||
- Auto downloader: excluded labels and sites in default mode are not respected
|
||||
- Download info: does not remember the last size and location
|
||||
- Download info: hide unnecessary error
|
||||
- Feed: `webm` photos not showing
|
||||
- Search users: incorrect search by name
|
||||
- OnlyFans: incorrect parsing of username containing dots
|
||||
- OnlyFans: incorrect error handler
|
||||
- Reddit: Handling error 502 (Reddit data not downloading)
|
||||
- RedGifs: incorrect behavior when updating token
|
||||
- Twitter: gifs are not downloading
|
||||
- xHamster: some channels cannot be downloaded or are not fully downloaded
|
||||
- YouTube: re-saving elements when loading a video list
|
||||
- YouTube: files were not deleted when the delete button was clicked
|
||||
- YouTube: a bug that caused the video to redownload
|
||||
- Minor bugs
|
||||
|
||||
# 2023.6.19.0
|
||||
|
||||
*2023-06-19*
|
||||
|
||||
- Added
|
||||
- **OnlyFans**
|
||||
- YouTube: make the playlists parsing progress more informative
|
||||
- YouTube: add `Add` button to tray
|
||||
- YouTube: add `Ctrl+Click` on tray icon to add download
|
||||
- YouTube: add setting `Download on click in tray: show form`
|
||||
- Minor improvements to progress bars
|
||||
- Other improvements
|
||||
- Fixed
|
||||
- YouTube: incorrect sorting algorithm
|
||||
- LPSG: some files didn't download
|
||||
- Reddit: downloaded gifs are static (Issue #141)
|
||||
- xHamster: videos are not downloading or downloading incorrectly (Issue #144)
|
||||
- Progress bar bugs
|
||||
- Minor bugs
|
||||
|
||||
# 2023.6.9.0
|
||||
|
||||
*2023-06-09*
|
||||
|
||||
- Fixed
|
||||
- YouTube: opening paths to downloaded playlists and channels
|
||||
- Twitter: make the algorithm faster
|
||||
- Make progress more informative
|
||||
|
||||
# 2023.6.8.0
|
||||
|
||||
*2023-06-08*
|
||||
|
||||
- Added
|
||||
- YouTube: append artist name to music playlist output path
|
||||
- YouTube: save thumbnail path for playlist and channel
|
||||
- Fixed
|
||||
- YouTube: opening paths to downloaded playlists and channels
|
||||
- Twitter: profile not fully downloaded
|
||||
- Corrected form size for small monitors (Issue #136)
|
||||
|
||||
# 2023.6.5.0
|
||||
|
||||
*2023-06-05*
|
||||
|
||||
- Added
|
||||
- **Instagram**: add additional authorization headers
|
||||
- Setting to prevent user icon and banner from downloading (Request #129)
|
||||
- Add standalone downloader to tray context menu
|
||||
- YouTube downloader: added `Replace modification date` property
|
||||
- Minor improvements
|
||||
- Fixed
|
||||
- Fascist **Twitter**: posts not downloading (new API)
|
||||
- Main window: refill bug when the number of filtered profiles = 0
|
||||
- Standalone downloader: new items are not added to the queue
|
||||
- Standalone downloader: bug when not downloaded videos do not appear in the list when loading the program
|
||||
- Standalone downloader: add videos array not working
|
||||
- Saved posts: remove main progress perform when downloading saved posts
|
||||
- Minor bugs
|
||||
|
||||
# 2023.5.12.0
|
||||
|
||||
*2023-05-12*
|
||||
|
||||
- Added
|
||||
- Advanced progress (make progress bars more informative)
|
||||
- User metrics calculation
|
||||
- Reddit: improve parsing function
|
||||
- PornHub: add `Download UHD` option
|
||||
- Fixed
|
||||
- MD5 GIF hash bug
|
||||
- Mastodon: handle 'Forbidden' error
|
||||
- Mastodon: bug in parsing non-user posts
|
||||
- Pinterest: remove cookies requirement for saved posts
|
||||
- PornHub: resolutions issue
|
||||
- Reddit: missing & broken images bug
|
||||
- Main window: collection pointing bug
|
||||
|
||||
# 2023.4.28.0
|
||||
|
||||
*2023-04-28*
|
||||
|
||||
- Added
|
||||
- **YouTube**
|
||||
- **YouTube Music**
|
||||
- **Mastodon**
|
||||
- **Pinterest**
|
||||
- **ThisVid**
|
||||
- **YouTube downloader (standalone app)**
|
||||
- Redesigned standalone downloader and update environment
|
||||
- Added icons to download progress
|
||||
- Added icons to saved posts downloader
|
||||
- **Cookies**: new ways to add cookies. You can now export cookies using the browser extension and then import them into SCrawler!
|
||||
- User creation: ability to extract the user's URL from the buffer and apply parameters if found
|
||||
- User creation: simplified way to create new users (`Ctrl+Insert` to create a new user with default parameters from clipboard URL)
|
||||
- Ability to customize the placement of ffmpeg (and other) files
|
||||
- Ability to customize the command line encoding
|
||||
- New notification options for standalone downloader
|
||||
- Reddit: now it can download saved crossposts
|
||||
- RedGifs: added `UserAgent` option
|
||||
- Other improvements
|
||||
- Removed
|
||||
- User creation: remove the 'Channel' checkbox because it confuses people
|
||||
- Removed an ability to open SCrawler with `-v` argument
|
||||
- All ways to create users except URL. You can only properly create a user using the user's URL.
|
||||
- Plugins
|
||||
- Added `IDownloadableMedia` interface
|
||||
- Removed `Channel` option from all functions and enums
|
||||
- ISiteSettings: added `GetSingleMediaInstance` function
|
||||
- IPluginContentProvider: added `DownloadSingleObject` function
|
||||
- IPluginContentProvider: added tokens to `GetMedia` and `Download` functions
|
||||
- IPluginContentProvider: removed `GetSpecialData` function
|
||||
- UserMediaTypes: added `Audio` and `AudioPre` enums
|
||||
- Fixed
|
||||
- LPSG: attachments not downloading (Issue #114)
|
||||
- Twitter: saved posts not downloading (Issue #119)
|
||||
- XVIDEOS: saved posts not downloading
|
||||
- Deleting labels file
|
||||
- PornHub: hide unnecessary errors (Issue #116)
|
||||
- PornHub: photo galleries bug (Issue #115)
|
||||
- Minor bugs
|
||||
|
||||
# 2023.3.5.0
|
||||
|
||||
*2023-03-05*
|
||||
|
||||
- Fixed
|
||||
- A bug in the new way of naming `SavedPosts` data files.
|
||||
- An error that could occur during Twitter MD5 comparison.
|
||||
- A bug in the ffmpeg file parts concatenation algorithm that could occur in some cases.
|
||||
|
||||
# 2023.3.1.0
|
||||
|
||||
*2023-03-01*
|
||||
|
||||
- Added
|
||||
- **Path plugin.** Now you can add paths. *This may be suitable if you want to add a collection of media data to a specific user collection.*
|
||||
- MainWindow: setting a background image
|
||||
- MainWindow: setting background color and font color
|
||||
- Feed: setting background color and font color
|
||||
- Feed: (Request #108) center the image in the feed grid
|
||||
- Users: the ability to use user site name (if it exists) as a friendly name (on supported sites: Reddit, Twitter, Instagram)
|
||||
- Users: the ability to update user site name every time
|
||||
- Twitter: ability to download images using MD5 comparison to protect against duplicate downloads *(this may be suitable for the users who post the same image many times)*
|
||||
- Twitter: one-time duplicate image removal option
|
||||
- XHamster: (Request #107) added channels downloading
|
||||
- Updated
|
||||
- Updated ffmpeg to version [5.1.2](https://github.com/GyanD/codexffmpeg/releases/tag/5.1.2)
|
||||
- Fixed
|
||||
- PornHub: (Issue #106) unicode titles
|
||||
- (Issue #106) problem with non-Latin characters
|
||||
- ffmpeg: maximum input length error when merging parts of files
|
||||
|
||||
# 2023.2.5.0
|
||||
|
||||
*2023-02-05*
|
||||
|
||||
- Added
|
||||
- The ability to configure UserAgent
|
||||
- Fixed
|
||||
- (Issue #101) Failed download Gfycat video in some cases
|
||||
|
||||
# 2023.1.27.0
|
||||
|
||||
*2023-01-27*
|
||||
|
||||
- Added
|
||||
- Advanced Twitter options for GIFs
|
||||
- Changing the icon of the user creation form based on the selected site
|
||||
- Fixed
|
||||
- Pinned Instagram posts reload every time
|
||||
- Plugins
|
||||
- Added
|
||||
- `Interaction` option to the `Provider` attribute
|
||||
- `IPropertyProvider` interface
|
||||
|
||||
# 2023.1.24.1
|
||||
|
||||
*2023-01-24*
|
||||
|
||||
- Added
|
||||
- Icon for standalone downloader
|
||||
- Fixed
|
||||
- (Issue #100) some Imgur albums won't download
|
||||
|
||||
# 2023.1.24.0
|
||||
|
||||
*2023-01-24*
|
||||
|
||||
- Fixed
|
||||
- (Issue #100) Imgur albums not downloading
|
||||
- When deleting a collection with the 'ban' option, users in the collection are not banned
|
||||
|
||||
# 2023.1.2.0
|
||||
|
||||
*2023-01-02*
|
||||
|
||||
36
FAQ.md
@@ -16,12 +16,6 @@ A: https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-set-up-cookies
|
||||
|
||||
----
|
||||
|
||||
#### Q: **I can't copy cookies.**
|
||||
|
||||
A: Use the mouse. Don't use ```Ctrl+A```!
|
||||
|
||||
----
|
||||
|
||||
#### Q: **Does this program have GUI or CLI.**
|
||||
|
||||
A: This is a GUI program.
|
||||
@@ -30,27 +24,31 @@ A: This is a GUI program.
|
||||
|
||||
#### Q: **Will CLI be added in the future?**
|
||||
|
||||
A: I do not think so.
|
||||
A: NO.
|
||||
|
||||
----
|
||||
|
||||
#### Q: **I want to add "...." site. How to request.**
|
||||
|
||||
A: How to request a new site you can read [here](CONTRIBUTING.md#how-to-request-a-new-site)
|
||||
<!---A: How to request a new site you can read [here](CONTRIBUTING.md#how-to-request-a-new-site)--->
|
||||
**I'm currently not accepting requests to develop new sites.**
|
||||
|
||||
----
|
||||
|
||||
#### Q: **Twitter/Instagram download failed.**
|
||||
#### Q: **Site download failed.**
|
||||
|
||||
A: Check your credentials. Both of these sites require cookies. Check your [Twitter tokens](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-twitter-tokens) and [Instagram settings](https://github.com/AAndyProgram/SCrawler/wiki/Settings#instagram). If all settings are set, but nothing works, go to [create a new issue](https://github.com/AAndyProgram/SCrawler/issues). Don't forget to attach the LOG.
|
||||
A: Check your credentials and **[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)**. If all settings are set, but nothing works, go to [create a new issue](https://github.com/AAndyProgram/SCrawler/issues). Don't forget to attach the LOG.
|
||||
|
||||
**[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)**
|
||||
**You also can join our Discord server**: https://discord.gg/uFNUXvFFmg
|
||||
<br/>*You can get help faster there!*
|
||||
|
||||
**ATTENTION! Issues without URLs will be closed without a response!**
|
||||
|
||||
----
|
||||
|
||||
#### Q: **I have set credentials but still nothing is downloading**
|
||||
|
||||
A: Click the ```Start downloading``` button
|
||||
A: Click the `Start downloading` button or press `F5`
|
||||
|
||||
----
|
||||
|
||||
@@ -62,7 +60,7 @@ A: https://github.com/AAndyProgram/SCrawler/releases/latest
|
||||
|
||||
#### Q: **How to run the program?**
|
||||
|
||||
A: Double-click ```SCrawler.exe```
|
||||
A: Double-click `SCrawler.exe`
|
||||
|
||||
----
|
||||
|
||||
@@ -80,19 +78,19 @@ A: The program stored posts IDs in users' folders. For the first time, the progr
|
||||
|
||||
#### Q: **How to redownload all data**
|
||||
|
||||
A: Double-click on the user you want to redownload. In the opened window open folder setting. Delete the files ending with ```_Data.xml``` and ```_Posts.txt```. Download this user again.
|
||||
A: https://github.com/AAndyProgram/SCrawler/wiki#redownload-user
|
||||
|
||||
----
|
||||
|
||||
#### Q: **How to remove the label**
|
||||
|
||||
A: There is no functionality to remove an individual label. You can open the ```Labels.txt``` file in the program settings folder and delete any label you want. You also can delete this file (```Labels.txt```). In this case, when the program starts, the list of labels list will be updated with only existing labels (from the user data files).
|
||||
A: There is no functionality to remove an individual label. You can open the `Labels.txt` file in the program settings folder and delete any label you want. You also can delete this file (`Labels.txt`). In this case, when the program starts, the list of labels list will be updated with only existing labels (from the user data files).
|
||||
|
||||
----
|
||||
|
||||
#### Q: **How to remove a user from the blacklist**
|
||||
|
||||
A: Just add that user back to the program. In the dialog box that opens, click on the ```Add and remove from blacklist``` button.
|
||||
A: Just add that user back to the program. In the dialog box that opens, click on the `Add and remove from blacklist` button.
|
||||
|
||||
----
|
||||
|
||||
@@ -116,4 +114,8 @@ A: I can only [suggest](#q-you-lost-me-your-program-is-too-complicated) you find
|
||||
|
||||
#### Q: **Can you add a step-by-step guide or video on how to use the program?**
|
||||
|
||||
A: **NO**! I will not do it. If you want, you can create a video tutorial and send it to me. Then I add it. All options and what each option does described on the wiki. The wiki also contains a description of all settings and how-to configure them. For complex settings, there is a steep-by-steep guide. Read the [main](README.md) information and [GUIDE](https://github.com/AAndyProgram/SCrawler/wiki/) and you won't have any problems. I have developed a program with an intuitive interface. There is a Settings button, download buttons, a context menu that drops down when a user is clicked, and other controls. Anyone can use it.
|
||||
A: **NO!** The guide fully covers all the functionality of SCrawler! If you don't respect my work, I don't waste my time. If you want, you can create a video tutorial and send it to me. Then I add it. All options and what each option does described on the wiki. The wiki also contains a description of all settings and how-to configure them. For complex settings, there is a steep-by-steep guide. Read the [main](README.md) information and [GUIDE](https://github.com/AAndyProgram/SCrawler/wiki/) and you won't have any problems. I have developed a program with an intuitive interface. There is a Settings button, download buttons, a context menu that drops down when a user is clicked, and other controls. Anyone can use it.
|
||||
|
||||
**The following video was recorded by a user who loves SCrawler and demonstrates how to add credentials using Instagram as an example:**
|
||||
|
||||
[](https://www.youtube.com/watch?v=XDn7zG4I700)
|
||||
@@ -2,10 +2,11 @@ Your support is very valuable to me. Any support is greatly appreciated. Your su
|
||||
|
||||
You can support the program by:
|
||||
- **Bitcoin**: BC1Q0NH839FT5TA44DD7L7RLR97XDQAG9V8D6N7XET
|
||||
- :heavy_dollar_sign: make a donation on this site: https://ko-fi.com/andyprogram
|
||||
- :repeat: make a post about my program on your profile (Reddit, Twitter, Instagram and any other social networks)
|
||||
- :speech_balloon: tell your friends about the program
|
||||
- :heart: like the program on this site: https://alternativeto.net/software/scrawler/about/
|
||||
- :heart: like the program on this site: https://www.softpedia.com/get/Internet/Download-Managers/Social-networks-crawler.shtml
|
||||
- suggest my program as an alternative ([on this site](https://alternativeto.net/software/scrawler/about/)) to any program you have used before
|
||||
|
||||
I would be very grateful for any support! :blush:
|
||||
<!---:heavy_dollar_sign: make a donation on this site: https://ko-fi.com/andyprogram--->
|
||||
@@ -1,3 +1,9 @@
|
||||
You can create a plugin for any site you want. **To create a plugin, read [this guide](https://github.com/AAndyProgram/SCrawler/wiki/Plugins).**
|
||||
|
||||
If you've created a plugin, you can create a [new issue](https://github.com/AAndyProgram/SCrawler/issues/new?assignees=&labels=New+Plugin&projects=&template=plugin_add.md&title=%5BNEW+PLUGIN%5D) and I'll add your plugin to the list below.
|
||||
|
||||
----
|
||||
|
||||
List of available plugins:
|
||||
|
||||
Tools:
|
||||
|
||||
BIN
ProgramScreenshots/AppYouTube.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
ProgramScreenshots/AppYouTubeMusic.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
ProgramScreenshots/AppYouTubePlaylist.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
ProgramScreenshots/AppYouTubePlaylistParser.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
ProgramScreenshots/AppYouTubeSettings.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
ProgramScreenshots/AppYouTubeVideo.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
ProgramScreenshots/BugReport.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 18 KiB |
BIN
ProgramScreenshots/FeedMoveCopyTo.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 483 KiB After Width: | Height: | Size: 472 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 17 KiB |
BIN
ProgramScreenshots/LocationsChanger.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 363 KiB After Width: | Height: | Size: 359 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 12 KiB |
BIN
ProgramScreenshots/SettingsGlobalDesign.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
ProgramScreenshots/SettingsGlobalDownloader.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 22 KiB |
BIN
ProgramScreenshots/SettingsGlobalEnvironment.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 20 KiB |
BIN
ProgramScreenshots/SettingsGlobalHeaders.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 13 KiB |
BIN
ProgramScreenshots/SettingsSiteFacebook.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 40 KiB |
BIN
ProgramScreenshots/SettingsSiteInstagramData.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
ProgramScreenshots/SettingsSiteJustForFans.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
ProgramScreenshots/SettingsSiteMastodon.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
ProgramScreenshots/SettingsSiteMastodonAdditional.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
ProgramScreenshots/SettingsSiteOnlyFans.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
ProgramScreenshots/SettingsSitePinterest.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 28 KiB |
BIN
ProgramScreenshots/SettingsSiteThisVid.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
ProgramScreenshots/SettingsSiteThreads.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.4 KiB |
BIN
ProgramScreenshots/SettingsSiteYouTube.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
ProgramScreenshots/SettingsTwitterUser.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 5.2 KiB |
BIN
ProgramScreenshots/UserDefaultQueryOptions.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
ProgramScreenshots/UserMetrics.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
@@ -1,6 +1,63 @@
|
||||
# yt-dlp
|
||||
|
||||
https://github.com/yt-dlp/yt-dlp/
|
||||
|
||||
**Great powerful CLI tool that supports hundreds of sites.**
|
||||
|
||||
SCrawler has advanced user management, collections, labels, groups, automatic downloads, a beautiful view, GUI, the ability to add plugins for other sites and much more. Just try it and compare.
|
||||
|
||||
# gallery-dl
|
||||
|
||||
https://github.com/mikf/gallery-dl
|
||||
|
||||
**Great powerful CLI tool that supports hundreds of sites.**
|
||||
|
||||
SCrawler has advanced user management, collections, labels, groups, automatic downloads, a beautiful view, GUI, the ability to add plugins for other sites and much more. Just try it and compare.
|
||||
|
||||
# 4K Video Downloader
|
||||
|
||||
https://www.4kdownload.com/-plbrz/video-downloader
|
||||
|
||||
| Option | SCrawler | 4K Video Downloader |
|
||||
| ---- | ---- | ---- |
|
||||
| User managament | **Advanced** | No |
|
||||
| Automatic downloads | **Yes** | No |
|
||||
| Downloading groups | **Yes** | No |
|
||||
| Labeling users | **Yes** | No |
|
||||
| Filtering | **Yes** | No |
|
||||
| Collections | **Yes** | No |
|
||||
| Specific user folders | **Yes** | No |
|
||||
| Favorite / Temporary user options | **Yes** | No |
|
||||
| Plugins support | **Yes** | No |
|
||||
| Download single video | **Unlimited** | 30 videos per day *(unlimited starts from 12 EUR)* |
|
||||
| Download videos per channel | **Unlimited** | 5 free *(unlimited starts from 12 EUR)* |
|
||||
| Download videos per playlist | **Unlimited** | 10 free *(unlimited starts from 12 EUR)* |
|
||||
| Download video subtitles | **Any for free**: single video, playlist, user/channel, album, etc| Free for single video |
|
||||
| The number of subtitles you can download for a video | **All of them** | Up to 10 |
|
||||
| Convert subtitles to additional formats | **Yes** | No |
|
||||
| Support LRC format | **Yes** | No |
|
||||
| Select audio codec for audio/video | **Yes** | No |
|
||||
| Extract and convert additional audio tracks for video | **Yes** | No |
|
||||
| Simultaneous downloads | **Unlimited** | 1 free, 3 for 12 EUR, 7 for 43 EUR|
|
||||
| Private YouTube content download | **Free** | Only in paid plans *starts from 12 EUR* |
|
||||
| **Paid** | **No** | Yes |
|
||||
| **Free options** | **The program is completely free** | Only **30** videos per day, 5 from a channel, 10 from a playlist |
|
||||
| Permitted Commercial Use | **Yes** | Starting from 43 EUR |
|
||||
| Automatic Subscriptions Update | **Free** | Paid (43 EUR) |
|
||||
| Posts and Captions Export | No | Paid (43 EUR) |
|
||||
| Advertisements free | **No ADs at all for free** | Paid (43 EUR) |
|
||||
| Operating Systems | Windows 10+ | Windows 7+, MacOS 10.13+, Ubuntu x64 |
|
||||
| Select want content type to download | **Yes** | No |
|
||||
| Instagram support | **Yes** | No |
|
||||
| Twitter support | **Yes** | No |
|
||||
| Reddit support | **Yes** | No |
|
||||
| Other sites support | **Yes** | No |
|
||||
| Still supported | Yes | Yes |
|
||||
|
||||
# 4K Stogram
|
||||
|
||||
https://www.4kdownload.com/products/product-stogram
|
||||
<!---https://www.4kdownload.com/products/product-stogram--->
|
||||
https://www.4kdownload.com/-ad0p9/stogram
|
||||
|
||||
| Option | SCrawler | 4K Stogram |
|
||||
| ---- | ---- | ---- |
|
||||
@@ -27,10 +84,10 @@ https://www.4kdownload.com/products/product-stogram
|
||||
| Export and import subscriptions | No | **Yes** |
|
||||
| **Paid** | **No** | Yes |
|
||||
| **Free options** | **The program is completely free** | Only **ONE** profile downloading and only **200 posts** per day |
|
||||
| Permitted Commercial Use | **Yes** | Starting from 43.56 EUR |
|
||||
| Automatic Subscriptions Update | **Free** | Paid (43.56 EUR) |
|
||||
| Posts and Captions Export | No | Paid (43.56 EUR) |
|
||||
| Advertisements free | **No ADs at all for free** | Paid (14.52) |
|
||||
| Permitted Commercial Use | **Yes** | Starting from 43 EUR |
|
||||
| Automatic Subscriptions Update | **Free** | Paid (43 EUR) |
|
||||
| Posts and Captions Export | No | Paid (43 EUR) |
|
||||
| Advertisements free | **No ADs at all for free** | Paid (18 EUR) |
|
||||
| Operating Systems | Windows 10+ | Windows 7+, MacOS 10.13+, Ubuntu x64 |
|
||||
| Select want content type to download | **Yes** | No |
|
||||
| Instagram support | Yes | Yes |
|
||||
@@ -68,15 +125,7 @@ https://github.com/RipMeApp/ripme
|
||||
| **Free options** | The program is completely free | The program is completely free, but site limits are not declared |
|
||||
| Operating Systems | Windows 10+ | Windows, MacOS, Linux |
|
||||
| Select want content type to download | Yes | Yes |
|
||||
| Suported sites | 9 internal and any site using plugins | 86+ sites (declared) |
|
||||
| Suported sites | 15+ internal and any site using plugins | 86+ sites (declared) |
|
||||
| Other sites support | **Yes** | No |
|
||||
| Still supported | **Yes** | **No (last release date May 4, 2021)** |
|
||||
|
||||
# gallery-dl
|
||||
|
||||
https://github.com/mikf/gallery-dl
|
||||
|
||||
|
||||
**CLI tool**! Configured with JSON files only. Users need to learn complex configuration options, JSON, commands to use that tool. Very difficult to configure.
|
||||
|
||||
SCrawler has advanced user management, collections, labels, groups, automatic downloads, a beautiful view, GUI, the ability to add plugins for other sites and much more. Just try it and compare.
|
||||
161
README.md
@@ -1,71 +1,99 @@
|
||||
# :rainbow_flag: Social networks crawler :rainbow_flag: :christmas_tree:
|
||||
# 🏳️🌈 Happy LGBT Pride Month 🎉
|
||||
|
||||
# :christmas_tree: Happy new year :christmas_tree:
|
||||
# 🏳️🌈 Social networks crawler 🏳️🌈
|
||||
|
||||
[](https://github.com/AAndyProgram/SCrawler/releases/latest)
|
||||
[](https://github.com/AAndyProgram/SCrawler/blob/main/LICENSE)
|
||||
[](https://discord.gg/uFNUXvFFmg)
|
||||
[](https://github.com/AAndyProgram/SCrawler/releases)
|
||||
[](FAQ.md)
|
||||
[](https://github.com/AAndyProgram/SCrawler/wiki)
|
||||
[](HowToSupport.md)
|
||||
:eu:
|
||||
:greece:
|
||||
|
||||
A program to download photo and video from [any site](#supported-sites) (e.g. Reddit, Twitter, Instagram, TikTok, RedGifs, PornHub, XHamster, XVIDEOS, LPSG).
|
||||
A program to download photo and video from [any site](#supported-sites) (e.g. YouTube, YouTube Music, OnlyFans, Reddit, Twitter, Mastodon, Instagram, Threads, Facebook, TikTok, RedGifs, JustForFans, PornHub, XHamster, XVIDEOS, ThisVid, LPSG, Pinterest).
|
||||
|
||||
**If you like SCrawler, please like the program on [this site]( https://alternativeto.net/software/scrawler/about/)**
|
||||
**If you like SCrawler, please like the program on [this site](https://alternativeto.net/software/scrawler/about/) and/or [this](https://www.softpedia.com/get/Internet/Download-Managers/Social-networks-crawler.shtml)**
|
||||
|
||||
Do you like this program? Consider adding to my coffee fund by making a donation to show your support. :blush:
|
||||
|
||||
[](https://ko-fi.com/andyprogram)
|
||||
**Join our Discord server**: https://discord.gg/uFNUXvFFmg
|
||||
<br/>*If you have problems using the program, you can get help faster on our Discord server!*
|
||||
|
||||
<!---Do you like this program? Consider adding to my coffee fund by making a donation to show your support. :blush:
|
||||
[](https://ko-fi.com/andyprogram)--->
|
||||
**Bitcoin**: BC1Q0NH839FT5TA44DD7L7RLR97XDQAG9V8D6N7XET
|
||||
|
||||
[](https://www.softpedia.com/get/Internet/Download-Managers/Social-networks-crawler.shtml#status)
|
||||
|
||||

|
||||

|
||||
|
||||
[**YouTube standalone application:**](https://github.com/AAndyProgram/SCrawler/wiki/YouTube-downloader)
|
||||
|
||||

|
||||
|
||||
# What can program do:
|
||||
- Download pictures and videos from users' profiles and subreddits:
|
||||
- Reddit images, galleries of images, videos (downloading Reddit hosted video is going through ffmpeg (**ffmpeg only works with the x64 program**)), saved posts;
|
||||
- YouTube videos, shorts, community feeds, users, artists, playlists, music, tracks;
|
||||
- Reddit images, galleries of images, videos, saved posts;
|
||||
- Redgifs videos (https://www.redgifs.com/);
|
||||
- Twitter images and videos, saved (bookmarked) posts;
|
||||
- Twitter images and videos, saved (bookmarked) posts, likes, communities;
|
||||
- OnlyFans images and videos, saved (bookmarked) posts, stories;
|
||||
- JustForFans images and videos, saved (bookmarked) posts;
|
||||
- Mastodon images and videos, saved (bookmarked) posts;
|
||||
- Instagram images and videos, tagged posts, stories, saved posts;
|
||||
- TikTok videos ([limited](https://github.com/AAndyProgram/SCrawler/wiki/Settings#tiktok-limits));
|
||||
- Threads images and videos;
|
||||
- Facebook images and videos, stories, saved posts;
|
||||
- TikTok videos;
|
||||
- Pinterest boards, users, saved posts;
|
||||
- Imgur images, galleries and videos;
|
||||
- Gfycat videos;
|
||||
- PornHub images, videos, save (liked) posts;
|
||||
- XHamster images, videos, saved posts;
|
||||
- XVIDEOS videos;
|
||||
- PornHub images, videos, save (liked) posts, search queries, search categories;
|
||||
- XHamster images, videos, saved posts, search queries, search categories, search tags;
|
||||
- XVIDEOS videos, saved posts, search queries, search categories;
|
||||
- ThisVid images, videos, saved posts, search queries, search categories, search tags;
|
||||
- [Other](#supported-sites) supported sites
|
||||
- Parse [channel and view data](https://github.com/AAndyProgram/SCrawler/wiki/Channels)
|
||||
- Download [saved Reddit, Twitter and Instagram posts](https://github.com/AAndyProgram/SCrawler/wiki/Home#saved-posts)
|
||||
- Parse [Reddit channel and view data](https://github.com/AAndyProgram/SCrawler/wiki/Channels)
|
||||
- Download [saved posts](https://github.com/AAndyProgram/SCrawler/wiki/Home#saved-posts)
|
||||
- Add users from parsed channel
|
||||
- **Advanced user management**
|
||||
- **Automation** (downloading data automatically every ```X``` minutes)
|
||||
- **Feed** (feed of downloaded media files)
|
||||
- **Automation** ([downloading data automatically](https://github.com/AAndyProgram/SCrawler/wiki/Settings#automation) every ```X``` minutes)
|
||||
- **Feed** ([feed](https://github.com/AAndyProgram/SCrawler/wiki#feed) of downloaded media files and subscriptions posts)
|
||||
- Multiple accounts support
|
||||
- Labeling users
|
||||
- Create download groups
|
||||
- Create [download groups](https://github.com/AAndyProgram/SCrawler/wiki/Settings#download-groups)
|
||||
- Adding users to favorites and temporary
|
||||
- Filter exists users by label or group
|
||||
- Adding users and search queries in the **Subscription** mode (download post preview, but do not download the media file)
|
||||
- [Filter exists users](https://github.com/AAndyProgram/SCrawler/wiki#view) by label or group
|
||||
- Selection of media types you want to download (images only, videos only, both)
|
||||
- Download a special video, image or gallery
|
||||
- Making collections (grouping users into collections)
|
||||
- [Download a special video](https://github.com/AAndyProgram/SCrawler/wiki#download-separate-video), image or gallery
|
||||
- Making [collections](https://github.com/AAndyProgram/SCrawler/wiki#collections) (grouping users into collections)
|
||||
- Specifying a user folder (for downloading data to another location)
|
||||
- Changing user icons
|
||||
- Changing view modes
|
||||
- Changing [view modes](https://github.com/AAndyProgram/SCrawler/wiki#view)
|
||||
- ...and many others...
|
||||
|
||||
# Supported sites
|
||||
|
||||
- **YouTube**
|
||||
- **YouTube Music**
|
||||
- **Reddit**
|
||||
- **Twitter**
|
||||
- **OnlyFans** *(partial support)*[^1]
|
||||
- **Instagram**
|
||||
- **TikTok** ([limited](https://github.com/AAndyProgram/SCrawler/wiki/Settings#tiktok-limits))
|
||||
- **Threads**
|
||||
- **Facebook**
|
||||
- JustForFans *(partial support)*[^1]
|
||||
- Mastodon *(out of support)*
|
||||
- TikTok
|
||||
- RedGifs
|
||||
- Pinterest
|
||||
- Imgur
|
||||
- Gfycat
|
||||
- LPSG
|
||||
- **PornHub**
|
||||
- **XHamster**
|
||||
- **XVIDEOS**
|
||||
- **ThisVid**
|
||||
- [Other sites](Plugins.md)
|
||||
|
||||
**[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)**
|
||||
@@ -74,17 +102,10 @@ Do you like this program? Consider adding to my coffee fund by making a donation
|
||||
|
||||
First, the program downloads the full profile. After the program downloads only new posts. The program remembers downloaded posts.
|
||||
|
||||
## Reddit
|
||||
|
||||
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.
|
||||
|
||||
## Other sites
|
||||
|
||||
The program parses all user posts and compares file names with existing ones to remove duplicates. Then the media will be downloaded.
|
||||
|
||||
## How to request a new site
|
||||
|
||||
Read [here](CONTRIBUTING.md#how-to-request-a-new-site) about
|
||||
<!---Read [here](CONTRIBUTING.md#how-to-request-a-new-site) about--->
|
||||
**I'm currently not accepting requests to develop new sites.**
|
||||
|
||||
# Requirements
|
||||
|
||||
@@ -110,37 +131,49 @@ Read [here](CONTRIBUTING.md#how-to-request-a-new-site) about
|
||||
- **[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)**
|
||||
- [Reddit](https://github.com/AAndyProgram/SCrawler/wiki/Settings#reddit)
|
||||
- [Twitter](https://github.com/AAndyProgram/SCrawler/wiki/Settings#twitter)
|
||||
- [OnlyFans](https://github.com/AAndyProgram/SCrawler/wiki/Settings#onlyfans)
|
||||
- [Mastodon](https://github.com/AAndyProgram/SCrawler/wiki/Settings#mastodon)
|
||||
- [Instagram](https://github.com/AAndyProgram/SCrawler/wiki/Settings#instagram)
|
||||
- [Threads](https://github.com/AAndyProgram/SCrawler/wiki/Settings#threads)
|
||||
- [Facebook](https://github.com/AAndyProgram/SCrawler/wiki/Settings#facebook)
|
||||
- [JustForFans](https://github.com/AAndyProgram/SCrawler/wiki/Settings#justforfans)
|
||||
- [TikTok](https://github.com/AAndyProgram/SCrawler/wiki/Settings#tiktok)
|
||||
- [RedGifs](https://github.com/AAndyProgram/SCrawler/wiki/Settings#redgifs)
|
||||
- [YouTube](https://github.com/AAndyProgram/SCrawler/wiki/Settings#youtube)
|
||||
- [Pinterest](https://github.com/AAndyProgram/SCrawler/wiki/Settings#Pinterest)
|
||||
- [PornHub](https://github.com/AAndyProgram/SCrawler/wiki/Settings#pornhub)
|
||||
- [XHamster](https://github.com/AAndyProgram/SCrawler/wiki/Settings#xhamster)
|
||||
- [XVIDEOS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#xvideos)
|
||||
- [ThisVid](https://github.com/AAndyProgram/SCrawler/wiki/Settings#thisvid)
|
||||
- [LPSG](https://github.com/AAndyProgram/SCrawler/wiki/Settings#lpsg)
|
||||
|
||||
**Full guide you can find [here](https://github.com/AAndyProgram/SCrawler/wiki)**
|
||||
|
||||
**Video on how to configure**
|
||||
|
||||
[](https://www.youtube.com/watch?v=XDn7zG4I700)
|
||||
|
||||
# Installation
|
||||
|
||||
**Just download the [latest release](https://github.com/AAndyProgram/SCrawler/releases/latest), unzip the program archive to any folder, copy the file ```ffmpeg.exe``` into it and enjoy.** :blush:
|
||||
**Just download the [latest release](https://github.com/AAndyProgram/SCrawler/releases/latest), unzip the program archive to any folder and enjoy.** :blush:
|
||||
|
||||
**Don't put program in the ```Program Files``` system folder (this is portable program and program settings are stored in the program folder)**
|
||||
|
||||
**I highly doubt you can run SCrawler on Linux or Mac. SCrawler is a program that is heavily dependent on Windows.**
|
||||
|
||||
# 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.**
|
||||
Just download [latest](https://github.com/AAndyProgram/SCrawler/releases/latest) version and unpack it into the program folder. **Before launching a new version, I recommend making a backup copy of the program settings folder and user settings/data files.**
|
||||
|
||||
# How to build from source
|
||||
**You can also use the updater included in the release package.**
|
||||
|
||||
Read about how to build from source [here](CONTRIBUTING.md#how-to-build-from-source)
|
||||
# [How to report a problem](CONTRIBUTING.md#how-to-report-a-problem)
|
||||
|
||||
# How to make a plugin
|
||||
# [How to build from source](CONTRIBUTING.md#how-to-build-from-source)
|
||||
|
||||
Read about how to make plugin [here](https://github.com/AAndyProgram/SCrawler/wiki/Plugins).
|
||||
# [How to make a plugin](https://github.com/AAndyProgram/SCrawler/wiki/Plugins)
|
||||
|
||||
# How to support
|
||||
|
||||
Read more about how to support the program [here](HowToSupport.md).
|
||||
# [How to support](HowToSupport.md)
|
||||
|
||||
# Settings and usage
|
||||
|
||||
@@ -148,16 +181,50 @@ The program has an intuitive interface.
|
||||
|
||||
**[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)**
|
||||
|
||||
[](https://www.youtube.com/watch?v=XDn7zG4I700)
|
||||
|
||||
Just add a user profile and **click the ```Download``` button**.
|
||||
|
||||
Read more about adding users and subreddits [here](https://github.com/AAndyProgram/SCrawler/wiki/Users)
|
||||
```mermaid
|
||||
stateDiagram
|
||||
Start: Add site credentials
|
||||
What: What would I like to do
|
||||
DownUser: Download user
|
||||
DownVideo: Download video
|
||||
AUser: Add user (1)
|
||||
OVIF: Open standalone downloader (2)
|
||||
AVideo: Add video url
|
||||
F5: Press 'F5' or click the download button
|
||||
[*]-->Start
|
||||
Start-->What
|
||||
What-->DownUser
|
||||
What-->DownVideo
|
||||
DownUser-->AUser
|
||||
DownVideo-->OVIF
|
||||
OVIF-->AVideo
|
||||
AVideo-->F5
|
||||
AUser-->F5
|
||||
F5-->[*]
|
||||
```
|
||||
1. Press `Insert` or click the `Download` button ([read more here](https://github.com/AAndyProgram/SCrawler/wiki#users-list), [hot keys](https://github.com/AAndyProgram/SCrawler/wiki#hot-keys))
|
||||
2. Click the `Download` button, then `Standalone downloader` ([read more here](https://github.com/AAndyProgram/SCrawler/wiki#download-separate-video))
|
||||
|
||||

|
||||
|
||||
# Using program as just video downloader
|
||||
# Contact me
|
||||
|
||||
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.
|
||||
Discord server: https://discord.gg/uFNUXvFFmg
|
||||
|
||||
Example: ```D:\Programs\SCrawler\SCrawler.exe v```
|
||||
<!--
|
||||
[e-mail](mailto:andyprogram@proton.me): andyprogram@proton.me
|
||||
|
||||

|
||||
Matrix (Element): https://matrix.to/#/@andyprogram:matrix.org
|
||||
|
||||
Discord (contact the developer): andyprogram
|
||||
|
||||
Discord server: https://discord.gg/uFNUXvFFmg
|
||||
|
||||
[Wire](https://account.wire.com/user-profile/?id=93985052-cf2c-4b72-ac75-bbe3231cf544): @andyprogram
|
||||
-->
|
||||
|
||||
[^1]: Partial support means that I don't have personal accounts on paid porn sites because I don't pay for porn. If this site has stopped downloading and you want me to fix it, please be ready to give me access to an account with at least one active subscription. Otherwise, the download from this site will not be fixed.
|
||||
@@ -1,3 +1,3 @@
|
||||
[*.vb]
|
||||
# Modifier preferences
|
||||
file_header_template = Copyright (C) 2023 Andy https://github.com/AAndyProgram\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/>
|
||||
file_header_template = Copyright (C) Andy https://github.com/AAndyProgram\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/>
|
||||
@@ -36,17 +36,44 @@ Namespace Plugin.Attributes
|
||||
Public Property IsInformationLabel As Boolean = False
|
||||
''' <summary>Label text alignment.<br/>Default: <see cref="Drawing.ContentAlignment.TopCenter"/></summary>
|
||||
Public Property LabelTextAlign As Drawing.ContentAlignment = Drawing.ContentAlignment.TopCenter
|
||||
Private _IsAuth As Boolean = False
|
||||
''' <summary>This is an authorization property</summary>
|
||||
Public Property IsAuth As Boolean = False
|
||||
Public Property IsAuth As Boolean
|
||||
Get
|
||||
Return _IsAuth
|
||||
End Get
|
||||
Set(ByVal _IsAuth As Boolean)
|
||||
Me._IsAuth = _IsAuth
|
||||
If _IsAuth And String.IsNullOrEmpty(Category) Then
|
||||
Category = CategoryAuth
|
||||
ElseIf Not _IsAuth AndAlso Not String.IsNullOrEmpty(Category) AndAlso Category = CategoryAuth Then
|
||||
Category = String.Empty
|
||||
End If
|
||||
End Set
|
||||
End Property
|
||||
Public Const CategoryAuth As String = "Authorization"
|
||||
Public Property Category As String = Nothing
|
||||
Public Property InheritanceName As String = Nothing
|
||||
''' <summary>Initialize a new property option attribute</summary>
|
||||
''' <param name="PropertyName">Property name</param>
|
||||
Public Sub New(<CallerMemberName()> Optional ByVal PropertyName As String = Nothing)
|
||||
Name = PropertyName
|
||||
End Sub
|
||||
End Class
|
||||
''' <summary>Set the dependent fields that need to be updated when this property is changed internally.</summary>
|
||||
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=False, Inherited:=False)> Public NotInheritable Class DependentFields : Inherits Attribute
|
||||
Public ReadOnly Fields As String()
|
||||
Public Sub New(ByVal Field As String)
|
||||
Fields = {Field}
|
||||
End Sub
|
||||
Public Sub New(ByVal Fields As String())
|
||||
Me.Fields = Fields
|
||||
End Sub
|
||||
End Class
|
||||
''' <summary>Store property value in settings XML file</summary>
|
||||
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=False, Inherited:=False)> Public NotInheritable Class PXML : Inherits Attribute
|
||||
Public ReadOnly ElementName As String
|
||||
Public Property OnlyForChecked As Boolean = False
|
||||
''' <summary>Initialize a new XML attribute</summary>
|
||||
''' <param name="XMLElementName">XML element name</param>
|
||||
Public Sub New(<CallerMemberName()> Optional ByVal XMLElementName As String = Nothing)
|
||||
@@ -55,20 +82,26 @@ Namespace Plugin.Attributes
|
||||
End Class
|
||||
''' <summary>Attribute to disable some properties for host use</summary>
|
||||
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=False, Inherited:=False)> Public NotInheritable Class DoNotUse : Inherits Attribute
|
||||
Public ReadOnly Value As Boolean = True
|
||||
Public Sub New()
|
||||
End Sub
|
||||
Public Sub New(ByVal Value As Boolean)
|
||||
Me.Value = Value
|
||||
End Sub
|
||||
End Class
|
||||
''' <summary>Special property updater</summary>
|
||||
<AttributeUsage(AttributeTargets.Method, AllowMultiple:=True, Inherited:=False)> Public NotInheritable Class PropertyUpdater : Inherits Attribute
|
||||
Public ReadOnly Name As String
|
||||
Public ReadOnly Dependencies As String()
|
||||
Public ReadOnly Arguments As String()
|
||||
''' <inheritdoc cref="PropertyUpdater.New(String, String())"/>
|
||||
Public Sub New(ByVal UpdatingPropertyName As String)
|
||||
Name = UpdatingPropertyName
|
||||
End Sub
|
||||
''' <summary>Initialize a new PropertyUpdater attribute</summary>
|
||||
''' <param name="UpdatingPropertyName">The name of the property to be updated</param>
|
||||
Public Sub New(ByVal UpdatingPropertyName As String, ByVal Dependent As String())
|
||||
Public Sub New(ByVal UpdatingPropertyName As String, ByVal Arguments As String())
|
||||
Name = UpdatingPropertyName
|
||||
Dependencies = Dependent
|
||||
Me.Arguments = Arguments
|
||||
End Sub
|
||||
End Class
|
||||
''' <summary>Plugin key</summary>
|
||||
@@ -100,6 +133,8 @@ Namespace Plugin.Attributes
|
||||
''' <see langword="False"/> - only for conversion
|
||||
''' </summary>
|
||||
Public FieldsChecker As Boolean = False
|
||||
''' <summary>Interaction with changing text field. Default: <see langword="False"/></summary>
|
||||
Public Interaction As Boolean = False
|
||||
''' <summary>Initialize a new Provider attribute. <see cref="IFormatProvider"/> is only allowed</summary>
|
||||
''' <param name="PropertyName">The name of the property for which this provider is used</param>
|
||||
Public Sub New(ByVal PropertyName As String)
|
||||
@@ -170,4 +205,13 @@ Namespace Plugin.Attributes
|
||||
Repository = RepoName
|
||||
End Sub
|
||||
End Class
|
||||
''' <summary>Replace internal plugin with the current one</summary>
|
||||
<AttributeUsage(AttributeTargets.Class, AllowMultiple:=False, Inherited:=False)> Public NotInheritable Class ReplaceInternalPluginAttribute : Inherits Attribute
|
||||
Public ReadOnly SiteName As String
|
||||
Public ReadOnly PluginKey As String
|
||||
Public Sub New(ByVal PluginKey As String, Optional ByVal SiteName As String = Nothing)
|
||||
Me.PluginKey = PluginKey
|
||||
Me.SiteName = SiteName
|
||||
End Sub
|
||||
End Class
|
||||
End Namespace
|
||||
35
SCrawler.PluginProvider/Interfaces/IDownloadableMedia.vb
Normal file
@@ -0,0 +1,35 @@
|
||||
' Copyright (C) 2023 Andy https://github.com/AAndyProgram
|
||||
' 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 Plugin
|
||||
Public Interface IDownloadableMedia : Inherits IUserMedia, IDisposable
|
||||
Event CheckedChange As EventHandler
|
||||
Event ThumbnailChanged As EventHandler
|
||||
Event StateChanged As EventHandler
|
||||
ReadOnly Property SiteIcon As Drawing.Image
|
||||
ReadOnly Property Site As String
|
||||
ReadOnly Property SiteKey As String
|
||||
Property AccountName As String
|
||||
Property ThumbnailUrl As String
|
||||
Property ThumbnailFile As String
|
||||
Property Title As String
|
||||
Property Size As Integer
|
||||
Property Duration As TimeSpan
|
||||
Property Progress As Object
|
||||
ReadOnly Property HasError As Boolean
|
||||
ReadOnly Property Exists As Boolean
|
||||
Property Checked As Boolean
|
||||
Property Instance As IPluginContentProvider
|
||||
Sub Download(ByVal UseCookies As Boolean, ByVal Token As Threading.CancellationToken)
|
||||
Sub Delete(ByVal RemoveFiles As Boolean)
|
||||
Sub Load(ByVal File As String)
|
||||
Sub Save()
|
||||
Overloads Function ToString() As String
|
||||
Overloads Function ToString(ByVal ForMediaItem As Boolean) As String
|
||||
End Interface
|
||||
End Namespace
|
||||
@@ -8,13 +8,17 @@
|
||||
' but WITHOUT ANY WARRANTY
|
||||
Namespace Plugin
|
||||
Public Interface IPluginContentProvider : Inherits IDisposable
|
||||
Event ProgressChanged(ByVal Count As Integer)
|
||||
Event TotalCountChanged(ByVal Count As Integer)
|
||||
Event ProgressChanged(ByVal Value As Integer)
|
||||
Event ProgressMaximumChanged(ByVal Value As Integer, ByVal Add As Boolean)
|
||||
Event ProgressPreChanged As ProgressChangedEventHandler
|
||||
Event ProgressPreMaximumChanged As ProgressMaximumChangedEventHandler
|
||||
Property Thrower As IThrower
|
||||
Property LogProvider As ILogProvider
|
||||
Property Settings As ISiteSettings
|
||||
Property AccountName As String
|
||||
Property Name As String
|
||||
Property ID As String
|
||||
Property Options As String
|
||||
Property ParseUserMediaOnly As Boolean
|
||||
Property UserDescription As String
|
||||
Property ExistingContentList As List(Of IUserMedia)
|
||||
@@ -23,6 +27,7 @@ Namespace Plugin
|
||||
Property UserExists As Boolean
|
||||
Property UserSuspended As Boolean
|
||||
Property IsSavedPosts As Boolean
|
||||
Property IsSubscription As Boolean
|
||||
Property SeparateVideoFolder As Boolean
|
||||
Property DataPath As String
|
||||
Property PostsNumberLimit As Integer?
|
||||
@@ -32,7 +37,9 @@ Namespace Plugin
|
||||
Sub ExchangeOptionsSet(ByVal Obj As Object)
|
||||
Sub XmlFieldsSet(ByVal Fields As List(Of KeyValuePair(Of String, String)))
|
||||
Function XmlFieldsGet() As List(Of KeyValuePair(Of String, String))
|
||||
Sub GetMedia()
|
||||
Sub Download()
|
||||
Sub GetMedia(ByVal Token As Threading.CancellationToken)
|
||||
Sub Download(ByVal Token As Threading.CancellationToken)
|
||||
Sub DownloadSingleObject(ByVal Data As IDownloadableMedia, ByVal Token As Threading.CancellationToken)
|
||||
Sub ResetHistoryData()
|
||||
End Interface
|
||||
End Namespace
|
||||
@@ -8,25 +8,30 @@
|
||||
' but WITHOUT ANY WARRANTY
|
||||
Imports System.Drawing
|
||||
Namespace Plugin
|
||||
Public Interface ISiteSettings
|
||||
Public Interface ISiteSettings : Inherits IDisposable
|
||||
Enum Download As Integer
|
||||
Main = 0
|
||||
SavedPosts = 1
|
||||
Channel = 2
|
||||
SingleObject = 2
|
||||
End Enum
|
||||
ReadOnly Property Icon As Icon
|
||||
ReadOnly Property Image As Image
|
||||
ReadOnly Property Site As String
|
||||
Property CMDEncoding As String
|
||||
Property EnvironmentPrograms As IEnumerable(Of String)
|
||||
Property UserAgentDefault As String
|
||||
Sub EnvironmentProgramsUpdated()
|
||||
Property AccountName As String
|
||||
Property Temporary As Boolean
|
||||
Property DefaultInstance As ISiteSettings
|
||||
ReadOnly Property SubscriptionsAllowed As Boolean
|
||||
Property Logger As ILogProvider
|
||||
Function GetUserUrl(ByVal User As IPluginContentProvider, ByVal Channel As Boolean) As String
|
||||
Function GetUserUrl(ByVal User As IPluginContentProvider) As String
|
||||
Function IsMyUser(ByVal UserURL As String) As ExchangeOptions
|
||||
Function IsMyImageVideo(ByVal URL As String) As ExchangeOptions
|
||||
Function GetSpecialData(ByVal URL As String, ByVal Path As String, ByVal AskForPath As Boolean) As IEnumerable
|
||||
Function GetInstance(ByVal What As Download) As IPluginContentProvider
|
||||
Function GetSingleMediaInstance(ByVal URL As String, ByVal OutputFile As String) As IDownloadableMedia
|
||||
Function GetUserPostUrl(ByVal User As IPluginContentProvider, ByVal Media As IUserMedia) As String
|
||||
#Region "XML Support"
|
||||
Sub Load(ByVal XMLValues As IEnumerable(Of KeyValuePair(Of String, String)))
|
||||
#End Region
|
||||
#Region "Initialization"
|
||||
Sub BeginInit()
|
||||
Sub EndInit()
|
||||
@@ -36,6 +41,7 @@ Namespace Plugin
|
||||
Sub EndEdit()
|
||||
#End Region
|
||||
#Region "Site availability"
|
||||
Property AvailableText As String
|
||||
Function Available(ByVal What As Download, ByVal Silent As Boolean) As Boolean
|
||||
Function ReadyToDownload(ByVal What As Download) As Boolean
|
||||
#End Region
|
||||
@@ -45,7 +51,10 @@ Namespace Plugin
|
||||
Sub AfterDownload(ByVal User As Object, ByVal What As Download)
|
||||
Sub DownloadDone(ByVal What As Download)
|
||||
#End Region
|
||||
Sub Update()
|
||||
Function Clone(ByVal Full As Boolean) As ISiteSettings
|
||||
Sub Delete()
|
||||
Overloads Sub Update()
|
||||
Overloads Sub Update(ByVal Source As ISiteSettings)
|
||||
Sub Reset()
|
||||
Sub OpenSettingsForm()
|
||||
Sub UserOptions(ByRef Options As Object, ByVal OpenForm As Boolean)
|
||||
|
||||
@@ -13,7 +13,7 @@ Imports System.Runtime.InteropServices
|
||||
<Assembly: AssemblyDescription("Plugin provider for SCrawler")>
|
||||
<Assembly: AssemblyCompany("AndyProgram")>
|
||||
<Assembly: AssemblyProduct("SCrawler.PluginProvider")>
|
||||
<Assembly: AssemblyCopyright("Copyright © 2023")>
|
||||
<Assembly: AssemblyCopyright("Copyright © 2024")>
|
||||
<Assembly: AssemblyTrademark("AndyProgram")>
|
||||
|
||||
<Assembly: ComVisible(False)>
|
||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
||||
' by using the '*' as shown below:
|
||||
' <Assembly: AssemblyVersion("1.0.*")>
|
||||
|
||||
<Assembly: AssemblyVersion("2022.12.26.0")>
|
||||
<Assembly: AssemblyFileVersion("2022.12.26.0")>
|
||||
<Assembly: AssemblyVersion("2024.5.18.0")>
|
||||
<Assembly: AssemblyFileVersion("2024.5.18.0")>
|
||||
<Assembly: NeutralResourcesLanguage("en")>
|
||||
|
||||
@@ -11,6 +11,6 @@ Namespace Plugin
|
||||
Overloads Sub Add(ByVal Message As String)
|
||||
Overloads Sub Add(ByVal ex As Exception, ByVal Message As String,
|
||||
Optional ByVal ShowMainMsg As Boolean = False, Optional ByVal ShowErrorMsg As Boolean = False,
|
||||
Optional ByVal SendInLog As Boolean = True)
|
||||
Optional ByVal SendToLog As Boolean = True)
|
||||
End Interface
|
||||
End Namespace
|
||||
@@ -0,0 +1,13 @@
|
||||
' Copyright (C) 2023 Andy https://github.com/AAndyProgram
|
||||
' 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 Plugin
|
||||
Public Interface IPropertyProvider : Inherits IFormatProvider
|
||||
Property PropertyName As String
|
||||
End Interface
|
||||
End Namespace
|
||||
@@ -11,15 +11,12 @@ Namespace Plugin
|
||||
Public UserName As String
|
||||
Public SiteName As String
|
||||
Public HostKey As String
|
||||
Public IsChannel As Boolean
|
||||
Public Options As String
|
||||
Public Exists As Boolean
|
||||
Public Sub New(ByVal Site As String, ByVal Name As String)
|
||||
UserName = Name
|
||||
SiteName = Site
|
||||
End Sub
|
||||
Public Sub New(ByVal Site As String, ByVal Name As String, ByVal IsChannel As Boolean)
|
||||
Me.New(Site, Name)
|
||||
Me.IsChannel = IsChannel
|
||||
Exists = Not String.IsNullOrEmpty(Name) And Not String.IsNullOrWhiteSpace(Name)
|
||||
End Sub
|
||||
End Structure
|
||||
End Namespace
|
||||
36
SCrawler.PluginProvider/Objects/ExitException.vb
Normal file
@@ -0,0 +1,36 @@
|
||||
' Copyright (C) 2023 Andy https://github.com/AAndyProgram
|
||||
' 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 Plugin
|
||||
''' <summary>Represents errors that occur during downloading to be thrown to the root downloading function.</summary>
|
||||
Public Class ExitException : Inherits Exception
|
||||
''' <summary>Add only the message to the log, without adding a <see cref="StackTrace"/>. Default: <see langword="True"/>.</summary>
|
||||
''' <returns><see langword="True"/> if only the message should be added to the log; otherwise the stack trace will also be added.</returns>
|
||||
Public Property SimpleLogLine As Boolean = True
|
||||
''' <summary>Don't add a message to the log. Default: <see langword="False"/>.</summary>
|
||||
''' <returns><see langword="True"/> if the error is exit-only and there is no need to add a message to the log; otherwise add a message to the log.</returns>
|
||||
Public Property Silent As Boolean = False
|
||||
''' <summary>Initializes a new instance of the <see cref="ExitException"/> class.</summary>
|
||||
Public Sub New()
|
||||
End Sub
|
||||
''' <summary>Initializes a new instance of the <see cref="ExitException"/> class with a specified error message.</summary>
|
||||
''' <param name="Message">The message that describes the error.</param>
|
||||
Public Sub New(ByVal Message As String)
|
||||
MyBase.New(Message)
|
||||
End Sub
|
||||
''' <summary>
|
||||
''' Initializes a new instance of the <see cref="ExitException"/> class with a specified error message
|
||||
''' and a reference to the inner exception that is the cause of this exception.
|
||||
''' </summary>
|
||||
''' <param name="Message">The error message that explains the reason for the exception.</param>
|
||||
''' <param name="InnerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
|
||||
Public Sub New(ByVal Message As String, ByVal InnerException As Exception)
|
||||
MyBase.New(Message, InnerException)
|
||||
End Sub
|
||||
End Class
|
||||
End Namespace
|
||||
@@ -7,12 +7,15 @@
|
||||
' This program is distributed in the hope that it will be useful,
|
||||
' but WITHOUT ANY WARRANTY
|
||||
Namespace Plugin
|
||||
Public Delegate Sub ProgressChange(ByVal Value As Double?, ByVal Maximum As Double?, ByVal Information As String)
|
||||
Public Enum UserMediaTypes As Integer
|
||||
Undefined = 0
|
||||
[Picture] = 1
|
||||
[Video] = 2
|
||||
[Text] = 3
|
||||
Picture = 1
|
||||
Video = 2
|
||||
Audio = 200
|
||||
Text = 4
|
||||
VideoPre = 10
|
||||
AudioPre = 215
|
||||
GIF = 50
|
||||
m3u8 = 100
|
||||
End Enum
|
||||
@@ -24,12 +27,12 @@ Namespace Plugin
|
||||
Missing = 4
|
||||
End Enum
|
||||
Public Structure PluginUserMedia : Implements IUserMedia
|
||||
Public Property ContentType As Integer Implements IUserMedia.ContentType
|
||||
Public Property ContentType As UserMediaTypes Implements IUserMedia.ContentType
|
||||
Public Property URL As String Implements IUserMedia.URL
|
||||
Public Property URL_BASE As String Implements IUserMedia.URL_BASE
|
||||
Public Property MD5 As String Implements IUserMedia.MD5
|
||||
Public Property File As String Implements IUserMedia.File
|
||||
Public Property DownloadState As Integer Implements IUserMedia.DownloadState
|
||||
Public Property DownloadState As UserMediaStates Implements IUserMedia.DownloadState
|
||||
Public Property PostID As String Implements IUserMedia.PostID
|
||||
Public Property PostDate As Date? Implements IUserMedia.PostDate
|
||||
Public Property SpecialFolder As String Implements IUserMedia.SpecialFolder
|
||||
@@ -37,12 +40,12 @@ Namespace Plugin
|
||||
Public Property [Object] As Object Implements IUserMedia.Object
|
||||
End Structure
|
||||
Public Interface IUserMedia
|
||||
Property ContentType As Integer
|
||||
Property ContentType As UserMediaTypes
|
||||
Property URL As String
|
||||
Property URL_BASE As String
|
||||
Property MD5 As String
|
||||
Property File As String
|
||||
Property DownloadState As Integer
|
||||
Property DownloadState As UserMediaStates
|
||||
Property PostID As String
|
||||
Property PostDate As Date?
|
||||
Property SpecialFolder As String
|
||||
|
||||
@@ -9,8 +9,24 @@
|
||||
Namespace Plugin
|
||||
Public NotInheritable Class PropertyValue : Implements IPropertyValue
|
||||
Public Event ValueChanged As IPropertyValue.ValueChangedEventHandler Implements IPropertyValue.ValueChanged
|
||||
Public Event CheckedChanged As IPropertyValue.ValueChangedEventHandler
|
||||
Public Property [Type] As Type Implements IPropertyValue.Type
|
||||
Public Property OnChangeFunction As IPropertyValue.ValueChangedEventHandler
|
||||
Public Property OnCheckboxCheckedChange As EventHandler(Of PropertyValueEventArgs)
|
||||
Private _Checked As Boolean = False
|
||||
Public Property Checked As Boolean
|
||||
Get
|
||||
Return _Checked
|
||||
End Get
|
||||
Set(ByVal IsChecked As Boolean)
|
||||
_Checked = IsChecked
|
||||
If Not _Initialization Then
|
||||
If Not OnCheckboxCheckedChange Is Nothing Then OnCheckboxCheckedChange.Invoke(Me, EventArgs.Empty)
|
||||
RaiseEvent CheckedChanged(_Checked)
|
||||
End If
|
||||
End Set
|
||||
End Property
|
||||
Private _Initialization As Boolean = False
|
||||
''' <inheritdoc cref="PropertyValue.New(Object, Type, ByRef IPropertyValue.ValueChangedEventHandler)"/>
|
||||
''' <exception cref="ArgumentNullException"></exception>
|
||||
Public Sub New(ByVal InitValue As Object)
|
||||
@@ -41,10 +57,26 @@ Namespace Plugin
|
||||
End Get
|
||||
Set(ByVal NewValue As Object)
|
||||
_Value = NewValue
|
||||
If Not OnChangeFunction Is Nothing Then OnChangeFunction.Invoke(Value)
|
||||
RaiseEvent ValueChanged(_Value)
|
||||
If Not _Initialization Then
|
||||
If Not OnChangeFunction Is Nothing Then OnChangeFunction.Invoke(Value)
|
||||
RaiseEvent ValueChanged(_Value)
|
||||
End If
|
||||
End Set
|
||||
End Property
|
||||
Public Sub BeginInit()
|
||||
_Initialization = True
|
||||
End Sub
|
||||
Public Sub EndInit()
|
||||
_Initialization = False
|
||||
End Sub
|
||||
Public Sub Clone(ByVal Source As PropertyValue)
|
||||
_Initialization = True
|
||||
Type = Source.Type
|
||||
OnChangeFunction = Source.OnChangeFunction
|
||||
_Value = Source._Value
|
||||
_Checked = Source._Checked
|
||||
_Initialization = False
|
||||
End Sub
|
||||
End Class
|
||||
Public Interface IPropertyValue
|
||||
''' <summary>Event for internal exchange</summary>
|
||||
@@ -55,4 +87,8 @@ Namespace Plugin
|
||||
''' <summary>Property value</summary>
|
||||
Property Value As Object
|
||||
End Interface
|
||||
Public Class PropertyValueEventArgs : Inherits EventArgs
|
||||
Public Property Checked As Boolean = False
|
||||
Public Property ControlEnabled As Boolean = True
|
||||
End Class
|
||||
End Namespace
|
||||
@@ -102,9 +102,12 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Attributes\Attributes.vb" />
|
||||
<Compile Include="Interfaces\IDownloadableMedia.vb" />
|
||||
<Compile Include="ObjectInterfaces\IPropertyProvider.vb" />
|
||||
<Compile Include="Objects\ExchangeOptions.vb" />
|
||||
<Compile Include="ObjectInterfaces\ILogProvider.vb" />
|
||||
<Compile Include="Interfaces\IPluginContentProvider.vb" />
|
||||
<Compile Include="Objects\ExitException.vb" />
|
||||
<Compile Include="Objects\PluginUserMedia.vb" />
|
||||
<Compile Include="Interfaces\ISiteSettings.vb" />
|
||||
<Compile Include="ObjectInterfaces\IThrower.vb" />
|
||||
|
||||
3
SCrawler.Shared/.editorconfig
Normal file
@@ -0,0 +1,3 @@
|
||||
[*.vb]
|
||||
# Modifier preferences
|
||||
file_header_template = Copyright (C) Andy https://github.com/AAndyProgram\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/>
|
||||
33
SCrawler.Shared/Functions.vb
Normal file
@@ -0,0 +1,33 @@
|
||||
' Copyright (C) Andy https://github.com/AAndyProgram
|
||||
' 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 [Shared]
|
||||
Public Module Functions
|
||||
Public Const NewReleaseFolderName As String = "__NewRelease"
|
||||
Public Function GetCurrentMaxVer(Optional ByVal Path As SFile = Nothing) As Version
|
||||
Try
|
||||
If Path.IsEmptyString Then Path = Application.StartupPath.CSFileP
|
||||
If Path.Exists(SFO.Path, False) Then
|
||||
Dim versions As New List(Of Version)
|
||||
Dim v As FileVersionInfo
|
||||
With SFile.GetFiles(Path, "*.exe",, EDP.ReturnValue).ListIfNothing.Where(Function(f) f.Name = "SCrawler" Or f.Name = "YouTubeDownloader")
|
||||
If .ListExists Then
|
||||
For Each f As SFile In .Self
|
||||
v = FileVersionInfo.GetVersionInfo(f)
|
||||
versions.Add(New Version(v.ProductVersion))
|
||||
Next
|
||||
End If
|
||||
End With
|
||||
If versions.Count > 0 Then Return versions.Max
|
||||
End If
|
||||
Catch
|
||||
End Try
|
||||
Return Nothing
|
||||
End Function
|
||||
End Module
|
||||
End Namespace
|
||||
13
SCrawler.Shared/My Project/Application.Designer.vb
generated
Normal file
@@ -0,0 +1,13 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
10
SCrawler.Shared/My Project/Application.myapp
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<MySubMain>false</MySubMain>
|
||||
<SingleInstance>false</SingleInstance>
|
||||
<ShutdownMode>0</ShutdownMode>
|
||||
<EnableVisualStyles>true</EnableVisualStyles>
|
||||
<AuthenticationMode>0</AuthenticationMode>
|
||||
<ApplicationType>1</ApplicationType>
|
||||
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
||||
</MyApplicationData>
|
||||
37
SCrawler.Shared/My Project/AssemblyInfo.vb
Normal file
@@ -0,0 +1,37 @@
|
||||
Imports System.Resources
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
Imports System.Runtime.InteropServices
|
||||
|
||||
' General Information about an assembly is controlled through the following
|
||||
' set of attributes. Change these attribute values to modify the information
|
||||
' associated with an assembly.
|
||||
|
||||
' Review the values of the assembly attributes
|
||||
|
||||
<Assembly: AssemblyTitle("SCrawler.Shared")>
|
||||
<Assembly: AssemblyDescription("SCrawler shared functions")>
|
||||
<Assembly: AssemblyCompany("AndyProgram")>
|
||||
<Assembly: AssemblyProduct("SCrawler.Shared")>
|
||||
<Assembly: AssemblyCopyright("Copyright © 2024")>
|
||||
<Assembly: AssemblyTrademark("AndyProgram")>
|
||||
|
||||
<Assembly: ComVisible(False)>
|
||||
|
||||
'The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
<Assembly: Guid("75a22c7c-6f90-49cb-852b-078ea0b8f2b6")>
|
||||
|
||||
' Version information for an assembly consists of the following four values:
|
||||
'
|
||||
' Major Version
|
||||
' Minor Version
|
||||
' Build Number
|
||||
' Revision
|
||||
'
|
||||
' You can specify all the values or you can default the Build and Revision Numbers
|
||||
' by using the '*' as shown below:
|
||||
' <Assembly: AssemblyVersion("1.0.*")>
|
||||
|
||||
<Assembly: AssemblyVersion("2023.12.15.0")>
|
||||
<Assembly: AssemblyFileVersion("2023.12.15.0")>
|
||||
<Assembly: NeutralResourcesLanguage("en")>
|
||||
63
SCrawler.Shared/My Project/Resources.Designer.vb
generated
Normal file
@@ -0,0 +1,63 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
|
||||
Namespace My.Resources
|
||||
|
||||
'This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
'class via a tool like ResGen or Visual Studio.
|
||||
'To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
'with the /str option, or rebuild your VS project.
|
||||
'''<summary>
|
||||
''' A strongly-typed resource class, for looking up localized strings, etc.
|
||||
'''</summary>
|
||||
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0"), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
||||
Friend Module Resources
|
||||
|
||||
Private resourceMan As Global.System.Resources.ResourceManager
|
||||
|
||||
Private resourceCulture As Global.System.Globalization.CultureInfo
|
||||
|
||||
'''<summary>
|
||||
''' Returns the cached ResourceManager instance used by this class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
|
||||
Get
|
||||
If Object.ReferenceEquals(resourceMan, Nothing) Then
|
||||
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("SCrawler.Resources", GetType(Resources).Assembly)
|
||||
resourceMan = temp
|
||||
End If
|
||||
Return resourceMan
|
||||
End Get
|
||||
End Property
|
||||
|
||||
'''<summary>
|
||||
''' Overrides the current thread's CurrentUICulture property for all
|
||||
''' resource lookups using this strongly typed resource class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend Property Culture() As Global.System.Globalization.CultureInfo
|
||||
Get
|
||||
Return resourceCulture
|
||||
End Get
|
||||
Set
|
||||
resourceCulture = value
|
||||
End Set
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
117
SCrawler.Shared/My Project/Resources.resx
Normal file
@@ -0,0 +1,117 @@
|
||||
<?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.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: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" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</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" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
73
SCrawler.Shared/My Project/Settings.Designer.vb
generated
Normal file
@@ -0,0 +1,73 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0"), _
|
||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Partial Friend NotInheritable Class MySettings
|
||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||
|
||||
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
|
||||
|
||||
#Region "My.Settings Auto-Save Functionality"
|
||||
#If _MyType = "WindowsForms" Then
|
||||
Private Shared addedHandler As Boolean
|
||||
|
||||
Private Shared addedHandlerLockObject As New Object
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
|
||||
If My.Application.SaveMySettingsOnExit Then
|
||||
My.Settings.Save()
|
||||
End If
|
||||
End Sub
|
||||
#End If
|
||||
#End Region
|
||||
|
||||
Public Shared ReadOnly Property [Default]() As MySettings
|
||||
Get
|
||||
|
||||
#If _MyType = "WindowsForms" Then
|
||||
If Not addedHandler Then
|
||||
SyncLock addedHandlerLockObject
|
||||
If Not addedHandler Then
|
||||
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
|
||||
addedHandler = True
|
||||
End If
|
||||
End SyncLock
|
||||
End If
|
||||
#End If
|
||||
Return defaultInstance
|
||||
End Get
|
||||
End Property
|
||||
End Class
|
||||
End Namespace
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
|
||||
Friend Module MySettingsProperty
|
||||
|
||||
<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
|
||||
Friend ReadOnly Property Settings() As Global.SCrawler.My.MySettings
|
||||
Get
|
||||
Return Global.SCrawler.My.MySettings.Default
|
||||
End Get
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
7
SCrawler.Shared/My Project/Settings.settings
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
151
SCrawler.Shared/SCrawler.Shared.vbproj
Normal file
@@ -0,0 +1,151 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{DC634700-24C7-42DD-BF8F-87E6CC54E625}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>SCrawler</RootNamespace>
|
||||
<AssemblyName>SCrawler.Shared</AssemblyName>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<MyType>Windows</MyType>
|
||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||
<Deterministic>true</Deterministic>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DocumentationFile>
|
||||
</DocumentationFile>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<DefineDebug>false</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DocumentationFile>
|
||||
</DocumentationFile>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionExplicit>On</OptionExplicit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionCompare>Binary</OptionCompare>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionStrict>Off</OptionStrict>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionInfer>On</OptionInfer>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<Optimize>true</Optimize>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
<Optimize>true</Optimize>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Import Include="Microsoft.VisualBasic" />
|
||||
<Import Include="PersonalUtilities.Functions" />
|
||||
<Import Include="System" />
|
||||
<Import Include="System.Collections" />
|
||||
<Import Include="System.Collections.Generic" />
|
||||
<Import Include="System.Data" />
|
||||
<Import Include="System.Diagnostics" />
|
||||
<Import Include="System.Linq" />
|
||||
<Import Include="System.Windows.Forms" />
|
||||
<Import Include="System.Xml.Linq" />
|
||||
<Import Include="System.Threading.Tasks" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Functions.vb" />
|
||||
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||
<Compile Include="My Project\Application.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Application.myapp</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Resources.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Settings.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="My Project\Resources.resx">
|
||||
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include=".editorconfig" />
|
||||
<None Include="My Project\Application.myapp">
|
||||
<Generator>MyApplicationCodeGenerator</Generator>
|
||||
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
<None Include="My Project\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<CustomToolNamespace>My</CustomToolNamespace>
|
||||
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\MyUtilities\PersonalUtilities\PersonalUtilities.vbproj">
|
||||
<Project>{8405896b-2685-4916-bc93-1fb514c323a9}</Project>
|
||||
<Name>PersonalUtilities</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||
</Project>
|
||||
3
SCrawler.Updater/.editorconfig
Normal file
@@ -0,0 +1,3 @@
|
||||
[*.vb]
|
||||
# Modifier preferences
|
||||
file_header_template = Copyright (C) Andy https://github.com/AAndyProgram\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/>
|
||||
6
SCrawler.Updater/App.config
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
|
||||
</startup>
|
||||
</configuration>
|
||||
BIN
SCrawler.Updater/Content/Icons/RainbowIcon_48.ico
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
229
SCrawler.Updater/MainMod.vb
Normal file
@@ -0,0 +1,229 @@
|
||||
' Copyright (C) Andy https://github.com/AAndyProgram
|
||||
' 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 System.IO.Compression
|
||||
Imports PersonalUtilities.Functions
|
||||
Imports PersonalUtilities.Functions.XML
|
||||
Imports PersonalUtilities.Tools.Web.Clients
|
||||
Imports PersonalUtilities.Tools.Web.Documents.JSON
|
||||
Imports SCrawler.Shared
|
||||
Public Module MainMod
|
||||
Private MyProcessID As Integer = -1
|
||||
Private MyWorkingPath As SFile = Nothing
|
||||
Private ReadOnly ProcessNames As String() = {"SCrawler", "YouTubeDownloader", "Updater"}
|
||||
Private Silent As Boolean = False
|
||||
Private Function GetConsoleResponse(ByVal Request As String) As String
|
||||
Console.Write(Request)
|
||||
Return Console.ReadLine
|
||||
End Function
|
||||
Private Function DownloadFile(ByVal URL As String, ByVal Destination As SFile) As Boolean
|
||||
Try
|
||||
Dim lastPerc% = -1
|
||||
Dim currentCursor% = Console.CursorTop
|
||||
Using w As New RWebClient With {.AsyncMode = True}
|
||||
AddHandler w.DownloadProgressChanged,
|
||||
New DownloadProgressChangedEventHandler(Sub(ByVal Sender As Object, ByVal e As DownloadProgressChangedEventArgs)
|
||||
If lastPerc < e.ProgressPercentage Then
|
||||
lastPerc = e.ProgressPercentage
|
||||
Console.SetCursorPosition(0, currentCursor)
|
||||
Console.Write("{0}% completed", e.ProgressPercentage)
|
||||
End If
|
||||
End Sub)
|
||||
Return w.DownloadFile(URL, Destination, EDP.ReturnValue)
|
||||
End Using
|
||||
Catch ex As Exception
|
||||
Return False
|
||||
End Try
|
||||
End Function
|
||||
Public Sub Main()
|
||||
Try
|
||||
MyWorkingPath = AppDomain.CurrentDomain.BaseDirectory.CSFileP
|
||||
MyProcessID = Process.GetCurrentProcess.Id
|
||||
Console.Title = "SCrawler updater"
|
||||
With Environment.GetCommandLineArgs
|
||||
If .ListExists(2) Then Silent = .Self()(1).FromXML(Of Boolean)(False)
|
||||
End With
|
||||
|
||||
Dim currentDir As SFile = MyWorkingPath.CutPath
|
||||
Dim extractionDir As SFile = $"{currentDir.CSFilePS}{NewReleaseFolderName}\"
|
||||
If extractionDir.Exists(SFO.Path, False) Then extractionDir.Delete(SFO.Path, SFODelete.DeletePermanently, EDP.None)
|
||||
|
||||
Dim currVer As Version = GetCurrentMaxVer(currentDir)
|
||||
If currVer Is Nothing Then
|
||||
Console.WriteLine("The current version of the program cannot be determined")
|
||||
Else
|
||||
Console.WriteLine($"The current version is {currVer} (x{IIf(Environment.Is64BitProcess, 64, 86)})")
|
||||
Dim release As GitRelease = GetGitRelease()
|
||||
If Not release.URL.IsEmptyString And Not release.Version Is Nothing Then
|
||||
If release.Version > currVer Then
|
||||
Console.WriteLine($"The new version is {release.Version} ({release.Name})")
|
||||
|
||||
If Not Silent AndAlso GetConsoleResponse("Do you want to update the program? (y/n): ").IfNullOrEmpty("n") = "n" Then Exit Sub
|
||||
|
||||
If ActiveProcessesExist() Then
|
||||
Console.WriteLine("One of the SCrawler programs is still running. Waiting for all SCrawler programs to close.")
|
||||
While ActiveProcessesExist() : Threading.Thread.Sleep(100) : End While
|
||||
Console.WriteLine("All SCrawler programs are closed.")
|
||||
End If
|
||||
|
||||
If extractionDir.Exists(SFO.Path, True) Then
|
||||
Dim destFile As SFile = $"{extractionDir.CSFilePS}{New SFile(release.URL).File}"
|
||||
Console.WriteLine("Downloading new version...")
|
||||
If DownloadFile(release.URL, destFile) Then
|
||||
Console.WriteLine("")
|
||||
Console.WriteLine("New version downloaded!")
|
||||
Console.WriteLine("Extracting files...")
|
||||
ZipFile.ExtractToDirectory(destFile, extractionDir)
|
||||
Console.WriteLine("Files extracted!")
|
||||
destFile.Delete(SFO.File, SFODelete.DeletePermanently, EDP.None)
|
||||
If Not MoveFiles(extractionDir, currentDir) Then GetConsoleResponse("Unable to update the program. Press Enter to exit") : Exit Sub
|
||||
Else
|
||||
extractionDir.Delete(SFO.Path, SFODelete.DeletePermanently, EDP.None)
|
||||
Console.WriteLine("Unable to download new version")
|
||||
End If
|
||||
Else
|
||||
Console.WriteLine("Unable to create temp directory")
|
||||
End If
|
||||
Else
|
||||
Console.WriteLine("The program is up to date")
|
||||
End If
|
||||
Else
|
||||
Console.WriteLine("Unable to get information about new version")
|
||||
End If
|
||||
End If
|
||||
Catch ex As Exception
|
||||
Console.WriteLine("An error occurred during update")
|
||||
Console.WriteLine(ex.Message)
|
||||
Finally
|
||||
GetConsoleResponse("Press Enter to exit")
|
||||
End Try
|
||||
End Sub
|
||||
Private Function MoveFiles(ByVal Source As SFile, ByVal Destination As SFile) As Boolean
|
||||
Console.WriteLine("Updating files")
|
||||
Try
|
||||
|
||||
Dim oldFiles As List(Of SFile) = SFile.GetFiles(Destination,,, EDP.ReturnValue)
|
||||
Dim oldFolders As List(Of SFile) = SFile.GetDirectories(Destination,,, EDP.ReturnValue)
|
||||
|
||||
Dim newFiles As List(Of SFile) = SFile.GetFiles(Source,,, EDP.ReturnValue)
|
||||
Dim newFolders As List(Of SFile) = SFile.GetDirectories(Source,,, EDP.ReturnValue)
|
||||
|
||||
Dim obj As SFile = Nothing
|
||||
Dim wSegment As String = MyWorkingPath.Segments.Last
|
||||
Dim filesPredicate As Predicate(Of SFile) = Function(ByVal f As SFile) As Boolean
|
||||
If obj = f Or obj.Name = f.Name Then
|
||||
f.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.None)
|
||||
Return True
|
||||
Else
|
||||
Return False
|
||||
End If
|
||||
End Function
|
||||
Dim foldersPredicate As Predicate(Of SFile) = Function(ByVal f As SFile) As Boolean
|
||||
Dim ls$ = f.Segments.Last
|
||||
If ls = obj.Segments.Last And Not ls = NewReleaseFolderName And Not ls = wSegment Then
|
||||
f.Delete(SFO.Path, SFODelete.DeleteToRecycleBin, EDP.None)
|
||||
Return True
|
||||
Else
|
||||
Return False
|
||||
End If
|
||||
End Function
|
||||
|
||||
Dim getDestFile As Func(Of SFile, Boolean, SFile) = Function(ByVal f As SFile, ByVal isFolder As Boolean) As SFile
|
||||
Dim ff As SFile = f
|
||||
If isFolder Then
|
||||
ff = $"{Destination.PathWithSeparator}{f.Segments.Last}\"
|
||||
Else
|
||||
ff.Path = Destination.Path
|
||||
End If
|
||||
Console.WriteLine(ff)
|
||||
Return ff
|
||||
End Function
|
||||
If newFiles.ListExists Then
|
||||
If oldFiles.ListExists Then
|
||||
For Each obj In newFiles : oldFiles.RemoveAll(filesPredicate) : Next
|
||||
End If
|
||||
newFiles.ForEach(Sub(ff) SFile.Move(ff, getDestFile(ff, False), SFO.File, True, SFODelete.DeleteToRecycleBin, EDP.None))
|
||||
End If
|
||||
|
||||
If newFolders.ListExists Then
|
||||
If oldFolders.ListExists Then
|
||||
For Each obj In newFolders : oldFolders.RemoveAll(foldersPredicate) : Next
|
||||
End If
|
||||
newFolders.ForEach(Sub(ff) If Not ff.Segments.Last = wSegment Then _
|
||||
SFile.Move(ff, getDestFile(ff, True), SFO.Path, True, SFODelete.DeleteToRecycleBin, EDP.None))
|
||||
End If
|
||||
|
||||
Console.WriteLine("Files updated")
|
||||
Return True
|
||||
Catch
|
||||
Return False
|
||||
End Try
|
||||
End Function
|
||||
Private Function ActiveProcessesExist() As Boolean
|
||||
Try
|
||||
Return Process.GetProcesses.Any(Function(p) ProcessNames.Contains(p.ProcessName) And Not p.Id = MyProcessID)
|
||||
Catch
|
||||
Return True
|
||||
End Try
|
||||
End Function
|
||||
Private Structure GitRelease
|
||||
Friend URL As String
|
||||
Friend Name As String
|
||||
Friend Version As Version
|
||||
End Structure
|
||||
Private Function GetGitRelease() As GitRelease
|
||||
Try
|
||||
Dim nameEnd$ = $"_x{IIf(Environment.Is64BitProcess, 64, 86)}.zip"
|
||||
Dim name$, relName$, relTag$
|
||||
|
||||
Using resp As New Responser With {.Accept = "application/vnd.github.v3+json"}
|
||||
Dim r$ = resp.GetResponse("https://api.github.com/repos/AAndyProgram/SCrawler/releases",, EDP.ReturnValue)
|
||||
If Not r.IsEmptyString Then
|
||||
Dim getver As Func(Of String, Version) = Function(ByVal input As String) As Version
|
||||
Try
|
||||
If Not input.IsEmptyString Then
|
||||
If input.ToLower.StartsWith("scrawler") Then
|
||||
Return New Version(input.Split("_")(1))
|
||||
Else
|
||||
Return New Version(input)
|
||||
End If
|
||||
End If
|
||||
Catch
|
||||
End Try
|
||||
Return Nothing
|
||||
End Function
|
||||
Using j As EContainer = JsonDocument.Parse(r, EDP.ReturnValue)
|
||||
If j.ListExists Then
|
||||
With j.FirstOrDefault(Function(e) Not e.Value("draft").FromXML(Of Boolean) And Not e.Value("prerelease").FromXML(Of Boolean))
|
||||
If .ListExists Then
|
||||
relName = .Value("name")
|
||||
relTag = .Value("tag_name")
|
||||
With .Item("assets")
|
||||
If .ListExists Then
|
||||
For Each asset As EContainer In .Self
|
||||
name = asset.Value("name")
|
||||
If Not name.IsEmptyString AndAlso name.EndsWith(nameEnd) Then _
|
||||
Return New GitRelease With {
|
||||
.Name = name,
|
||||
.URL = asset.Value("browser_download_url"),
|
||||
.Version = getver(name).IfNullOrEmpty(getver(relName).IfNullOrEmpty(getver(relTag)))}
|
||||
Next
|
||||
End If
|
||||
End With
|
||||
End If
|
||||
End With
|
||||
End If
|
||||
End Using
|
||||
End If
|
||||
End Using
|
||||
Catch
|
||||
End Try
|
||||
Return Nothing
|
||||
End Function
|
||||
End Module
|
||||
13
SCrawler.Updater/My Project/Application.Designer.vb
generated
Normal file
@@ -0,0 +1,13 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
10
SCrawler.Updater/My Project/Application.myapp
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<MySubMain>false</MySubMain>
|
||||
<SingleInstance>false</SingleInstance>
|
||||
<ShutdownMode>0</ShutdownMode>
|
||||
<EnableVisualStyles>true</EnableVisualStyles>
|
||||
<AuthenticationMode>0</AuthenticationMode>
|
||||
<ApplicationType>2</ApplicationType>
|
||||
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
||||
</MyApplicationData>
|
||||
37
SCrawler.Updater/My Project/AssemblyInfo.vb
Normal file
@@ -0,0 +1,37 @@
|
||||
Imports System.Resources
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
Imports System.Runtime.InteropServices
|
||||
|
||||
' General Information about an assembly is controlled through the following
|
||||
' set of attributes. Change these attribute values to modify the information
|
||||
' associated with an assembly.
|
||||
|
||||
' Review the values of the assembly attributes
|
||||
|
||||
<Assembly: AssemblyTitle("SCrawler updater")>
|
||||
<Assembly: AssemblyDescription("SCrawler updater")>
|
||||
<Assembly: AssemblyCompany("AndyProgram")>
|
||||
<Assembly: AssemblyProduct("SCrawler.Updater")>
|
||||
<Assembly: AssemblyCopyright("Copyright © 2024")>
|
||||
<Assembly: AssemblyTrademark("AndyProgram")>
|
||||
|
||||
<Assembly: ComVisible(False)>
|
||||
|
||||
'The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
<Assembly: Guid("df008b29-ad5e-4271-acfe-650396d15c40")>
|
||||
|
||||
' Version information for an assembly consists of the following four values:
|
||||
'
|
||||
' Major Version
|
||||
' Minor Version
|
||||
' Build Number
|
||||
' Revision
|
||||
'
|
||||
' You can specify all the values or you can default the Build and Revision Numbers
|
||||
' by using the '*' as shown below:
|
||||
' <Assembly: AssemblyVersion("1.0.*")>
|
||||
|
||||
<Assembly: AssemblyVersion("2023.12.7.0")>
|
||||
<Assembly: AssemblyFileVersion("2023.12.7.0")>
|
||||
<Assembly: NeutralResourcesLanguage("en")>
|
||||
73
SCrawler.Updater/My Project/Resources.Designer.vb
generated
Normal file
@@ -0,0 +1,73 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
|
||||
Namespace My.Resources
|
||||
|
||||
'This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
'class via a tool like ResGen or Visual Studio.
|
||||
'To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
'with the /str option, or rebuild your VS project.
|
||||
'''<summary>
|
||||
''' A strongly-typed resource class, for looking up localized strings, etc.
|
||||
'''</summary>
|
||||
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0"), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
||||
Friend Module Resources
|
||||
|
||||
Private resourceMan As Global.System.Resources.ResourceManager
|
||||
|
||||
Private resourceCulture As Global.System.Globalization.CultureInfo
|
||||
|
||||
'''<summary>
|
||||
''' Returns the cached ResourceManager instance used by this class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
|
||||
Get
|
||||
If Object.ReferenceEquals(resourceMan, Nothing) Then
|
||||
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("SCrawler.Resources", GetType(Resources).Assembly)
|
||||
resourceMan = temp
|
||||
End If
|
||||
Return resourceMan
|
||||
End Get
|
||||
End Property
|
||||
|
||||
'''<summary>
|
||||
''' Overrides the current thread's CurrentUICulture property for all
|
||||
''' resource lookups using this strongly typed resource class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend Property Culture() As Global.System.Globalization.CultureInfo
|
||||
Get
|
||||
Return resourceCulture
|
||||
End Get
|
||||
Set
|
||||
resourceCulture = value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
'''<summary>
|
||||
''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
'''</summary>
|
||||
Friend ReadOnly Property RainbowIcon_48() As System.Drawing.Icon
|
||||
Get
|
||||
Dim obj As Object = ResourceManager.GetObject("RainbowIcon_48", resourceCulture)
|
||||
Return CType(obj,System.Drawing.Icon)
|
||||
End Get
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
124
SCrawler.Updater/My Project/Resources.resx
Normal file
@@ -0,0 +1,124 @@
|
||||
<?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>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="RainbowIcon_48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Content\Icons\RainbowIcon_48.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||