Compare commits
46 Commits
2023.4.28.
...
2023.11.25
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
5
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -30,7 +30,9 @@ A clear and concise description of what you expected to happen.
|
|||||||
**Screenshots**
|
**Screenshots**
|
||||||
If applicable, add screenshots to help explain your problem.
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
**Release information (please complete the following information):**
|
**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]
|
- OS: [e.g. Windows 10, Windows 11]
|
||||||
- Architecture: [e.g. x86, x64]
|
- Architecture: [e.g. x86, x64]
|
||||||
- Version: [e.g. 2023.3.5.0]
|
- Version: [e.g. 2023.3.5.0]
|
||||||
@@ -38,6 +40,7 @@ If applicable, add screenshots to help explain your problem.
|
|||||||
- ffmpeg version (command `ffmpeg -version`):
|
- ffmpeg version (command `ffmpeg -version`):
|
||||||
- yt-dlp version (command `yt-dlp --version`):
|
- yt-dlp version (command `yt-dlp --version`):
|
||||||
- gallery-dl version (command `gallery-dl --version`):
|
- gallery-dl version (command `gallery-dl --version`):
|
||||||
|
- cURL version (command `curl --version`):
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
Add any other context about the problem here.
|
Add any other context about the problem here.
|
||||||
|
|||||||
3
.gitignore
vendored
@@ -10,8 +10,7 @@
|
|||||||
*.userosscache
|
*.userosscache
|
||||||
*.sln.docstates
|
*.sln.docstates
|
||||||
.obsidian/
|
.obsidian/
|
||||||
ToDo.txt
|
BugReporterFormDiscordWebHook.vb
|
||||||
ToDo.md
|
|
||||||
|
|
||||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
*.userprefs
|
*.userprefs
|
||||||
|
|||||||
@@ -39,5 +39,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.
|
If I'm interested in a site you want to add, it may be added in future releases.
|
||||||
|
|
||||||
# Sites I will never develop
|
# Sites I will never develop
|
||||||
- Facebook
|
|
||||||
- Tumblr
|
- Tumblr
|
||||||
310
Changelog.md
@@ -1,3 +1,313 @@
|
|||||||
|
# 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.4.28.0
|
||||||
|
|
||||||
*2023-04-28*
|
*2023-04-28*
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
BIN
ProgramScreenshots/BugReport.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 483 KiB After Width: | Height: | Size: 491 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: 103 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 11 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: 16 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 21 KiB |
BIN
ProgramScreenshots/SettingsGlobalDesign.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 18 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: 25 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 36 KiB |
BIN
ProgramScreenshots/SettingsSiteJustForFans.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
BIN
ProgramScreenshots/SettingsSiteOnlyFans.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 15 KiB |
BIN
ProgramScreenshots/SettingsSiteThreads.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.3 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 |
@@ -117,7 +117,7 @@ https://github.com/RipMeApp/ripme
|
|||||||
| **Free options** | The program is completely free | The program is completely free, but site limits are not declared |
|
| **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 |
|
| Operating Systems | Windows 10+ | Windows, MacOS, Linux |
|
||||||
| Select want content type to download | Yes | Yes |
|
| Select want content type to download | Yes | Yes |
|
||||||
| Suported sites | 15 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 |
|
| Other sites support | **Yes** | No |
|
||||||
| Still supported | **Yes** | **No (last release date May 4, 2021)** |
|
| Still supported | **Yes** | **No (last release date May 4, 2021)** |
|
||||||
|
|
||||||
|
|||||||
92
README.md
@@ -1,7 +1,10 @@
|
|||||||
|
<!-- # :rainbow_flag: Happy LGBT Pride Month :tada:
|
||||||
|
-->
|
||||||
# :rainbow_flag: Social networks crawler :rainbow_flag:
|
# :rainbow_flag: Social networks crawler :rainbow_flag:
|
||||||
|
|
||||||
[](https://github.com/AAndyProgram/SCrawler/releases/latest)
|
[](https://github.com/AAndyProgram/SCrawler/releases/latest)
|
||||||
[](https://github.com/AAndyProgram/SCrawler/blob/main/LICENSE)
|
[](https://github.com/AAndyProgram/SCrawler/blob/main/LICENSE)
|
||||||
|
[](https://discord.gg/uFNUXvFFmg)
|
||||||
[](https://github.com/AAndyProgram/SCrawler/releases)
|
[](https://github.com/AAndyProgram/SCrawler/releases)
|
||||||
[](FAQ.md)
|
[](FAQ.md)
|
||||||
[](https://github.com/AAndyProgram/SCrawler/wiki)
|
[](https://github.com/AAndyProgram/SCrawler/wiki)
|
||||||
@@ -9,17 +12,19 @@
|
|||||||
:eu:
|
:eu:
|
||||||
:greece:
|
:greece:
|
||||||
|
|
||||||
A program to download photo and video from [any site](#supported-sites) (e.g. YouTube, YouTube Music, Reddit, Twitter, Mastodon, Instagram, TikTok, RedGifs, PornHub, XHamster, XVIDEOS, ThisVid, LPSG, Pinterest).
|
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/) and/or [this](https://www.softpedia.com/get/Internet/Download-Managers/Social-networks-crawler.shtml)**
|
**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:
|
<!---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)--->
|
[](https://ko-fi.com/andyprogram)--->
|
||||||
**Bitcoin**: BC1Q0NH839FT5TA44DD7L7RLR97XDQAG9V8D6N7XET
|
**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%20downloader)
|
[**YouTube standalone application:**](https://github.com/AAndyProgram/SCrawler/wiki/YouTube-downloader)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -29,26 +34,32 @@ A program to download photo and video from [any site](#supported-sites) (e.g. Yo
|
|||||||
- Reddit images, galleries of images, videos, saved posts;
|
- Reddit images, galleries of images, videos, saved posts;
|
||||||
- Redgifs videos (https://www.redgifs.com/);
|
- Redgifs videos (https://www.redgifs.com/);
|
||||||
- Twitter images and videos, saved (bookmarked) posts;
|
- Twitter images and videos, saved (bookmarked) posts;
|
||||||
|
- OnlyFans images and videos, saved (bookmarked) posts;
|
||||||
|
- JustForFans images and videos, saved (bookmarked) posts;
|
||||||
- Mastodon images and videos, saved (bookmarked) posts;
|
- Mastodon images and videos, saved (bookmarked) posts;
|
||||||
- Instagram images and videos, tagged posts, stories, saved posts;
|
- Instagram images and videos, tagged posts, stories, saved posts;
|
||||||
- TikTok videos (*currently broken*; [limited](https://github.com/AAndyProgram/SCrawler/wiki/Settings#tiktok-limits));
|
- Threads images and videos;
|
||||||
|
- Facebook images and videos, saved posts;
|
||||||
|
- TikTok videos;
|
||||||
- Pinterest boards, users, saved posts;
|
- Pinterest boards, users, saved posts;
|
||||||
- Imgur images, galleries and videos;
|
- Imgur images, galleries and videos;
|
||||||
- Gfycat videos;
|
- Gfycat videos;
|
||||||
- PornHub images, videos, save (liked) posts;
|
- PornHub images, videos, save (liked) posts, search queries, search categories;
|
||||||
- XHamster images, videos, saved posts;
|
- XHamster images, videos, saved posts, search queries, search categories, search tags;
|
||||||
- XVIDEOS videos, saved posts;
|
- XVIDEOS videos, saved posts, search queries, search categories;
|
||||||
- ThiVid images, videos, saved posts;
|
- ThisVid images, videos, saved posts, search queries, search categories, search tags;
|
||||||
- [Other](#supported-sites) supported sites
|
- [Other](#supported-sites) supported sites
|
||||||
- Parse [channel and view data](https://github.com/AAndyProgram/SCrawler/wiki/Channels)
|
- Parse [Reddit 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)
|
- Download [saved posts](https://github.com/AAndyProgram/SCrawler/wiki/Home#saved-posts)
|
||||||
- Add users from parsed channel
|
- Add users from parsed channel
|
||||||
- **Advanced user management**
|
- **Advanced user management**
|
||||||
- **Automation** ([downloading data automatically](https://github.com/AAndyProgram/SCrawler/wiki/Settings#automation) every ```X``` minutes)
|
- **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)
|
- **Feed** ([feed](https://github.com/AAndyProgram/SCrawler/wiki#feed) of downloaded media files and subscriptions posts)
|
||||||
|
- Multiple accounts support
|
||||||
- Labeling users
|
- Labeling users
|
||||||
- Create [download groups](https://github.com/AAndyProgram/SCrawler/wiki/Settings#download-groups)
|
- Create [download groups](https://github.com/AAndyProgram/SCrawler/wiki/Settings#download-groups)
|
||||||
- Adding users to favorites and temporary
|
- Adding users to favorites and temporary
|
||||||
|
- 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
|
- [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)
|
- Selection of media types you want to download (images only, videos only, both)
|
||||||
- [Download a special video](https://github.com/AAndyProgram/SCrawler/wiki#download-separate-video), image or gallery
|
- [Download a special video](https://github.com/AAndyProgram/SCrawler/wiki#download-separate-video), image or gallery
|
||||||
@@ -63,9 +74,13 @@ A program to download photo and video from [any site](#supported-sites) (e.g. Yo
|
|||||||
- **YouTube Music**
|
- **YouTube Music**
|
||||||
- **Reddit**
|
- **Reddit**
|
||||||
- **Twitter**
|
- **Twitter**
|
||||||
|
- **OnlyFans**
|
||||||
- **Mastodon**
|
- **Mastodon**
|
||||||
- **Instagram**
|
- **Instagram**
|
||||||
- TikTok (*currently broken*; [limited](https://github.com/AAndyProgram/SCrawler/wiki/Settings#tiktok-limits))
|
- **Threads**
|
||||||
|
- **Facebook**
|
||||||
|
- JustForFans
|
||||||
|
- TikTok
|
||||||
- RedGifs
|
- RedGifs
|
||||||
- Pinterest
|
- Pinterest
|
||||||
- Imgur
|
- Imgur
|
||||||
@@ -83,14 +98,6 @@ A program to download photo and video from [any site](#supported-sites) (e.g. Yo
|
|||||||
|
|
||||||
First, the program downloads the full profile. After the program downloads only new posts. The program remembers downloaded posts.
|
First, the program downloads the full profile. After the program downloads only new posts. The program remembers downloaded posts.
|
||||||
|
|
||||||
## Reddit
|
|
||||||
|
|
||||||
The program parses 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 user posts and compares file names with existing ones to remove duplicates. Then the media will be downloaded.
|
|
||||||
|
|
||||||
## How to request a new site
|
## 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--->
|
||||||
@@ -120,16 +127,20 @@ The program parses user posts and compares file names with existing ones to remo
|
|||||||
- **[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)**
|
- **[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)**
|
||||||
- [Reddit](https://github.com/AAndyProgram/SCrawler/wiki/Settings#reddit)
|
- [Reddit](https://github.com/AAndyProgram/SCrawler/wiki/Settings#reddit)
|
||||||
- [Twitter](https://github.com/AAndyProgram/SCrawler/wiki/Settings#twitter)
|
- [Twitter](https://github.com/AAndyProgram/SCrawler/wiki/Settings#twitter)
|
||||||
- [Mastodon](https://github.com/AAndyProgram/SCrawler/wiki/Settings#Mastodon)
|
- [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)
|
- [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)
|
- [TikTok](https://github.com/AAndyProgram/SCrawler/wiki/Settings#tiktok)
|
||||||
- [RedGifs](https://github.com/AAndyProgram/SCrawler/wiki/Settings#redgifs)
|
- [RedGifs](https://github.com/AAndyProgram/SCrawler/wiki/Settings#redgifs)
|
||||||
- [YouTube](https://github.com/AAndyProgram/SCrawler/wiki/Settings#YouTube)
|
- [YouTube](https://github.com/AAndyProgram/SCrawler/wiki/Settings#youtube)
|
||||||
- [Pinterest](https://github.com/AAndyProgram/SCrawler/wiki/Settings#Pinterest)
|
- [Pinterest](https://github.com/AAndyProgram/SCrawler/wiki/Settings#Pinterest)
|
||||||
- [PornHub](https://github.com/AAndyProgram/SCrawler/wiki/Settings#pornhub)
|
- [PornHub](https://github.com/AAndyProgram/SCrawler/wiki/Settings#pornhub)
|
||||||
- [XHamster](https://github.com/AAndyProgram/SCrawler/wiki/Settings#xhamster)
|
- [XHamster](https://github.com/AAndyProgram/SCrawler/wiki/Settings#xhamster)
|
||||||
- [XVIDEOS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#xvideos)
|
- [XVIDEOS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#xvideos)
|
||||||
- [ThisVid](https://github.com/AAndyProgram/SCrawler/wiki/Settings#ThisVid)
|
- [ThisVid](https://github.com/AAndyProgram/SCrawler/wiki/Settings#thisvid)
|
||||||
- [LPSG](https://github.com/AAndyProgram/SCrawler/wiki/Settings#lpsg)
|
- [LPSG](https://github.com/AAndyProgram/SCrawler/wiki/Settings#lpsg)
|
||||||
|
|
||||||
**Full guide you can find [here](https://github.com/AAndyProgram/SCrawler/wiki)**
|
**Full guide you can find [here](https://github.com/AAndyProgram/SCrawler/wiki)**
|
||||||
@@ -158,11 +169,44 @@ The program has an intuitive interface.
|
|||||||
|
|
||||||
Just add a user profile and **click the ```Download``` button**.
|
Just add a user profile and **click the ```Download``` button**.
|
||||||
|
|
||||||
Read more about adding users and subreddits [here](https://github.com/AAndyProgram/SCrawler/wiki#Add%20user)
|
```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))
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
# Contact me
|
# Contact me
|
||||||
|
|
||||||
|
Discord server: https://discord.gg/uFNUXvFFmg
|
||||||
|
|
||||||
|
<!--
|
||||||
|
[e-mail](mailto:andyprogram@proton.me): andyprogram@proton.me
|
||||||
|
|
||||||
Matrix (Element): https://matrix.to/#/@andyprogram:matrix.org
|
Matrix (Element): https://matrix.to/#/@andyprogram:matrix.org
|
||||||
Discord: AndyProgram#3804
|
|
||||||
|
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,3 +1,3 @@
|
|||||||
[*.vb]
|
[*.vb]
|
||||||
# Modifier preferences
|
# 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/>
|
||||||
@@ -44,6 +44,16 @@ Namespace Plugin.Attributes
|
|||||||
Name = PropertyName
|
Name = PropertyName
|
||||||
End Sub
|
End Sub
|
||||||
End Class
|
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>
|
''' <summary>Store property value in settings XML file</summary>
|
||||||
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=False, Inherited:=False)> Public NotInheritable Class PXML : Inherits Attribute
|
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=False, Inherited:=False)> Public NotInheritable Class PXML : Inherits Attribute
|
||||||
Public ReadOnly ElementName As String
|
Public ReadOnly ElementName As String
|
||||||
@@ -55,20 +65,26 @@ Namespace Plugin.Attributes
|
|||||||
End Class
|
End Class
|
||||||
''' <summary>Attribute to disable some properties for host use</summary>
|
''' <summary>Attribute to disable some properties for host use</summary>
|
||||||
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=False, Inherited:=False)> Public NotInheritable Class DoNotUse : Inherits Attribute
|
<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
|
End Class
|
||||||
''' <summary>Special property updater</summary>
|
''' <summary>Special property updater</summary>
|
||||||
<AttributeUsage(AttributeTargets.Method, AllowMultiple:=True, Inherited:=False)> Public NotInheritable Class PropertyUpdater : Inherits Attribute
|
<AttributeUsage(AttributeTargets.Method, AllowMultiple:=True, Inherited:=False)> Public NotInheritable Class PropertyUpdater : Inherits Attribute
|
||||||
Public ReadOnly Name As String
|
Public ReadOnly Name As String
|
||||||
Public ReadOnly Dependencies As String()
|
Public ReadOnly Arguments As String()
|
||||||
''' <inheritdoc cref="PropertyUpdater.New(String, String())"/>
|
''' <inheritdoc cref="PropertyUpdater.New(String, String())"/>
|
||||||
Public Sub New(ByVal UpdatingPropertyName As String)
|
Public Sub New(ByVal UpdatingPropertyName As String)
|
||||||
Name = UpdatingPropertyName
|
Name = UpdatingPropertyName
|
||||||
End Sub
|
End Sub
|
||||||
''' <summary>Initialize a new PropertyUpdater attribute</summary>
|
''' <summary>Initialize a new PropertyUpdater attribute</summary>
|
||||||
''' <param name="UpdatingPropertyName">The name of the property to be updated</param>
|
''' <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
|
Name = UpdatingPropertyName
|
||||||
Dependencies = Dependent
|
Me.Arguments = Arguments
|
||||||
End Sub
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
''' <summary>Plugin key</summary>
|
''' <summary>Plugin key</summary>
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ Namespace Plugin
|
|||||||
ReadOnly Property SiteIcon As Drawing.Image
|
ReadOnly Property SiteIcon As Drawing.Image
|
||||||
ReadOnly Property Site As String
|
ReadOnly Property Site As String
|
||||||
ReadOnly Property SiteKey As String
|
ReadOnly Property SiteKey As String
|
||||||
|
Property AccountName As String
|
||||||
Property ThumbnailUrl As String
|
Property ThumbnailUrl As String
|
||||||
Property ThumbnailFile As String
|
Property ThumbnailFile As String
|
||||||
Property Title As String
|
Property Title As String
|
||||||
|
|||||||
@@ -10,11 +10,15 @@ Namespace Plugin
|
|||||||
Public Interface IPluginContentProvider : Inherits IDisposable
|
Public Interface IPluginContentProvider : Inherits IDisposable
|
||||||
Event ProgressChanged(ByVal Value As Integer)
|
Event ProgressChanged(ByVal Value As Integer)
|
||||||
Event ProgressMaximumChanged(ByVal Value As Integer, ByVal Add As Boolean)
|
Event ProgressMaximumChanged(ByVal Value As Integer, ByVal Add As Boolean)
|
||||||
|
Event ProgressPreChanged As ProgressChangedEventHandler
|
||||||
|
Event ProgressPreMaximumChanged As ProgressMaximumChangedEventHandler
|
||||||
Property Thrower As IThrower
|
Property Thrower As IThrower
|
||||||
Property LogProvider As ILogProvider
|
Property LogProvider As ILogProvider
|
||||||
Property Settings As ISiteSettings
|
Property Settings As ISiteSettings
|
||||||
|
Property AccountName As String
|
||||||
Property Name As String
|
Property Name As String
|
||||||
Property ID As String
|
Property ID As String
|
||||||
|
Property Options As String
|
||||||
Property ParseUserMediaOnly As Boolean
|
Property ParseUserMediaOnly As Boolean
|
||||||
Property UserDescription As String
|
Property UserDescription As String
|
||||||
Property ExistingContentList As List(Of IUserMedia)
|
Property ExistingContentList As List(Of IUserMedia)
|
||||||
@@ -23,6 +27,7 @@ Namespace Plugin
|
|||||||
Property UserExists As Boolean
|
Property UserExists As Boolean
|
||||||
Property UserSuspended As Boolean
|
Property UserSuspended As Boolean
|
||||||
Property IsSavedPosts As Boolean
|
Property IsSavedPosts As Boolean
|
||||||
|
Property IsSubscription As Boolean
|
||||||
Property SeparateVideoFolder As Boolean
|
Property SeparateVideoFolder As Boolean
|
||||||
Property DataPath As String
|
Property DataPath As String
|
||||||
Property PostsNumberLimit As Integer?
|
Property PostsNumberLimit As Integer?
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
' but WITHOUT ANY WARRANTY
|
' but WITHOUT ANY WARRANTY
|
||||||
Imports System.Drawing
|
Imports System.Drawing
|
||||||
Namespace Plugin
|
Namespace Plugin
|
||||||
Public Interface ISiteSettings
|
Public Interface ISiteSettings : Inherits IDisposable
|
||||||
Enum Download As Integer
|
Enum Download As Integer
|
||||||
Main = 0
|
Main = 0
|
||||||
SavedPosts = 1
|
SavedPosts = 1
|
||||||
@@ -17,6 +17,10 @@ Namespace Plugin
|
|||||||
ReadOnly Property Icon As Icon
|
ReadOnly Property Icon As Icon
|
||||||
ReadOnly Property Image As Image
|
ReadOnly Property Image As Image
|
||||||
ReadOnly Property Site As String
|
ReadOnly Property Site As String
|
||||||
|
Property AccountName As String
|
||||||
|
Property Temporary As Boolean
|
||||||
|
Property DefaultInstance As ISiteSettings
|
||||||
|
ReadOnly Property SubscriptionsAllowed As Boolean
|
||||||
Property Logger As ILogProvider
|
Property Logger As ILogProvider
|
||||||
Function GetUserUrl(ByVal User As IPluginContentProvider) As String
|
Function GetUserUrl(ByVal User As IPluginContentProvider) As String
|
||||||
Function IsMyUser(ByVal UserURL As String) As ExchangeOptions
|
Function IsMyUser(ByVal UserURL As String) As ExchangeOptions
|
||||||
@@ -24,9 +28,6 @@ Namespace Plugin
|
|||||||
Function GetInstance(ByVal What As Download) As IPluginContentProvider
|
Function GetInstance(ByVal What As Download) As IPluginContentProvider
|
||||||
Function GetSingleMediaInstance(ByVal URL As String, ByVal OutputFile As String) As IDownloadableMedia
|
Function GetSingleMediaInstance(ByVal URL As String, ByVal OutputFile As String) As IDownloadableMedia
|
||||||
Function GetUserPostUrl(ByVal User As IPluginContentProvider, ByVal Media As IUserMedia) As String
|
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"
|
#Region "Initialization"
|
||||||
Sub BeginInit()
|
Sub BeginInit()
|
||||||
Sub EndInit()
|
Sub EndInit()
|
||||||
@@ -36,6 +37,7 @@ Namespace Plugin
|
|||||||
Sub EndEdit()
|
Sub EndEdit()
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Site availability"
|
#Region "Site availability"
|
||||||
|
Property AvailableText As String
|
||||||
Function Available(ByVal What As Download, ByVal Silent As Boolean) As Boolean
|
Function Available(ByVal What As Download, ByVal Silent As Boolean) As Boolean
|
||||||
Function ReadyToDownload(ByVal What As Download) As Boolean
|
Function ReadyToDownload(ByVal What As Download) As Boolean
|
||||||
#End Region
|
#End Region
|
||||||
@@ -45,7 +47,10 @@ Namespace Plugin
|
|||||||
Sub AfterDownload(ByVal User As Object, ByVal What As Download)
|
Sub AfterDownload(ByVal User As Object, ByVal What As Download)
|
||||||
Sub DownloadDone(ByVal What As Download)
|
Sub DownloadDone(ByVal What As Download)
|
||||||
#End Region
|
#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 Reset()
|
||||||
Sub OpenSettingsForm()
|
Sub OpenSettingsForm()
|
||||||
Sub UserOptions(ByRef Options As Object, ByVal OpenForm As Boolean)
|
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: AssemblyDescription("Plugin provider for SCrawler")>
|
||||||
<Assembly: AssemblyCompany("AndyProgram")>
|
<Assembly: AssemblyCompany("AndyProgram")>
|
||||||
<Assembly: AssemblyProduct("SCrawler.PluginProvider")>
|
<Assembly: AssemblyProduct("SCrawler.PluginProvider")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2023")>
|
<Assembly: AssemblyCopyright("Copyright © 2024")>
|
||||||
<Assembly: AssemblyTrademark("AndyProgram")>
|
<Assembly: AssemblyTrademark("AndyProgram")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
|||||||
' by using the '*' as shown below:
|
' by using the '*' as shown below:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("2023.4.28.0")>
|
<Assembly: AssemblyVersion("2023.11.24.0")>
|
||||||
<Assembly: AssemblyFileVersion("2023.4.28.0")>
|
<Assembly: AssemblyFileVersion("2023.11.24.0")>
|
||||||
<Assembly: NeutralResourcesLanguage("en")>
|
<Assembly: NeutralResourcesLanguage("en")>
|
||||||
|
|||||||
@@ -11,6 +11,6 @@ Namespace Plugin
|
|||||||
Overloads Sub Add(ByVal Message As String)
|
Overloads Sub Add(ByVal Message As String)
|
||||||
Overloads Sub Add(ByVal ex As Exception, 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 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 Interface
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -11,6 +11,7 @@ Namespace Plugin
|
|||||||
Public UserName As String
|
Public UserName As String
|
||||||
Public SiteName As String
|
Public SiteName As String
|
||||||
Public HostKey As String
|
Public HostKey As String
|
||||||
|
Public Options As String
|
||||||
Public Exists As Boolean
|
Public Exists As Boolean
|
||||||
Public Sub New(ByVal Site As String, ByVal Name As String)
|
Public Sub New(ByVal Site As String, ByVal Name As String)
|
||||||
UserName = Name
|
UserName = Name
|
||||||
|
|||||||
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
|
||||||
@@ -11,6 +11,7 @@ Namespace Plugin
|
|||||||
Public Event ValueChanged As IPropertyValue.ValueChangedEventHandler Implements IPropertyValue.ValueChanged
|
Public Event ValueChanged As IPropertyValue.ValueChangedEventHandler Implements IPropertyValue.ValueChanged
|
||||||
Public Property [Type] As Type Implements IPropertyValue.Type
|
Public Property [Type] As Type Implements IPropertyValue.Type
|
||||||
Public Property OnChangeFunction As IPropertyValue.ValueChangedEventHandler
|
Public Property OnChangeFunction As IPropertyValue.ValueChangedEventHandler
|
||||||
|
Private _Initialization As Boolean = False
|
||||||
''' <inheritdoc cref="PropertyValue.New(Object, Type, ByRef IPropertyValue.ValueChangedEventHandler)"/>
|
''' <inheritdoc cref="PropertyValue.New(Object, Type, ByRef IPropertyValue.ValueChangedEventHandler)"/>
|
||||||
''' <exception cref="ArgumentNullException"></exception>
|
''' <exception cref="ArgumentNullException"></exception>
|
||||||
Public Sub New(ByVal InitValue As Object)
|
Public Sub New(ByVal InitValue As Object)
|
||||||
@@ -41,10 +42,25 @@ Namespace Plugin
|
|||||||
End Get
|
End Get
|
||||||
Set(ByVal NewValue As Object)
|
Set(ByVal NewValue As Object)
|
||||||
_Value = NewValue
|
_Value = NewValue
|
||||||
|
If Not _Initialization Then
|
||||||
If Not OnChangeFunction Is Nothing Then OnChangeFunction.Invoke(Value)
|
If Not OnChangeFunction Is Nothing Then OnChangeFunction.Invoke(Value)
|
||||||
RaiseEvent ValueChanged(_Value)
|
RaiseEvent ValueChanged(_Value)
|
||||||
|
End If
|
||||||
End Set
|
End Set
|
||||||
End Property
|
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
|
||||||
|
_Initialization = False
|
||||||
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
Public Interface IPropertyValue
|
Public Interface IPropertyValue
|
||||||
''' <summary>Event for internal exchange</summary>
|
''' <summary>Event for internal exchange</summary>
|
||||||
|
|||||||
@@ -107,6 +107,7 @@
|
|||||||
<Compile Include="Objects\ExchangeOptions.vb" />
|
<Compile Include="Objects\ExchangeOptions.vb" />
|
||||||
<Compile Include="ObjectInterfaces\ILogProvider.vb" />
|
<Compile Include="ObjectInterfaces\ILogProvider.vb" />
|
||||||
<Compile Include="Interfaces\IPluginContentProvider.vb" />
|
<Compile Include="Interfaces\IPluginContentProvider.vb" />
|
||||||
|
<Compile Include="Objects\ExitException.vb" />
|
||||||
<Compile Include="Objects\PluginUserMedia.vb" />
|
<Compile Include="Objects\PluginUserMedia.vb" />
|
||||||
<Compile Include="Interfaces\ISiteSettings.vb" />
|
<Compile Include="Interfaces\ISiteSettings.vb" />
|
||||||
<Compile Include="ObjectInterfaces\IThrower.vb" />
|
<Compile Include="ObjectInterfaces\IThrower.vb" />
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
[*.vb]
|
[*.vb]
|
||||||
# Modifier preferences
|
# 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/>
|
||||||
@@ -6,6 +6,10 @@
|
|||||||
'
|
'
|
||||||
' This program is distributed in the hope that it will be useful,
|
' This program is distributed in the hope that it will be useful,
|
||||||
' but WITHOUT ANY WARRANTY
|
' but WITHOUT ANY WARRANTY
|
||||||
|
Imports System.Drawing.Design
|
||||||
|
Imports System.ComponentModel
|
||||||
|
Imports PersonalUtilities.Tools.Grid.Attributes
|
||||||
|
Imports PersonalUtilities.Tools.Grid.EnumObjects
|
||||||
Namespace API.YouTube.Base
|
Namespace API.YouTube.Base
|
||||||
Public Structure Thumbnail : Implements IIndexable, IComparable(Of Thumbnail)
|
Public Structure Thumbnail : Implements IIndexable, IComparable(Of Thumbnail)
|
||||||
Public ID As String
|
Public ID As String
|
||||||
@@ -24,8 +28,19 @@ Namespace API.YouTube.Base
|
|||||||
End Structure
|
End Structure
|
||||||
Public Structure Subtitles : Implements IIndexable, IComparable(Of Subtitles)
|
Public Structure Subtitles : Implements IIndexable, IComparable(Of Subtitles)
|
||||||
Public ID As String
|
Public ID As String
|
||||||
Public Name As String
|
Private _Name As String
|
||||||
|
Public Property Name As String
|
||||||
|
Get
|
||||||
|
Dim n$ = _Name.IfNullOrEmpty(ID)
|
||||||
|
If CC Then n &= " (CC)"
|
||||||
|
Return n
|
||||||
|
End Get
|
||||||
|
Set(ByVal NewName As String)
|
||||||
|
_Name = NewName
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
Public Formats As String
|
Public Formats As String
|
||||||
|
Public CC As Boolean
|
||||||
Public ReadOnly Property FullID As String
|
Public ReadOnly Property FullID As String
|
||||||
Get
|
Get
|
||||||
Return IIf(ID = "en", "en.*", ID)
|
Return IIf(ID = "en", "en.*", ID)
|
||||||
@@ -47,6 +62,14 @@ Namespace API.YouTube.Base
|
|||||||
Channel = 2
|
Channel = 2
|
||||||
PlayList = 3
|
PlayList = 3
|
||||||
End Enum
|
End Enum
|
||||||
|
<Editor(GetType(EnumDropDownEditor), GetType(UITypeEditor))>
|
||||||
|
Public Enum Protocols As Integer
|
||||||
|
<EnumValue(ExcludeFromList:=True)>
|
||||||
|
Undefined = -1
|
||||||
|
Any = 0
|
||||||
|
https = 1
|
||||||
|
m3u8 = 2
|
||||||
|
End Enum
|
||||||
Public Structure MediaObject : Implements IIndexable, IComparable(Of MediaObject)
|
Public Structure MediaObject : Implements IIndexable, IComparable(Of MediaObject)
|
||||||
Public Type As Plugin.UserMediaTypes
|
Public Type As Plugin.UserMediaTypes
|
||||||
Public ID As String
|
Public ID As String
|
||||||
@@ -58,7 +81,18 @@ Namespace API.YouTube.Base
|
|||||||
''' <summary>Kb</summary>
|
''' <summary>Kb</summary>
|
||||||
Public Size As Double
|
Public Size As Double
|
||||||
Public Codec As String
|
Public Codec As String
|
||||||
Public Info As String
|
Public Protocol As String
|
||||||
|
Public ReadOnly Property ProtocolType As Protocols
|
||||||
|
Get
|
||||||
|
If Not Protocol.IsEmptyString Then
|
||||||
|
Select Case Protocol.StringToLower.StringTrim
|
||||||
|
Case "http", "https" : Return Protocols.https
|
||||||
|
Case "m3u8" : Return Protocols.m3u8
|
||||||
|
End Select
|
||||||
|
End If
|
||||||
|
Return Protocols.Undefined
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
Public URL As String
|
Public URL As String
|
||||||
Public Property Index As Integer Implements IIndexable.Index
|
Public Property Index As Integer Implements IIndexable.Index
|
||||||
Private Function SetIndex(ByVal Obj As Object, ByVal Index As Integer) As Object Implements IIndexable.SetIndex
|
Private Function SetIndex(ByVal Obj As Object, ByVal Index As Integer) As Object Implements IIndexable.SetIndex
|
||||||
|
|||||||
@@ -20,20 +20,45 @@ Namespace API.YouTube.Base
|
|||||||
Public Const UrlTypePattern As String = "(?<=https?://[^/]*?youtube.com/)((@|[^\?/&]+))([/\?]{0,1}(list=|v=|)([^\?/&]*))(?=(\S+|\Z|))"
|
Public Const UrlTypePattern As String = "(?<=https?://[^/]*?youtube.com/)((@|[^\?/&]+))([/\?]{0,1}(list=|v=|)([^\?/&]*))(?=(\S+|\Z|))"
|
||||||
Private Sub New()
|
Private Sub New()
|
||||||
End Sub
|
End Sub
|
||||||
|
Public Shared Function StandardizeURL(ByVal URL As String) As String
|
||||||
|
Try
|
||||||
|
Dim isMusic As Boolean = False, isShorts As Boolean = False
|
||||||
|
If Info_GetUrlType(URL, isMusic, isShorts) = YouTubeMediaType.Single Then
|
||||||
|
If Not isMusic And Not isShorts Then
|
||||||
|
Dim videoOptionRegex As RParams = RParams.DMS("[\?&]v=([^\?&]+)", 1, EDP.ReturnValue)
|
||||||
|
Dim data As List(Of String) = RegexReplace(URL, RParams.DMS(UrlTypePattern, 0, RegexReturn.ListByMatch, EDP.ReturnValue))
|
||||||
|
Dim val$ = String.Empty
|
||||||
|
If data.ListExists Then
|
||||||
|
For Each d$ In data
|
||||||
|
val = RegexReplace(d, videoOptionRegex)
|
||||||
|
If Not val.IsEmptyString Then Exit For
|
||||||
|
Next
|
||||||
|
data.Clear()
|
||||||
|
End If
|
||||||
|
If Not val.IsEmptyString Then Return $"https://www.youtube.com/watch?v={val}"
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Return URL
|
||||||
|
Catch ex As Exception
|
||||||
|
Return URL
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
Public Shared Function IsMyUrl(ByVal URL As String) As Boolean
|
Public Shared Function IsMyUrl(ByVal URL As String) As Boolean
|
||||||
Return Not Info_GetUrlType(URL) = YouTubeMediaType.Undefined
|
Return Not Info_GetUrlType(URL) = YouTubeMediaType.Undefined
|
||||||
End Function
|
End Function
|
||||||
Public Shared Function Info_GetUrlType(ByVal URL As String, Optional ByRef IsMusic As Boolean = False,
|
Public Shared Function Info_GetUrlType(ByVal URL As String, Optional ByRef IsMusic As Boolean = False, Optional ByRef IsShorts As Boolean = False,
|
||||||
Optional ByRef IsChannelUser As Boolean = False, Optional ByRef Id As String = Nothing) As YouTubeMediaType
|
Optional ByRef IsChannelUser As Boolean = False, Optional ByRef Id As String = Nothing) As YouTubeMediaType
|
||||||
If Not URL.IsEmptyString Then
|
If Not URL.IsEmptyString Then
|
||||||
IsMusic = URL.Contains("music.youtube.com")
|
IsMusic = URL.Contains("music.youtube.com")
|
||||||
IsChannelUser = False
|
IsChannelUser = False
|
||||||
|
IsShorts = False
|
||||||
Dim data As List(Of String) = RegexReplace(URL, RParams.DMS(UrlTypePattern, 0, RegexReturn.ListByMatch, EDP.ReturnValue))
|
Dim data As List(Of String) = RegexReplace(URL, RParams.DMS(UrlTypePattern, 0, RegexReturn.ListByMatch, EDP.ReturnValue))
|
||||||
If data.ListExists Then
|
If data.ListExists Then
|
||||||
If data.Count >= 6 Then Id = data(5)
|
If data.Count >= 6 Then Id = data(5)
|
||||||
If data.Count >= 3 And Not data(2).IsEmptyString Then
|
If data.Count >= 3 And Not data(2).IsEmptyString Then
|
||||||
Select Case data(2).ToLower
|
Select Case data(2).ToLower
|
||||||
Case "watch" : Return YouTubeMediaType.Single
|
Case "watch" : Return YouTubeMediaType.Single
|
||||||
|
Case "shorts" : IsShorts = True : Return YouTubeMediaType.Single
|
||||||
Case "playlist" : Return YouTubeMediaType.PlayList
|
Case "playlist" : Return YouTubeMediaType.PlayList
|
||||||
Case UserChannelOption, "@" : IsChannelUser = data(2).ToLower = UserChannelOption : Return YouTubeMediaType.Channel
|
Case UserChannelOption, "@" : IsChannelUser = data(2).ToLower = UserChannelOption : Return YouTubeMediaType.Channel
|
||||||
End Select
|
End Select
|
||||||
@@ -64,8 +89,8 @@ Namespace API.YouTube.Base
|
|||||||
Dim urlOrig$ = URL
|
Dim urlOrig$ = URL
|
||||||
URL = RegexReplace(URL, TrueUrlRegEx)
|
URL = RegexReplace(URL, TrueUrlRegEx)
|
||||||
If URL.IsEmptyString Then Throw New ArgumentNullException("URL", $"Can't get true URL from [{urlOrig}]")
|
If URL.IsEmptyString Then Throw New ArgumentNullException("URL", $"Can't get true URL from [{urlOrig}]")
|
||||||
Dim isMusic As Boolean = False
|
Dim isMusic As Boolean = False, isShorts As Boolean = False
|
||||||
Dim objType As YouTubeMediaType = Info_GetUrlType(URL, isMusic)
|
Dim objType As YouTubeMediaType = Info_GetUrlType(URL, isMusic, isShorts)
|
||||||
If Not objType = YouTubeMediaType.Undefined Then
|
If Not objType = YouTubeMediaType.Undefined Then
|
||||||
Dim __GetDefault As Boolean = If(GetDefault, True)
|
Dim __GetDefault As Boolean = If(GetDefault, True)
|
||||||
Dim __GetShorts As Boolean = If(GetShorts, True)
|
Dim __GetShorts As Boolean = If(GetShorts, True)
|
||||||
@@ -105,7 +130,7 @@ Namespace API.YouTube.Base
|
|||||||
|
|
||||||
If result Then
|
If result Then
|
||||||
container.Parse(Nothing, _CachePathDefault, isMusic, Token, Progress)
|
container.Parse(Nothing, _CachePathDefault, isMusic, Token, Progress)
|
||||||
If Not container.HasError Then container.URL = URL : Return container
|
If Not container.HasError Then container.URL = URL : container.IsShorts = isShorts : Return container
|
||||||
End If
|
End If
|
||||||
container.Dispose()
|
container.Dispose()
|
||||||
End If
|
End If
|
||||||
|
|||||||
@@ -34,13 +34,37 @@ Namespace API.YouTube.Base
|
|||||||
<Browsable(False)> Friend ReadOnly Property DesignXml As XmlFile
|
<Browsable(False)> Friend ReadOnly Property DesignXml As XmlFile
|
||||||
<Browsable(False)> Private Property Mode As GridUpdateModes = GridUpdateModes.OnConfirm Implements IGridValuesContainer.Mode
|
<Browsable(False)> Private Property Mode As GridUpdateModes = GridUpdateModes.OnConfirm Implements IGridValuesContainer.Mode
|
||||||
<Browsable(False), XMLVV(-1)> Friend ReadOnly Property PlaylistFormSplitterDistance As XMLValue(Of Integer)
|
<Browsable(False), XMLVV(-1)> Friend ReadOnly Property PlaylistFormSplitterDistance As XMLValue(Of Integer)
|
||||||
|
<Browsable(False)> Friend ReadOnly Property DownloadLocations As DownloadLocationsCollection
|
||||||
|
<Browsable(False)> Public Overridable Property AccountName As String
|
||||||
#Region "Environment"
|
#Region "Environment"
|
||||||
<Browsable(True), GridVisible(False), XMLVN({"Environment"}), Category("Environment"), DisplayName("Path to yt-dlp.exe"),
|
#Region "Programs"
|
||||||
|
<Browsable(True), GridVisible(False), XMLVN({"Environment"}), Category("Environment programs"), DisplayName("Path to yt-dlp.exe"),
|
||||||
Description("Path to yt-dlp.exe file")>
|
Description("Path to yt-dlp.exe file")>
|
||||||
Public ReadOnly Property YTDLP As XMLValue(Of SFile)
|
Public ReadOnly Property YTDLP As XMLValue(Of SFile)
|
||||||
<Browsable(True), GridVisible(False), XMLVN({"Environment"}), Category("Environment"), DisplayName("Path to ffmpeg.exe"),
|
<Browsable(True), GridVisible(False), XMLVN({"Environment"}), Category("Environment programs"), DisplayName("Path to ffmpeg.exe"),
|
||||||
Description("Path to ffmpeg.exe file")>
|
Description("Path to ffmpeg.exe file")>
|
||||||
Public ReadOnly Property FFMPEG As XMLValue(Of SFile)
|
Public ReadOnly Property FFMPEG As XMLValue(Of SFile)
|
||||||
|
<Browsable(False)> Private ReadOnly Property ENVIR_FFMPEG As SFile Implements IDownloaderSettings.ENVIR_FFMPEG
|
||||||
|
Get
|
||||||
|
Return FFMPEG
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
<Browsable(False)> Private ReadOnly Property ENVIR_YTDLP As SFile Implements IDownloaderSettings.ENVIR_YTDLP
|
||||||
|
Get
|
||||||
|
Return YTDLP
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
<Browsable(False)> Private ReadOnly Property ENVIR_GDL As SFile Implements IDownloaderSettings.ENVIR_GDL
|
||||||
|
Get
|
||||||
|
Return Nothing
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
<Browsable(False)> Private ReadOnly Property ENVIR_CURL As SFile Implements IDownloaderSettings.ENVIR_CURL
|
||||||
|
Get
|
||||||
|
Return Nothing
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
#End Region
|
||||||
<Browsable(True), GridVisible(False), Category("Environment"), Description("YouTube cookies"), GridCollectionForm(GetType(CookieListForm2)),
|
<Browsable(True), GridVisible(False), Category("Environment"), Description("YouTube cookies"), GridCollectionForm(GetType(CookieListForm2)),
|
||||||
EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
|
EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
|
||||||
Public ReadOnly Property Cookies As CookieKeeper
|
Public ReadOnly Property Cookies As CookieKeeper
|
||||||
@@ -62,6 +86,22 @@ Namespace API.YouTube.Base
|
|||||||
<Browsable(True), GridVisible(False), XMLVN({"Environment"}), Category("Environment"), DisplayName("Output path auto change"),
|
<Browsable(True), GridVisible(False), XMLVN({"Environment"}), Category("Environment"), DisplayName("Output path auto change"),
|
||||||
Description("Automatically change the output path when a new destination is selected in the opening forms.")>
|
Description("Automatically change the output path when a new destination is selected in the opening forms.")>
|
||||||
Public ReadOnly Property OutputPathAutoChange As XMLValue(Of Boolean)
|
Public ReadOnly Property OutputPathAutoChange As XMLValue(Of Boolean)
|
||||||
|
<Browsable(True), GridVisible(False), XMLVN({"Environment"}, True), Category("Environment"), DisplayName("Output path: ask for a name"),
|
||||||
|
Description("Ask for a name when adding a new output path to the list.")>
|
||||||
|
Public ReadOnly Property OutputPathAskForName As XMLValue(Of Boolean)
|
||||||
|
Private ReadOnly Property IDownloaderSettings_OutputPathAskForName As Boolean Implements IDownloaderSettings.OutputPathAskForName
|
||||||
|
Get
|
||||||
|
Return OutputPathAskForName
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
<Browsable(True), GridVisible(False), XMLVN({"Environment"}, True), Category("Environment"), DisplayName("Output path: auto add"),
|
||||||
|
Description("Add new paths to the list automatically.")>
|
||||||
|
Public ReadOnly Property OutputPathAutoAddPaths As XMLValue(Of Boolean)
|
||||||
|
Private ReadOnly Property IDownloaderSettings_OutputPathAutoAddPaths As Boolean Implements IDownloaderSettings.OutputPathAutoAddPaths
|
||||||
|
Get
|
||||||
|
Return OutputPathAutoAddPaths
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
<Browsable(True), GridVisible(False), XMLVN({"Environment"}, DoubleClickBehavior.Folder), Category("Environment"), DisplayName("On item double click"),
|
<Browsable(True), GridVisible(False), XMLVN({"Environment"}, DoubleClickBehavior.Folder), Category("Environment"), DisplayName("On item double click"),
|
||||||
Description("What should program open when you double-click on an item...")>
|
Description("What should program open when you double-click on an item...")>
|
||||||
Public ReadOnly Property OnItemDoubleClick As XMLValue(Of DoubleClickBehavior)
|
Public ReadOnly Property OnItemDoubleClick As XMLValue(Of DoubleClickBehavior)
|
||||||
@@ -93,13 +133,32 @@ Namespace API.YouTube.Base
|
|||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "Info"
|
||||||
|
<Browsable(True), GridVisible, XMLVN({"Info"}), Category("Info"), DisplayName("Create URL files"),
|
||||||
|
Description("Create local URL files to link to the original page. Default: false.")>
|
||||||
|
Public ReadOnly Property CreateUrlFiles As XMLValue(Of Boolean)
|
||||||
|
Private ReadOnly Property IDownloaderSettings_CreateUrlFiles As Boolean Implements IDownloaderSettings.CreateUrlFiles
|
||||||
|
Get
|
||||||
|
Return CreateUrlFiles
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
<Browsable(True), GridVisible, XMLVN({"Info"}), Category("Info"), DisplayName("Create description files"),
|
||||||
|
Description("Create video description files. Default: false.")>
|
||||||
|
Public ReadOnly Property CreateDescriptionFiles As XMLValue(Of Boolean)
|
||||||
|
#End Region
|
||||||
#Region "Defaults"
|
#Region "Defaults"
|
||||||
|
<Browsable(True), GridVisible, XMLVN({"Defaults"}, True), Category("Defaults"), DisplayName("Standardize URLs"),
|
||||||
|
Description("Standardize URLs by eliminating unwanted strings. Default: true.")>
|
||||||
|
Public ReadOnly Property StandardizeURLs As XMLValue(Of Boolean)
|
||||||
|
<Browsable(True), GridVisible, XMLVN({"Defaults"}), Category("Defaults"), DisplayName("Replace modification date"),
|
||||||
|
Description("Set the file date to the date the video was added (website) (if available). Default: false.")>
|
||||||
|
Public ReadOnly Property ReplaceModificationDate As XMLValue(Of Boolean)
|
||||||
<Browsable(True), GridVisible, XMLVN({"Defaults"}), Category("Defaults"), DisplayName("Use cookies"),
|
<Browsable(True), GridVisible, XMLVN({"Defaults"}), Category("Defaults"), DisplayName("Use cookies"),
|
||||||
Description("By default, use cookies when downloading from YouTube.")>
|
Description("By default, use cookies when downloading from YouTube.")>
|
||||||
Public ReadOnly Property DefaultUseCookies As XMLValue(Of Boolean)
|
Public ReadOnly Property DefaultUseCookies As XMLValue(Of Boolean)
|
||||||
<Browsable(True), GridVisible(False), XMLVN({"Defaults"}, 100), Category("Defaults"), DisplayName("Items limit"),
|
<Browsable(True), GridVisible, XMLVN({"Defaults"}, Protocols.Any), Category("Defaults"), DisplayName("Protocol"),
|
||||||
Description("Number of items displayed in the list.")>
|
Description("Priority download protocol. Default: 'Any'")>
|
||||||
Public ReadOnly Property ItemsListLimit As XMLValue(Of Integer)
|
Public ReadOnly Property DefaultProtocol As XMLValue(Of Protocols)
|
||||||
<Browsable(True), GridVisible(False), XMLVN({"Defaults"}), Category("Defaults"),
|
<Browsable(True), GridVisible(False), XMLVN({"Defaults"}), Category("Defaults"),
|
||||||
DisplayName("Auto remove"), Description("Automatically remove downloaded items from the list.")>
|
DisplayName("Auto remove"), Description("Automatically remove downloaded items from the list.")>
|
||||||
Public ReadOnly Property RemoveDownloadedAutomatically As XMLValue(Of Boolean)
|
Public ReadOnly Property RemoveDownloadedAutomatically As XMLValue(Of Boolean)
|
||||||
@@ -152,6 +211,15 @@ Namespace API.YouTube.Base
|
|||||||
<Browsable(True), GridVisible(False), XMLVN({"Defaults"}, False), Category("Defaults"), DisplayName("Confirm exit"),
|
<Browsable(True), GridVisible(False), XMLVN({"Defaults"}, False), Category("Defaults"), DisplayName("Confirm exit"),
|
||||||
Description("Exit confirmation when closing the program.")>
|
Description("Exit confirmation when closing the program.")>
|
||||||
Public ReadOnly Property ExitConfirm As XMLValue(Of Boolean)
|
Public ReadOnly Property ExitConfirm As XMLValue(Of Boolean)
|
||||||
|
<Browsable(True), GridVisible(False), XMLVN({"Defaults"}), Category("Defaults"), DisplayName("Download on click in tray: show form"),
|
||||||
|
Description("Show main window when download by clicking (Ctrl+Click) the tray icon. Default: false")>
|
||||||
|
Public ReadOnly Property ShowFormDownTrayClick As XMLValue(Of Boolean)
|
||||||
|
<Browsable(True), GridVisible(False), XMLVN({"Defaults"}), Category("Defaults"), DisplayName("Program title"),
|
||||||
|
Description("Change the title of the main window if you need to")>
|
||||||
|
Friend ReadOnly Property ProgramText As XMLValue(Of String)
|
||||||
|
<Browsable(True), GridVisible(False), XMLVN({"Defaults"}), Category("Defaults"), DisplayName("Program description"),
|
||||||
|
Description("Add some additional info to the program info if you need")>
|
||||||
|
Friend ReadOnly Property ProgramDescription As XMLValue(Of String)
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Defaults Video"
|
#Region "Defaults Video"
|
||||||
<Browsable(True), GridVisible, XMLVN({"DefaultsVideo"}, "MKV"), Category("Defaults Video"), DisplayName("Default format"),
|
<Browsable(True), GridVisible, XMLVN({"DefaultsVideo"}, "MKV"), Category("Defaults Video"), DisplayName("Default format"),
|
||||||
@@ -164,6 +232,9 @@ Namespace API.YouTube.Base
|
|||||||
<Browsable(True), GridVisible, XMLVN({"DefaultsVideo"}, 1080), Category("Defaults Video"), DisplayName("Default definition"),
|
<Browsable(True), GridVisible, XMLVN({"DefaultsVideo"}, 1080), Category("Defaults Video"), DisplayName("Default definition"),
|
||||||
Description("The default maximum video resolution. -1 for max definition")>
|
Description("The default maximum video resolution. -1 for max definition")>
|
||||||
Public ReadOnly Property DefaultVideoDefinition As XMLValue(Of Integer)
|
Public ReadOnly Property DefaultVideoDefinition As XMLValue(Of Integer)
|
||||||
|
<Browsable(True), GridVisible, XMLVN({"DefaultsVideo"}), Category("Defaults Video"), DisplayName("Include zero size formats"),
|
||||||
|
Description("Include formats with zero size (or undefined size).")>
|
||||||
|
Public ReadOnly Property DefaultVideoIncludeNullSize As XMLValue(Of Boolean)
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Defaults Audio"
|
#Region "Defaults Audio"
|
||||||
<Browsable(True), GridVisible, XMLVN({"DefaultsAudio"}, "AAC"), Category("Defaults Audio"), DisplayName("Default codec"),
|
<Browsable(True), GridVisible, XMLVN({"DefaultsAudio"}, "AAC"), Category("Defaults Audio"), DisplayName("Default codec"),
|
||||||
@@ -230,7 +301,17 @@ Namespace API.YouTube.Base
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Initializer"
|
#Region "Initializer"
|
||||||
Public Sub New()
|
Public Sub New()
|
||||||
XML = New XmlFile(YouTubeSettingsFile,, False) With {.AutoUpdateFile = True}
|
Me.New(String.Empty)
|
||||||
|
End Sub
|
||||||
|
Public Sub New(ByVal AccountName As String)
|
||||||
|
Me.AccountName = AccountName
|
||||||
|
DownloadLocations = New DownloadLocationsCollection
|
||||||
|
DownloadLocations.Load(False, True)
|
||||||
|
Dim acc$ = String.Empty
|
||||||
|
If Not AccountName.IsEmptyString Then acc = $"_{AccountName}"
|
||||||
|
Dim f As SFile = YouTubeSettingsFile
|
||||||
|
f.Name &= acc
|
||||||
|
XML = New XmlFile(f,, False) With {.AutoUpdateFile = True}
|
||||||
XML.LoadData(EDP.None)
|
XML.LoadData(EDP.None)
|
||||||
DesignXml = New XmlFile("Settings\DesignDownloader.xml", Protector.Modes.All, False)
|
DesignXml = New XmlFile("Settings\DesignDownloader.xml", Protector.Modes.All, False)
|
||||||
DesignXml.LoadData(EDP.None)
|
DesignXml.LoadData(EDP.None)
|
||||||
@@ -238,7 +319,9 @@ Namespace API.YouTube.Base
|
|||||||
AddHandler ShowNotificationsEveryDownload.TempValueChanged, AddressOf ShowNotificationsEveryDownload_TempValueChanged
|
AddHandler ShowNotificationsEveryDownload.TempValueChanged, AddressOf ShowNotificationsEveryDownload_TempValueChanged
|
||||||
Cookies = New CookieKeeper
|
Cookies = New CookieKeeper
|
||||||
Grid.Abstract.DesignerXmlSource.Add(New Grid.Abstract.DesignerXmlData(GetType(CookieListForm2), DesignXml, "CookiesListForm"))
|
Grid.Abstract.DesignerXmlSource.Add(New Grid.Abstract.DesignerXmlData(GetType(CookieListForm2), DesignXml, "CookiesListForm"))
|
||||||
If YouTubeCookieNetscapeFile.Exists Then Cookies.AddRange(CookieKeeper.ParseNetscapeText(YouTubeCookieNetscapeFile.GetText(EDP.ReturnValue), EDP.None),, EDP.None)
|
f = YouTubeCookieNetscapeFile
|
||||||
|
f.Name &= acc
|
||||||
|
If f.Exists Then Cookies.AddRange(CookieKeeper.ParseNetscapeText(f.GetText(EDP.ReturnValue), EDP.None),, EDP.None)
|
||||||
If Not YTDLP.Value.Exists Then YTDLP.Value = ProgramPath("yt-dlp.exe")
|
If Not YTDLP.Value.Exists Then YTDLP.Value = ProgramPath("yt-dlp.exe")
|
||||||
If Not FFMPEG.Value.Exists Then FFMPEG.Value = ProgramPath("ffmpeg.exe")
|
If Not FFMPEG.Value.Exists Then FFMPEG.Value = ProgramPath("ffmpeg.exe")
|
||||||
If Not OutputPath.Value.Exists(SFO.Path, False) Then OutputPath.Value = YouTubeDownloadPathDefault
|
If Not OutputPath.Value.Exists(SFO.Path, False) Then OutputPath.Value = YouTubeDownloadPathDefault
|
||||||
|
|||||||
BIN
SCrawler.YouTube/Content/Pictures/MailPic_16.png
Normal file
|
After Width: | Height: | Size: 209 B |
BIN
SCrawler.YouTube/Content/Pictures/StartPic_Green_16.png
Normal file
|
After Width: | Height: | Size: 373 B |
@@ -41,6 +41,10 @@ Namespace API.YouTube.Controls
|
|||||||
Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton10 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ListColumn1 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
|
Dim ListColumn2 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
Dim TT_MAIN As System.Windows.Forms.ToolTip
|
Dim TT_MAIN As System.Windows.Forms.ToolTip
|
||||||
Me.BTT_DOWN = New System.Windows.Forms.Button()
|
Me.BTT_DOWN = New System.Windows.Forms.Button()
|
||||||
Me.BTT_CANCEL = New System.Windows.Forms.Button()
|
Me.BTT_CANCEL = New System.Windows.Forms.Button()
|
||||||
@@ -53,7 +57,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.CMB_FORMATS = New System.Windows.Forms.ComboBox()
|
Me.CMB_FORMATS = New System.Windows.Forms.ComboBox()
|
||||||
Me.TXT_SUBS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_SUBS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.CH_DOWN_LYRICS = New System.Windows.Forms.CheckBox()
|
Me.CH_DOWN_LYRICS = New System.Windows.Forms.CheckBox()
|
||||||
Me.TXT_OUTPUT_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_OUTPUT_PATH = New PersonalUtilities.Forms.Controls.ComboBoxExtended()
|
||||||
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
||||||
TP_BUTTONS = New System.Windows.Forms.TableLayoutPanel()
|
TP_BUTTONS = New System.Windows.Forms.TableLayoutPanel()
|
||||||
TP_PLS = New System.Windows.Forms.TableLayoutPanel()
|
TP_PLS = New System.Windows.Forms.TableLayoutPanel()
|
||||||
@@ -408,18 +412,45 @@ Namespace API.YouTube.Controls
|
|||||||
ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image)
|
ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton7.Name = "Open"
|
ActionButton7.Name = "Open"
|
||||||
ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
||||||
|
ActionButton7.ToolTipText = "Choose a new location (Ctrl+O)"
|
||||||
ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image)
|
ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton8.Name = "Clear"
|
ActionButton8.Name = "Add"
|
||||||
ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Add
|
||||||
|
ActionButton8.ToolTipText = "Choose a new location and add it to the list (Alt+O)"
|
||||||
|
ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton9.Name = "Clear"
|
||||||
|
ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton10.Name = "ArrowDown"
|
||||||
|
ActionButton10.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown
|
||||||
Me.TXT_OUTPUT_PATH.Buttons.Add(ActionButton7)
|
Me.TXT_OUTPUT_PATH.Buttons.Add(ActionButton7)
|
||||||
Me.TXT_OUTPUT_PATH.Buttons.Add(ActionButton8)
|
Me.TXT_OUTPUT_PATH.Buttons.Add(ActionButton8)
|
||||||
|
Me.TXT_OUTPUT_PATH.Buttons.Add(ActionButton9)
|
||||||
|
Me.TXT_OUTPUT_PATH.Buttons.Add(ActionButton10)
|
||||||
|
Me.TXT_OUTPUT_PATH.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox
|
||||||
Me.TXT_OUTPUT_PATH.CaptionText = "Output path"
|
Me.TXT_OUTPUT_PATH.CaptionText = "Output path"
|
||||||
|
Me.TXT_OUTPUT_PATH.CaptionToolTipEnabled = True
|
||||||
|
Me.TXT_OUTPUT_PATH.CaptionToolTipText = "If this checkbox is selected, this path is absolute and artist folder will not be" &
|
||||||
|
" created in it"
|
||||||
|
Me.TXT_OUTPUT_PATH.CaptionVisible = True
|
||||||
Me.TXT_OUTPUT_PATH.CaptionWidth = 112.0R
|
Me.TXT_OUTPUT_PATH.CaptionWidth = 112.0R
|
||||||
|
Me.TXT_OUTPUT_PATH.ChangeControlsEnableOnCheckedChange = False
|
||||||
|
ListColumn1.Name = "COL_NAME"
|
||||||
|
ListColumn1.Text = "Name"
|
||||||
|
ListColumn1.Width = -1
|
||||||
|
ListColumn2.DisplayMember = True
|
||||||
|
ListColumn2.Name = "COL_VALUE"
|
||||||
|
ListColumn2.Text = "Value"
|
||||||
|
ListColumn2.ValueMember = True
|
||||||
|
ListColumn2.Visible = False
|
||||||
|
Me.TXT_OUTPUT_PATH.Columns.Add(ListColumn1)
|
||||||
|
Me.TXT_OUTPUT_PATH.Columns.Add(ListColumn2)
|
||||||
Me.TXT_OUTPUT_PATH.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TXT_OUTPUT_PATH.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TXT_OUTPUT_PATH.Location = New System.Drawing.Point(3, 59)
|
Me.TXT_OUTPUT_PATH.Location = New System.Drawing.Point(3, 59)
|
||||||
Me.TXT_OUTPUT_PATH.Name = "TXT_OUTPUT_PATH"
|
Me.TXT_OUTPUT_PATH.Name = "TXT_OUTPUT_PATH"
|
||||||
Me.TXT_OUTPUT_PATH.Size = New System.Drawing.Size(428, 22)
|
Me.TXT_OUTPUT_PATH.Size = New System.Drawing.Size(428, 22)
|
||||||
Me.TXT_OUTPUT_PATH.TabIndex = 2
|
Me.TXT_OUTPUT_PATH.TabIndex = 2
|
||||||
|
Me.TXT_OUTPUT_PATH.TextBoxBorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
|
||||||
'
|
'
|
||||||
'MusicPlaylistsForm
|
'MusicPlaylistsForm
|
||||||
'
|
'
|
||||||
@@ -464,6 +495,6 @@ Namespace API.YouTube.Controls
|
|||||||
Private WithEvents CMB_FORMATS As ComboBox
|
Private WithEvents CMB_FORMATS As ComboBox
|
||||||
Private WithEvents SPLITTER_MAIN As SplitContainer
|
Private WithEvents SPLITTER_MAIN As SplitContainer
|
||||||
Private WithEvents CH_DOWN_LYRICS As CheckBox
|
Private WithEvents CH_DOWN_LYRICS As CheckBox
|
||||||
Private WithEvents TXT_OUTPUT_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended
|
Private WithEvents TXT_OUTPUT_PATH As PersonalUtilities.Forms.Controls.ComboBoxExtended
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -233,11 +233,123 @@
|
|||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton8.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton8.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
||||||
|
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE
|
||||||
|
QVRIS62WWWxMURjHL220JW1HausmlFrDFKUhnUGH6bRFzJ2idImlC0Vp2mlji1A8iNhCPIjIRES8EU+W
|
||||||
|
h2oEtbSDTk3HNNM7S01VKsXjkb/vXBo3k1Ee7sMvmZzzzf//ne/+z50RAAxL1MUIG4G/YAv3HSVhF5Vw
|
||||||
|
IYNdz3LadVj9RgdTB+HQYYPHIJuE1ocSdlEJFzG+1bPRLQLinglIeCkg+XUkKvz56hnkOfQs/rmA8S9H
|
||||||
|
YEp7FDI64tAQtKhnsMapZ7zzNHsUFnbGY4VzIk70l6hnIH4wsDR7NBZ3apDrSqL5T8eFgUr1DLZ78lim
|
||||||
|
Q4N8VzK29MxEpZSBa4M16hnU+c3M9CEFpdJsVHsXos63DDcHrf9nQEXD5VymwW/5USLNwl5vJhp7dTgW
|
||||||
|
NML2pR7jbsUMS+KdMTa5Q8NQxinfBU4dRFcOyjy52OtbhwOBDTgZLKPPmTgY0ON4MBdNfSbYBupxY8Aq
|
||||||
|
G10dqMG5/nIc7ytGQ6CQRliAamkTN/g1Ai4e95Qy3iogpX0UtBRDnhRzdxq2SXOxz5eFQ70rScCEU335
|
||||||
|
ssGxj0YS06HSm4GN3ekwdE2C1hGH1LZR0JDOJof5jwHvnIvzTa0jlooTYfktvt+fhcOBHDQFTWRgxJGP
|
||||||
|
ObAGsulZLMLWnjlY756K5c4JmNcRi6T2SGheCIihS2l5ozAo6NRhMolnUAcGV6IcwwqvFrX+JTjYuwKH
|
||||||
|
SfRAYDms/mzs9y1GFe2VSnOw1j0FejqpLN4WCX4ZufiIBwLMLxQGm12rsLQzgWKYgmLPLNTQw6ynpDSS
|
||||||
|
IBet8y+TqaVRVdFIeJrWuCcj+/0EzH43BomvIhBLI45uFiDcJ+6QwROFwa6+Amb9bGFNg6Xs9Ncd7Oy3
|
||||||
|
Knb2eyU7/20nu9y/m136tIvEl6BC0qKoZwby3alo9JVhj7T5R7m/kJVIIityi8zyXmTiW+I10SqyIQNb
|
||||||
|
uIgNwYuuf25kFd75KPKkI49OmUWnrfYWyXv/wBb2cijhhVf6a9lGei65XclYRDd6mj0GWz2iLBJaH0rY
|
||||||
|
RSVc5Eywmhm7kuQXHX+bJlBStrh+zTi0PpSwi0q4yNFAOVvgiEcKJWUsxZn/NhT+znlofShhF5VwkRpv
|
||||||
|
MUtti4KGYjj6sYCIh5QSu4oG27stjItHU+cjeQzvkcFzFQ2KnSKLoc4FukDCXeI2GbSoaFD4ziyPxNxK
|
||||||
|
0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton9.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton10.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
|
AAAASUVORK5CYII=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
' but WITHOUT ANY WARRANTY
|
' but WITHOUT ANY WARRANTY
|
||||||
Imports System.ComponentModel
|
Imports System.ComponentModel
|
||||||
Imports SCrawler.API.YouTube.Objects
|
Imports SCrawler.API.YouTube.Objects
|
||||||
|
Imports SCrawler.DownloadObjects.STDownloader
|
||||||
Imports PersonalUtilities.Forms
|
Imports PersonalUtilities.Forms
|
||||||
Imports PersonalUtilities.Forms.Controls
|
Imports PersonalUtilities.Forms.Controls
|
||||||
Imports PersonalUtilities.Forms.Controls.Base
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
@@ -50,6 +51,8 @@ Namespace API.YouTube.Controls
|
|||||||
MyView.SetFormSize()
|
MyView.SetFormSize()
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
MyYouTubeSettings.DownloadLocations.PopulateComboBox(TXT_OUTPUT_PATH)
|
||||||
|
|
||||||
CMB_FORMATS.Items.AddRange(AvailableAudioFormats)
|
CMB_FORMATS.Items.AddRange(AvailableAudioFormats)
|
||||||
If MyYouTubeSettings.PlaylistFormSplitterDistance > 0 Then SPLITTER_MAIN.SplitterDistancePercentageSet(MyYouTubeSettings.PlaylistFormSplitterDistance)
|
If MyYouTubeSettings.PlaylistFormSplitterDistance > 0 Then SPLITTER_MAIN.SplitterDistancePercentageSet(MyYouTubeSettings.PlaylistFormSplitterDistance)
|
||||||
|
|
||||||
@@ -77,10 +80,26 @@ Namespace API.YouTube.Controls
|
|||||||
End If
|
End If
|
||||||
LIST_PLAYLISTS.SelectedIndex = 0
|
LIST_PLAYLISTS.SelectedIndex = 0
|
||||||
|
|
||||||
|
If .ObjectType = Base.YouTubeMediaType.Channel Then
|
||||||
|
With TXT_OUTPUT_PATH
|
||||||
|
.CaptionMode = ICaptionControl.Modes.Label
|
||||||
|
.CaptionToolTipText = String.Empty
|
||||||
|
.CaptionToolTipEnabled = False
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
|
||||||
TXT_OUTPUT_PATH.Text = MyYouTubeSettings.OutputPath.Value
|
TXT_OUTPUT_PATH.Text = MyYouTubeSettings.OutputPath.Value
|
||||||
|
|
||||||
If Not .UserTitle.IsEmptyString Then
|
If Not .UserTitle.IsEmptyString Then
|
||||||
Text = .UserTitle
|
Text = .UserTitle
|
||||||
|
If .ObjectType = Base.YouTubeMediaType.PlayList Then
|
||||||
|
If Not .PlaylistTitle.IsEmptyString AndAlso Not .PlaylistTitle = .UserTitle Then
|
||||||
|
Text &= $" - { .PlaylistTitle}"
|
||||||
|
ElseIf Not .Title.IsEmptyString AndAlso Not .Title = .UserTitle Then
|
||||||
|
Text &= $" - { .Title}"
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
If Not TXT_OUTPUT_PATH.IsEmptyString AndAlso Not TXT_OUTPUT_PATH.Text.Contains(.UserTitle) Then TXT_OUTPUT_PATH.Text = $"{TXT_OUTPUT_PATH.Text.TrimEnd("\")}\{ .UserTitle}\"
|
||||||
ElseIf Not .PlaylistTitle.IsEmptyString Then
|
ElseIf Not .PlaylistTitle.IsEmptyString Then
|
||||||
Text = .PlaylistTitle
|
Text = .PlaylistTitle
|
||||||
End If
|
End If
|
||||||
@@ -94,6 +113,17 @@ Namespace API.YouTube.Controls
|
|||||||
MyYouTubeSettings.PlaylistFormSplitterDistance.Value = SPLITTER_MAIN.SplitterDistancePercentageGet
|
MyYouTubeSettings.PlaylistFormSplitterDistance.Value = SPLITTER_MAIN.SplitterDistancePercentageGet
|
||||||
MyView.DisposeIfReady()
|
MyView.DisposeIfReady()
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub MusicPlaylistsForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
||||||
|
Dim b As Boolean = True
|
||||||
|
If e.KeyCode = Keys.O And e.Control Then
|
||||||
|
MyYouTubeSettings.DownloadLocations.ChooseNewLocation(TXT_OUTPUT_PATH, False, MyDownloaderSettings.OutputPathAskForName)
|
||||||
|
ElseIf e.KeyCode = Keys.O And e.Alt Then
|
||||||
|
MyYouTubeSettings.DownloadLocations.ChooseNewLocation(TXT_OUTPUT_PATH, True, MyDownloaderSettings.OutputPathAskForName)
|
||||||
|
Else
|
||||||
|
b = False
|
||||||
|
End If
|
||||||
|
If b Then e.Handled = True
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Form text"
|
#Region "Form text"
|
||||||
Private _InitialFormText As String = String.Empty
|
Private _InitialFormText As String = String.Empty
|
||||||
@@ -151,10 +181,8 @@ Namespace API.YouTube.Controls
|
|||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub TXT_OUTPUT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles TXT_OUTPUT_PATH.ActionOnButtonClick
|
Private Sub TXT_OUTPUT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles TXT_OUTPUT_PATH.ActionOnButtonClick
|
||||||
If Sender.DefaultButton = ADB.Open Then
|
If Sender.DefaultButton = ADB.Open Or Sender.DefaultButton = ADB.Add Then _
|
||||||
Dim f As SFile = SFile.SelectPath(TXT_OUTPUT_PATH.Text, "Select files destination", EDP.ReturnValue)
|
MyYouTubeSettings.DownloadLocations.ChooseNewLocation(TXT_OUTPUT_PATH, Sender.DefaultButton = ADB.Add, MyDownloaderSettings.OutputPathAskForName)
|
||||||
If Not f.IsEmptyString Then TXT_OUTPUT_PATH.Text = f
|
|
||||||
End If
|
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Lists' handlers"
|
#Region "Lists' handlers"
|
||||||
@@ -246,8 +274,10 @@ Namespace API.YouTube.Controls
|
|||||||
If Not TXT_SUBS.Checked Then .PostProcessing_OutputSubtitlesFormats.Clear()
|
If Not TXT_SUBS.Checked Then .PostProcessing_OutputSubtitlesFormats.Clear()
|
||||||
.OutputAudioCodec = CMB_FORMATS.Text
|
.OutputAudioCodec = CMB_FORMATS.Text
|
||||||
If Not TXT_FORMATS_ADDIT.Checked Then .PostProcessing_OutputAudioFormats.Clear()
|
If Not TXT_FORMATS_ADDIT.Checked Then .PostProcessing_OutputAudioFormats.Clear()
|
||||||
|
.AbsolutePath = TXT_OUTPUT_PATH.Checked
|
||||||
.File = TXT_OUTPUT_PATH.Text.CSFileP
|
.File = TXT_OUTPUT_PATH.Text.CSFileP
|
||||||
If MyYouTubeSettings.OutputPathAutoChange Then MyYouTubeSettings.OutputPath.Value = .File
|
If MyYouTubeSettings.OutputPathAutoChange Then MyYouTubeSettings.OutputPath.Value = .File
|
||||||
|
If MyDownloaderSettings.OutputPathAutoAddPaths Then MyYouTubeSettings.DownloadLocations.Add(.File, False)
|
||||||
End With
|
End With
|
||||||
DialogResult = DialogResult.OK
|
DialogResult = DialogResult.OK
|
||||||
Close()
|
Close()
|
||||||
|
|||||||
@@ -82,7 +82,6 @@ Namespace API.YouTube.Controls
|
|||||||
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
||||||
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
|
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
|
||||||
Me.Text = "Parsing progress"
|
Me.Text = "Parsing progress"
|
||||||
Me.TopMost = True
|
|
||||||
TP_MAIN.ResumeLayout(False)
|
TP_MAIN.ResumeLayout(False)
|
||||||
TP_MAIN.PerformLayout()
|
TP_MAIN.PerformLayout()
|
||||||
Me.ResumeLayout(False)
|
Me.ResumeLayout(False)
|
||||||
|
|||||||
@@ -17,9 +17,27 @@ Namespace API.YouTube.Controls
|
|||||||
Return TokenSource.Token
|
Return TokenSource.Token
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Public Sub New()
|
Private ReadOnly CountMax As Integer
|
||||||
|
Private CountCurrent As Integer = 1
|
||||||
|
Friend Sub NextPlaylist()
|
||||||
|
CountCurrent += 1
|
||||||
|
MyProgress.InformationTemporary(True) = InfoStr
|
||||||
|
MyProgress.Information = InfoStr
|
||||||
|
End Sub
|
||||||
|
Private ReadOnly Property InfoStr As String
|
||||||
|
Get
|
||||||
|
Const MainMsg$ = "Data parsing in progress"
|
||||||
|
If CountMax > 1 Then
|
||||||
|
Return $"{MainMsg} [{CountCurrent - 1}/{CountMax}]"
|
||||||
|
Else
|
||||||
|
Return MainMsg
|
||||||
|
End If
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Public Sub New(Optional ByVal _Count As Integer = 1)
|
||||||
InitializeComponent()
|
InitializeComponent()
|
||||||
MyProgress = New MyProgress(PR_MAIN, LBL_MAIN, "Data parsing in progress") With {.ResetProgressOnMaximumChanges = False}
|
CountMax = _Count
|
||||||
|
MyProgress = New MyProgress(PR_MAIN, LBL_MAIN, InfoStr) With {.ResetProgressOnMaximumChanges = False}
|
||||||
TokenSource = New CancellationTokenSource
|
TokenSource = New CancellationTokenSource
|
||||||
End Sub
|
End Sub
|
||||||
Public Sub SetInitialValues(ByVal Count As Integer, ByVal Info As String)
|
Public Sub SetInitialValues(ByVal Count As Integer, ByVal Info As String)
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ Namespace API.YouTube.Controls
|
|||||||
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
||||||
Dim FRM_PLS As System.Windows.Forms.GroupBox
|
Dim FRM_PLS As System.Windows.Forms.GroupBox
|
||||||
Me.CH_PLS_ONE = New System.Windows.Forms.CheckBox()
|
Me.CH_PLS_ONE = New System.Windows.Forms.CheckBox()
|
||||||
Me.TXT_URLS = New System.Windows.Forms.RichTextBox()
|
Me.TXT_URLS = New System.Windows.Forms.TextBox()
|
||||||
CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
||||||
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
||||||
FRM_PLS = New System.Windows.Forms.GroupBox()
|
FRM_PLS = New System.Windows.Forms.GroupBox()
|
||||||
@@ -94,13 +94,14 @@ Namespace API.YouTube.Controls
|
|||||||
'
|
'
|
||||||
'TXT_URLS
|
'TXT_URLS
|
||||||
'
|
'
|
||||||
Me.TXT_URLS.DetectUrls = False
|
Me.TXT_URLS.AcceptsReturn = True
|
||||||
Me.TXT_URLS.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TXT_URLS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TXT_URLS.Location = New System.Drawing.Point(3, 16)
|
Me.TXT_URLS.Location = New System.Drawing.Point(3, 16)
|
||||||
|
Me.TXT_URLS.MaxLength = 2147483647
|
||||||
|
Me.TXT_URLS.Multiline = True
|
||||||
Me.TXT_URLS.Name = "TXT_URLS"
|
Me.TXT_URLS.Name = "TXT_URLS"
|
||||||
Me.TXT_URLS.Size = New System.Drawing.Size(372, 261)
|
Me.TXT_URLS.Size = New System.Drawing.Size(372, 261)
|
||||||
Me.TXT_URLS.TabIndex = 0
|
Me.TXT_URLS.TabIndex = 0
|
||||||
Me.TXT_URLS.Text = ""
|
|
||||||
'
|
'
|
||||||
'PlaylistArrayForm
|
'PlaylistArrayForm
|
||||||
'
|
'
|
||||||
@@ -119,10 +120,11 @@ Namespace API.YouTube.Controls
|
|||||||
TP_MAIN.ResumeLayout(False)
|
TP_MAIN.ResumeLayout(False)
|
||||||
TP_MAIN.PerformLayout()
|
TP_MAIN.PerformLayout()
|
||||||
FRM_PLS.ResumeLayout(False)
|
FRM_PLS.ResumeLayout(False)
|
||||||
|
FRM_PLS.PerformLayout()
|
||||||
Me.ResumeLayout(False)
|
Me.ResumeLayout(False)
|
||||||
|
|
||||||
End Sub
|
End Sub
|
||||||
Private WithEvents CH_PLS_ONE As CheckBox
|
Private WithEvents CH_PLS_ONE As CheckBox
|
||||||
Private WithEvents TXT_URLS As RichTextBox
|
Private WithEvents TXT_URLS As TextBox
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -52,6 +52,7 @@ Namespace API.YouTube.Controls
|
|||||||
End If
|
End If
|
||||||
LBL_DEFINITION.Text = $"{m.Height}p"
|
LBL_DEFINITION.Text = $"{m.Height}p"
|
||||||
LBL_CODECS.Text = $"{m.Extension.StringToUpper}{d}{m.Codec.StringToUpper}{d}{m.FPS}fps{d}{m.Bitrate}k"
|
LBL_CODECS.Text = $"{m.Extension.StringToUpper}{d}{m.Codec.StringToUpper}{d}{m.FPS}fps{d}{m.Bitrate}k"
|
||||||
|
If Not m.Protocol.IsEmptyString Then LBL_CODECS.Text &= $" ({m.Protocol})"
|
||||||
If Not SelectedAudio.ID.IsEmptyString Then LBL_CODECS.Text &= $" / {SelectedAudio.Extension}{d}{SelectedAudio.Codec}{d}{SelectedAudio.Bitrate}k"
|
If Not SelectedAudio.ID.IsEmptyString Then LBL_CODECS.Text &= $" / {SelectedAudio.Extension}{d}{SelectedAudio.Codec}{d}{SelectedAudio.Bitrate}k"
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
|||||||
108
SCrawler.YouTube/Controls/VideoOptionsForm.Designer.vb
generated
@@ -29,6 +29,10 @@ Namespace API.YouTube.Controls
|
|||||||
Dim ICON_LINK As System.Windows.Forms.PictureBox
|
Dim ICON_LINK As System.Windows.Forms.PictureBox
|
||||||
Dim TP_FOOTER As System.Windows.Forms.TableLayoutPanel
|
Dim TP_FOOTER As System.Windows.Forms.TableLayoutPanel
|
||||||
Dim TP_DESTINATION As System.Windows.Forms.TableLayoutPanel
|
Dim TP_DESTINATION As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(VideoOptionsForm))
|
||||||
|
Dim ListColumn1 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
|
Dim ListColumn2 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
Dim TP_OK_CANCEL As System.Windows.Forms.TableLayoutPanel
|
Dim TP_OK_CANCEL As System.Windows.Forms.TableLayoutPanel
|
||||||
Dim LB_SEP_1 As System.Windows.Forms.Label
|
Dim LB_SEP_1 As System.Windows.Forms.Label
|
||||||
Dim LB_SEP_2 As System.Windows.Forms.Label
|
Dim LB_SEP_2 As System.Windows.Forms.Label
|
||||||
@@ -37,8 +41,6 @@ Namespace API.YouTube.Controls
|
|||||||
Dim LBL_FORMAT As System.Windows.Forms.Label
|
Dim LBL_FORMAT As System.Windows.Forms.Label
|
||||||
Dim LBL_SUBS_FORMAT As System.Windows.Forms.Label
|
Dim LBL_SUBS_FORMAT As System.Windows.Forms.Label
|
||||||
Dim TT_MAIN As System.Windows.Forms.ToolTip
|
Dim TT_MAIN As System.Windows.Forms.ToolTip
|
||||||
Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
|
||||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(VideoOptionsForm))
|
|
||||||
Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
@@ -47,12 +49,13 @@ Namespace API.YouTube.Controls
|
|||||||
Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton10 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
Me.ICON_VIDEO = New System.Windows.Forms.PictureBox()
|
Me.ICON_VIDEO = New System.Windows.Forms.PictureBox()
|
||||||
Me.LBL_TITLE = New System.Windows.Forms.Label()
|
Me.LBL_TITLE = New System.Windows.Forms.Label()
|
||||||
Me.TP_HEADER_INFO_2 = New System.Windows.Forms.TableLayoutPanel()
|
Me.TP_HEADER_INFO_2 = New System.Windows.Forms.TableLayoutPanel()
|
||||||
Me.LBL_TIME = New System.Windows.Forms.Label()
|
Me.LBL_TIME = New System.Windows.Forms.Label()
|
||||||
Me.LBL_URL = New System.Windows.Forms.LinkLabel()
|
Me.LBL_URL = New System.Windows.Forms.LinkLabel()
|
||||||
Me.TXT_FILE = New System.Windows.Forms.TextBox()
|
Me.TXT_FILE = New PersonalUtilities.Forms.Controls.ComboBoxExtended()
|
||||||
Me.BTT_BROWSE = New System.Windows.Forms.Button()
|
Me.BTT_BROWSE = New System.Windows.Forms.Button()
|
||||||
Me.BTT_DOWN = New System.Windows.Forms.Button()
|
Me.BTT_DOWN = New System.Windows.Forms.Button()
|
||||||
Me.BTT_CANCEL = New System.Windows.Forms.Button()
|
Me.BTT_CANCEL = New System.Windows.Forms.Button()
|
||||||
@@ -93,6 +96,7 @@ Namespace API.YouTube.Controls
|
|||||||
CType(ICON_LINK, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(ICON_LINK, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
TP_FOOTER.SuspendLayout()
|
TP_FOOTER.SuspendLayout()
|
||||||
TP_DESTINATION.SuspendLayout()
|
TP_DESTINATION.SuspendLayout()
|
||||||
|
CType(Me.TXT_FILE, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
TP_OK_CANCEL.SuspendLayout()
|
TP_OK_CANCEL.SuspendLayout()
|
||||||
TP_WHAT.SuspendLayout()
|
TP_WHAT.SuspendLayout()
|
||||||
Me.TP_HEADER_BASE.SuspendLayout()
|
Me.TP_HEADER_BASE.SuspendLayout()
|
||||||
@@ -267,12 +271,28 @@ Namespace API.YouTube.Controls
|
|||||||
'
|
'
|
||||||
'TXT_FILE
|
'TXT_FILE
|
||||||
'
|
'
|
||||||
|
ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton1.Name = "ArrowDown"
|
||||||
|
ActionButton1.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown
|
||||||
|
Me.TXT_FILE.Buttons.Add(ActionButton1)
|
||||||
|
Me.TXT_FILE.ChangeControlsEnableOnCheckedChange = False
|
||||||
|
ListColumn1.Name = "COL_NAME"
|
||||||
|
ListColumn1.Text = "Name"
|
||||||
|
ListColumn1.Width = -1
|
||||||
|
ListColumn2.DisplayMember = True
|
||||||
|
ListColumn2.Name = "COL_VALUE"
|
||||||
|
ListColumn2.Text = "Value"
|
||||||
|
ListColumn2.ValueMember = True
|
||||||
|
ListColumn2.Visible = False
|
||||||
|
Me.TXT_FILE.Columns.Add(ListColumn1)
|
||||||
|
Me.TXT_FILE.Columns.Add(ListColumn2)
|
||||||
Me.TXT_FILE.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TXT_FILE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TXT_FILE.Location = New System.Drawing.Point(3, 3)
|
Me.TXT_FILE.Location = New System.Drawing.Point(1, 1)
|
||||||
|
Me.TXT_FILE.Margin = New System.Windows.Forms.Padding(1)
|
||||||
Me.TXT_FILE.Name = "TXT_FILE"
|
Me.TXT_FILE.Name = "TXT_FILE"
|
||||||
Me.TXT_FILE.Size = New System.Drawing.Size(503, 20)
|
Me.TXT_FILE.Size = New System.Drawing.Size(507, 22)
|
||||||
Me.TXT_FILE.TabIndex = 0
|
Me.TXT_FILE.TabIndex = 0
|
||||||
Me.TXT_FILE.WordWrap = False
|
Me.TXT_FILE.TextBoxBorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
|
||||||
'
|
'
|
||||||
'BTT_BROWSE
|
'BTT_BROWSE
|
||||||
'
|
'
|
||||||
@@ -283,7 +303,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.BTT_BROWSE.Size = New System.Drawing.Size(74, 22)
|
Me.BTT_BROWSE.Size = New System.Drawing.Size(74, 22)
|
||||||
Me.BTT_BROWSE.TabIndex = 1
|
Me.BTT_BROWSE.TabIndex = 1
|
||||||
Me.BTT_BROWSE.Text = "Browse"
|
Me.BTT_BROWSE.Text = "Browse"
|
||||||
TT_MAIN.SetToolTip(Me.BTT_BROWSE, "Choose an output file")
|
TT_MAIN.SetToolTip(Me.BTT_BROWSE, "Choose an output file (Right click for add a new location to the list)")
|
||||||
Me.BTT_BROWSE.UseVisualStyleBackColor = True
|
Me.BTT_BROWSE.UseVisualStyleBackColor = True
|
||||||
'
|
'
|
||||||
'TP_OK_CANCEL
|
'TP_OK_CANCEL
|
||||||
@@ -473,21 +493,21 @@ Namespace API.YouTube.Controls
|
|||||||
'
|
'
|
||||||
'TXT_SUBS
|
'TXT_SUBS
|
||||||
'
|
'
|
||||||
ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image)
|
|
||||||
ActionButton1.Name = "Open"
|
|
||||||
ActionButton1.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
|
||||||
ActionButton1.ToolTipText = "Choose subtitles"
|
|
||||||
ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image)
|
ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton2.Name = "Refresh"
|
ActionButton2.Name = "Open"
|
||||||
ActionButton2.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
ActionButton2.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
||||||
ActionButton2.ToolTipText = "Reset subtitles to initial selected"
|
ActionButton2.ToolTipText = "Choose subtitles"
|
||||||
ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image)
|
ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton3.Name = "Clear"
|
ActionButton3.Name = "Refresh"
|
||||||
ActionButton3.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
ActionButton3.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
||||||
ActionButton3.ToolTipText = "Clear subtitles selection (don't download subtitles)"
|
ActionButton3.ToolTipText = "Reset subtitles to initial selected"
|
||||||
Me.TXT_SUBS.Buttons.Add(ActionButton1)
|
ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton4.Name = "Clear"
|
||||||
|
ActionButton4.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton4.ToolTipText = "Clear subtitles selection (don't download subtitles)"
|
||||||
Me.TXT_SUBS.Buttons.Add(ActionButton2)
|
Me.TXT_SUBS.Buttons.Add(ActionButton2)
|
||||||
Me.TXT_SUBS.Buttons.Add(ActionButton3)
|
Me.TXT_SUBS.Buttons.Add(ActionButton3)
|
||||||
|
Me.TXT_SUBS.Buttons.Add(ActionButton4)
|
||||||
Me.TXT_SUBS.CaptionText = "Subtitles"
|
Me.TXT_SUBS.CaptionText = "Subtitles"
|
||||||
Me.TXT_SUBS.CaptionToolTipEnabled = True
|
Me.TXT_SUBS.CaptionToolTipEnabled = True
|
||||||
Me.TXT_SUBS.CaptionToolTipText = "The selected subtitles will also be downloaded"
|
Me.TXT_SUBS.CaptionToolTipText = "The selected subtitles will also be downloaded"
|
||||||
@@ -611,24 +631,24 @@ Namespace API.YouTube.Controls
|
|||||||
'
|
'
|
||||||
'TXT_SUBS_ADDIT
|
'TXT_SUBS_ADDIT
|
||||||
'
|
'
|
||||||
ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image)
|
|
||||||
ActionButton4.Enabled = False
|
|
||||||
ActionButton4.Name = "Open"
|
|
||||||
ActionButton4.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
|
||||||
ActionButton4.ToolTipText = "Choose additional formats"
|
|
||||||
ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image)
|
ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton5.Enabled = False
|
ActionButton5.Enabled = False
|
||||||
ActionButton5.Name = "Refresh"
|
ActionButton5.Name = "Open"
|
||||||
ActionButton5.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
ActionButton5.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
||||||
ActionButton5.ToolTipText = "Fill in additional formats from the defaults"
|
ActionButton5.ToolTipText = "Choose additional formats"
|
||||||
ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image)
|
ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton6.Enabled = False
|
ActionButton6.Enabled = False
|
||||||
ActionButton6.Name = "Clear"
|
ActionButton6.Name = "Refresh"
|
||||||
ActionButton6.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
ActionButton6.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
||||||
ActionButton6.ToolTipText = "Remove all additional formats"
|
ActionButton6.ToolTipText = "Fill in additional formats from the defaults"
|
||||||
Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton4)
|
ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton7.Enabled = False
|
||||||
|
ActionButton7.Name = "Clear"
|
||||||
|
ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton7.ToolTipText = "Remove all additional formats"
|
||||||
Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton5)
|
Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton5)
|
||||||
Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton6)
|
Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton6)
|
||||||
|
Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton7)
|
||||||
Me.TXT_SUBS_ADDIT.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox
|
Me.TXT_SUBS_ADDIT.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox
|
||||||
Me.TXT_SUBS_ADDIT.CaptionText = "Additional subtitle formats"
|
Me.TXT_SUBS_ADDIT.CaptionText = "Additional subtitle formats"
|
||||||
Me.TXT_SUBS_ADDIT.CaptionToolTipEnabled = True
|
Me.TXT_SUBS_ADDIT.CaptionToolTipEnabled = True
|
||||||
@@ -646,24 +666,24 @@ Namespace API.YouTube.Controls
|
|||||||
'
|
'
|
||||||
'TXT_EXTRA_AUDIO_FORMATS
|
'TXT_EXTRA_AUDIO_FORMATS
|
||||||
'
|
'
|
||||||
ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image)
|
|
||||||
ActionButton7.Enabled = False
|
|
||||||
ActionButton7.Name = "Open"
|
|
||||||
ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
|
||||||
ActionButton7.ToolTipText = "Choose additional formats"
|
|
||||||
ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image)
|
ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton8.Enabled = False
|
ActionButton8.Enabled = False
|
||||||
ActionButton8.Name = "Refresh"
|
ActionButton8.Name = "Open"
|
||||||
ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
||||||
ActionButton8.ToolTipText = "Fill in additional formats from the defaults"
|
ActionButton8.ToolTipText = "Choose additional formats"
|
||||||
ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image)
|
ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton9.Enabled = False
|
ActionButton9.Enabled = False
|
||||||
ActionButton9.Name = "Clear"
|
ActionButton9.Name = "Refresh"
|
||||||
ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
||||||
ActionButton9.ToolTipText = "Choose additional formats"
|
ActionButton9.ToolTipText = "Fill in additional formats from the defaults"
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton7)
|
ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton10.Enabled = False
|
||||||
|
ActionButton10.Name = "Clear"
|
||||||
|
ActionButton10.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton10.ToolTipText = "Choose additional formats"
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton8)
|
Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton8)
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton9)
|
Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton9)
|
||||||
|
Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton10)
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox
|
Me.TXT_EXTRA_AUDIO_FORMATS.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.CaptionText = "Additional audio formats"
|
Me.TXT_EXTRA_AUDIO_FORMATS.CaptionText = "Additional audio formats"
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.CaptionToolTipEnabled = True
|
Me.TXT_EXTRA_AUDIO_FORMATS.CaptionToolTipEnabled = True
|
||||||
@@ -704,7 +724,7 @@ Namespace API.YouTube.Controls
|
|||||||
CType(ICON_LINK, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(ICON_LINK, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
TP_FOOTER.ResumeLayout(False)
|
TP_FOOTER.ResumeLayout(False)
|
||||||
TP_DESTINATION.ResumeLayout(False)
|
TP_DESTINATION.ResumeLayout(False)
|
||||||
TP_DESTINATION.PerformLayout()
|
CType(Me.TXT_FILE, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
TP_OK_CANCEL.ResumeLayout(False)
|
TP_OK_CANCEL.ResumeLayout(False)
|
||||||
TP_WHAT.ResumeLayout(False)
|
TP_WHAT.ResumeLayout(False)
|
||||||
TP_WHAT.PerformLayout()
|
TP_WHAT.PerformLayout()
|
||||||
@@ -740,7 +760,7 @@ Namespace API.YouTube.Controls
|
|||||||
Private WithEvents CMB_SUBS_FORMAT As ComboBox
|
Private WithEvents CMB_SUBS_FORMAT As ComboBox
|
||||||
Private WithEvents TXT_SUBS_ADDIT As PersonalUtilities.Forms.Controls.TextBoxExtended
|
Private WithEvents TXT_SUBS_ADDIT As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
Private WithEvents TXT_EXTRA_AUDIO_FORMATS As PersonalUtilities.Forms.Controls.TextBoxExtended
|
Private WithEvents TXT_EXTRA_AUDIO_FORMATS As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
Private WithEvents TXT_FILE As TextBox
|
Private WithEvents TXT_FILE As PersonalUtilities.Forms.Controls.ComboBoxExtended
|
||||||
Private WithEvents BTT_BROWSE As Button
|
Private WithEvents BTT_BROWSE As Button
|
||||||
Private WithEvents BTT_DOWN As Button
|
Private WithEvents BTT_DOWN As Button
|
||||||
Private WithEvents BTT_CANCEL As Button
|
Private WithEvents BTT_CANCEL As Button
|
||||||
|
|||||||
@@ -135,6 +135,97 @@
|
|||||||
<metadata name="TP_DESTINATION.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="TP_DESTINATION.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
|
<data name="ActionButton1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
|
AAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
<metadata name="TT_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="TT_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
@@ -162,8 +253,7 @@
|
|||||||
<metadata name="LBL_SUBS_FORMAT.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="LBL_SUBS_FORMAT.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<data name="ActionButton2.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<data name="ActionButton1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
@@ -174,7 +264,7 @@
|
|||||||
cMaRN0UdBBkAAAAASUVORK5CYII=
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton2.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton3.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
||||||
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
||||||
@@ -188,17 +278,17 @@
|
|||||||
HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74
|
HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74
|
||||||
qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG
|
qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG
|
||||||
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="ActionButton3.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
|
||||||
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
|
||||||
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
|
||||||
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton4.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton4.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton5.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
@@ -209,7 +299,7 @@
|
|||||||
cMaRN0UdBBkAAAAASUVORK5CYII=
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton5.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton6.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
||||||
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
||||||
@@ -225,7 +315,7 @@
|
|||||||
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton6.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton7.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
@@ -233,7 +323,7 @@
|
|||||||
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton7.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton8.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
@@ -244,7 +334,7 @@
|
|||||||
cMaRN0UdBBkAAAAASUVORK5CYII=
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton8.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton9.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
||||||
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
||||||
@@ -260,7 +350,7 @@
|
|||||||
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton9.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton10.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ Namespace API.YouTube.Controls
|
|||||||
MyView.SetFormSize()
|
MyView.SetFormSize()
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
MyYouTubeSettings.DownloadLocations.PopulateComboBox(TXT_FILE)
|
||||||
|
|
||||||
If Not MyContainer Is Nothing Then
|
If Not MyContainer Is Nothing Then
|
||||||
With MyContainer
|
With MyContainer
|
||||||
Dim i%
|
Dim i%
|
||||||
@@ -74,6 +76,12 @@ Namespace API.YouTube.Controls
|
|||||||
If Not def.ValueBetween(-1, 10000) Then def = 1080
|
If Not def.ValueBetween(-1, 10000) Then def = 1080
|
||||||
End If
|
End If
|
||||||
NUM_RES.Value = def
|
NUM_RES.Value = def
|
||||||
|
With TXT_FILE
|
||||||
|
.CaptionMode = ICaptionControl.Modes.CheckBox
|
||||||
|
.CaptionWidth = 18
|
||||||
|
.CaptionToolTipText = "If this checkbox is selected, this path is absolute and artist folder will not be created in it"
|
||||||
|
.CaptionToolTipEnabled = True
|
||||||
|
End With
|
||||||
Else
|
Else
|
||||||
TP_OPTIONS.Controls.Remove(NUM_RES)
|
TP_OPTIONS.Controls.Remove(NUM_RES)
|
||||||
TP_OPTIONS.ColumnStyles(3).Width = 0
|
TP_OPTIONS.ColumnStyles(3).Width = 0
|
||||||
@@ -295,11 +303,11 @@ Namespace API.YouTube.Controls
|
|||||||
.SelectedVideoIndex = -1
|
.SelectedVideoIndex = -1
|
||||||
.SelectedAudioIndex = cntIndex
|
.SelectedAudioIndex = cntIndex
|
||||||
End If
|
End If
|
||||||
.File = f
|
|
||||||
.FileSetManually = True
|
.FileSetManually = True
|
||||||
|
.File = f
|
||||||
.UpdateInfoFields()
|
.UpdateInfoFields()
|
||||||
'#If DEBUG Then
|
'#If DEBUG Then
|
||||||
' Debug.WriteLine(.Command(False))
|
'Debug.WriteLine(.Command(False))
|
||||||
'#End If
|
'#End If
|
||||||
Else
|
Else
|
||||||
If OPT_AUDIO.Checked Then
|
If OPT_AUDIO.Checked Then
|
||||||
@@ -307,11 +315,13 @@ Namespace API.YouTube.Controls
|
|||||||
Else
|
Else
|
||||||
.SetMaxResolution(NUM_RES.Value)
|
.SetMaxResolution(NUM_RES.Value)
|
||||||
End If
|
End If
|
||||||
|
.AbsolutePath = TXT_FILE.Checked
|
||||||
.File = f
|
.File = f
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
|
|
||||||
If MyYouTubeSettings.OutputPathAutoChange Then MyYouTubeSettings.OutputPath.Value = f
|
If MyYouTubeSettings.OutputPathAutoChange Then MyYouTubeSettings.OutputPath.Value = f
|
||||||
|
If MyDownloaderSettings.OutputPathAutoAddPaths Then MyYouTubeSettings.DownloadLocations.Add(f, False)
|
||||||
|
|
||||||
DialogResult = DialogResult.OK
|
DialogResult = DialogResult.OK
|
||||||
Close()
|
Close()
|
||||||
@@ -430,7 +440,28 @@ Namespace API.YouTube.Controls
|
|||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Footer"
|
#Region "Footer"
|
||||||
Private Sub BTT_BROWSE_Click(sender As Object, e As EventArgs) Handles BTT_BROWSE.Click
|
Private _FilePathBeforeItemChange As SFile = Nothing
|
||||||
|
Private Sub TXT_FILE_ActionSelectedItemBeforeChanged(ByVal Sender As Object, ByVal e As EventArgs, ByVal Item As ListViewItem) Handles TXT_FILE.ActionSelectedItemBeforeChanged
|
||||||
|
If Not TXT_FILE.Text.IsEmptyString Then _FilePathBeforeItemChange = TXT_FILE.Text Else _FilePathBeforeItemChange = Nothing
|
||||||
|
End Sub
|
||||||
|
Private Sub TXT_FILE_ActionSelectedItemChanged(ByVal Sender As Object, ByVal e As EventArgs, ByVal Item As ListViewItem) Handles TXT_FILE.ActionSelectedItemChanged
|
||||||
|
Try
|
||||||
|
If Not MyContainer.HasElements Then
|
||||||
|
Dim currentPath As SFile = _FilePathBeforeItemChange
|
||||||
|
Dim newPath As SFile = TXT_FILE.Text.CSFileP
|
||||||
|
If Not currentPath.File.IsEmptyString Then
|
||||||
|
newPath.Name = currentPath.Name
|
||||||
|
newPath.Extension = currentPath.Extension
|
||||||
|
TXT_FILE.Text = newPath
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[API.YouTube.Controls.VideoOptionsForm.ChangeDestinationPath]")
|
||||||
|
Finally
|
||||||
|
_FilePathBeforeItemChange = Nothing
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_BROWSE_MouseDown(sender As Object, e As MouseEventArgs) Handles BTT_BROWSE.MouseDown
|
||||||
Dim f As SFile
|
Dim f As SFile
|
||||||
#Disable Warning BC40000
|
#Disable Warning BC40000
|
||||||
If MyContainer.HasElements Then
|
If MyContainer.HasElements Then
|
||||||
@@ -444,7 +475,13 @@ Namespace API.YouTube.Controls
|
|||||||
f = SFile.SaveAs(f, "Select the destination of the video file",,, sPattern, EDP.ReturnValue)
|
f = SFile.SaveAs(f, "Select the destination of the video file",,, sPattern, EDP.ReturnValue)
|
||||||
End If
|
End If
|
||||||
#Enable Warning
|
#Enable Warning
|
||||||
If Not f.IsEmptyString Then TXT_FILE.Text = f
|
If Not f.IsEmptyString Then
|
||||||
|
If e.Button = MouseButtons.Right Then
|
||||||
|
MyYouTubeSettings.DownloadLocations.Add(f, MyDownloaderSettings.OutputPathAskForName)
|
||||||
|
MyYouTubeSettings.DownloadLocations.PopulateComboBox(TXT_FILE, f)
|
||||||
|
End If
|
||||||
|
TXT_FILE.Text = f
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#End Region
|
#End Region
|
||||||
|
|||||||
204
SCrawler.YouTube/Downloader/DownloadLocationsCollection.vb
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
' 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
|
||||||
|
Imports PersonalUtilities.Functions.XML
|
||||||
|
Imports PersonalUtilities.Functions.XML.Base
|
||||||
|
Imports PersonalUtilities.Functions.XML.Attributes
|
||||||
|
Imports PersonalUtilities.Forms.Controls
|
||||||
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
|
Imports PersonalUtilities.Tools
|
||||||
|
Namespace DownloadObjects.STDownloader
|
||||||
|
Public Structure DownloadLocation : Implements IComparable(Of DownloadLocation), IEquatable(Of DownloadLocation), IEContainerProvider
|
||||||
|
<XMLECA(NameOf(Path))> Public Name As String
|
||||||
|
<XMLEC> Public Path As String
|
||||||
|
<XMLECA(NameOf(Path), NullValue:=-1, NullValueExists:=True)>
|
||||||
|
Public Model As Integer
|
||||||
|
''' <param name="Path">with separator</param>
|
||||||
|
Public Sub New(ByVal Path As String)
|
||||||
|
Me.New(Path, -1)
|
||||||
|
End Sub
|
||||||
|
''' <inheritdoc cref="DownloadLocation.New(String)"/>
|
||||||
|
Public Sub New(ByVal Path As String, ByVal Model As Integer)
|
||||||
|
Me.Path = Path
|
||||||
|
Me.Model = Model
|
||||||
|
End Sub
|
||||||
|
Public Shared Widening Operator CType(ByVal Path As String) As DownloadLocation
|
||||||
|
Return New DownloadLocation(Path)
|
||||||
|
End Operator
|
||||||
|
Public Shared Narrowing Operator CType(ByVal Path As SFile) As DownloadLocation
|
||||||
|
Return New DownloadLocation(Path.PathWithSeparator)
|
||||||
|
End Operator
|
||||||
|
Public Shared Widening Operator CType(ByVal Location As DownloadLocation) As String
|
||||||
|
Return Location.Path
|
||||||
|
End Operator
|
||||||
|
Public Overrides Function ToString() As String
|
||||||
|
Return Path
|
||||||
|
End Function
|
||||||
|
Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean
|
||||||
|
If Not IsNothing(Obj) Then
|
||||||
|
If TypeOf Obj Is DownloadLocation Then
|
||||||
|
Return Equals(DirectCast(Obj, DownloadLocation))
|
||||||
|
Else
|
||||||
|
Return Obj.ToString = Path
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Public Overloads Function Equals(ByVal Other As DownloadLocation) As Boolean Implements IEquatable(Of DownloadLocation).Equals
|
||||||
|
Return Path = Other.Path And Model = Other.Model
|
||||||
|
End Function
|
||||||
|
Private Function ToEContainer(Optional ByVal e As ErrorsDescriber = Nothing) As EContainer Implements IEContainerProvider.ToEContainer
|
||||||
|
Return XMLGenerateContainers(Me).FirstOrDefault
|
||||||
|
End Function
|
||||||
|
Private Function CompareTo(ByVal Other As DownloadLocation) As Integer Implements IComparable(Of DownloadLocation).CompareTo
|
||||||
|
Return Name.CompareTo(Other.Name)
|
||||||
|
End Function
|
||||||
|
End Structure
|
||||||
|
Public Class DownloadLocationsCollection : Implements ICollection(Of DownloadLocation), IMyEnumerator(Of DownloadLocation)
|
||||||
|
Private ReadOnly Property Locations As List(Of DownloadLocation)
|
||||||
|
Private WorkingFile As SFile
|
||||||
|
Public Sub New()
|
||||||
|
Locations = New List(Of DownloadLocation)
|
||||||
|
End Sub
|
||||||
|
Public Sub Load(ByVal IsGlobal As Boolean, Optional ByVal IsYT As Boolean = False, Optional ByVal File As SFile = Nothing)
|
||||||
|
If Not IsGlobal Then
|
||||||
|
WorkingFile = $"Settings\DownloadLocations{IIf(IsYT, "YouTube", String.Empty)}.xml"
|
||||||
|
ElseIf Not File.IsEmptyString Then
|
||||||
|
WorkingFile = File
|
||||||
|
Else
|
||||||
|
Throw New ArgumentNullException("File", "File cannot be null in global locations instance")
|
||||||
|
End If
|
||||||
|
If WorkingFile.Exists Then
|
||||||
|
Using x As New XmlFile(WorkingFile, Protector.Modes.All, False) With {.AllowSameNames = True}
|
||||||
|
x.LoadData()
|
||||||
|
Locations.ListAddList(x.XMLGenerateInstances(Of DownloadLocation), LAP.NotContainsOnly)
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private ReadOnly Property IsReadOnly As Boolean = False Implements ICollection(Of DownloadLocation).IsReadOnly
|
||||||
|
Public ReadOnly Property Count As Integer Implements ICollection(Of DownloadLocation).Count, IMyEnumerator(Of DownloadLocation).MyEnumeratorCount
|
||||||
|
Get
|
||||||
|
Return Locations.Count
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Default Public ReadOnly Property Item(ByVal Index As Integer) As DownloadLocation Implements IMyEnumerator(Of DownloadLocation).MyEnumeratorObject
|
||||||
|
Get
|
||||||
|
Return Locations(Index)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Public Shared Sub AddCmbColumns(ByRef CMB As ComboBoxExtended, Optional ByVal UseUpdate As Boolean = True)
|
||||||
|
With CMB
|
||||||
|
If UseUpdate Then .BeginUpdate()
|
||||||
|
With .Columns
|
||||||
|
.Clear()
|
||||||
|
.Add(New ListColumn("COL_NAME", "Name") With {.DisplayMember = False, .ValueMember = False, .AutoWidth = True, .Width = -1})
|
||||||
|
.Add(New ListColumn("COL_VALUE", "Value") With {.DisplayMember = True, .ValueMember = True, .Visible = False})
|
||||||
|
End With
|
||||||
|
If UseUpdate Then .EndUpdate(True)
|
||||||
|
End With
|
||||||
|
End Sub
|
||||||
|
Public Sub PopulateComboBox(ByRef CMB As ComboBoxExtended, Optional ByVal Current As SFile = Nothing)
|
||||||
|
Locations.Sort()
|
||||||
|
With CMB
|
||||||
|
.BeginUpdate()
|
||||||
|
|
||||||
|
If .Columns.Count = 0 Then AddCmbColumns(CMB, False)
|
||||||
|
|
||||||
|
.Items.Clear()
|
||||||
|
|
||||||
|
If Count > 0 Then
|
||||||
|
.Items.AddRange(Locations.Select(Function(l) New ListItem({l.Name, l.Path})))
|
||||||
|
.LeaveDefaultButtons = True
|
||||||
|
Else
|
||||||
|
.LeaveDefaultButtons = False
|
||||||
|
End If
|
||||||
|
|
||||||
|
.ListAutoCompleteMode = ComboBoxExtended.AutoCompleteModes.Disabled
|
||||||
|
|
||||||
|
.EndUpdate()
|
||||||
|
|
||||||
|
If Not Current.IsEmptyString And Locations.Count > 0 Then
|
||||||
|
Dim i% = IndexOf(Current.PathWithSeparator)
|
||||||
|
If i.ValueBetween(0, .Items.Count - 1) Then .SelectedIndex = i
|
||||||
|
If Current.File.IsEmptyString Then CMB.Text = Current.PathWithSeparator Else CMB.Text = Current
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End Sub
|
||||||
|
Public Function ChooseNewLocation(ByRef CMB As ComboBoxExtended, ByVal AddToList As Boolean, ByVal AskForName As Boolean) As SFile
|
||||||
|
Dim f As SFile = SFile.SelectPath(CMB.Text.CSFileP, "Select output directory", EDP.ReturnValue)
|
||||||
|
If Not f.IsEmptyString Then
|
||||||
|
CMB.Text = f.PathWithSeparator
|
||||||
|
If AddToList Then
|
||||||
|
Add(New DownloadLocation(f.PathWithSeparator), AskForName)
|
||||||
|
PopulateComboBox(CMB, f)
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Return f
|
||||||
|
End Function
|
||||||
|
Private Sub Update()
|
||||||
|
If Locations.Count > 0 Then
|
||||||
|
Using x As New XmlFile With {.AllowSameNames = True}
|
||||||
|
x.AddRange(Locations)
|
||||||
|
x.Name = "Locations"
|
||||||
|
x.Save(WorkingFile, EDP.SendToLog)
|
||||||
|
End Using
|
||||||
|
Else
|
||||||
|
WorkingFile.Delete(,, EDP.None)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Public Sub Clear() Implements ICollection(Of DownloadLocation).Clear
|
||||||
|
If Locations.Count > 0 Then Locations.Clear() : Update()
|
||||||
|
End Sub
|
||||||
|
Public Overloads Sub Add(ByVal Item As DownloadLocation) Implements ICollection(Of DownloadLocation).Add
|
||||||
|
Add(Item, True)
|
||||||
|
End Sub
|
||||||
|
Public Overloads Sub Add(ByVal Item As DownloadLocation, ByVal AskForName As Boolean)
|
||||||
|
If Not Item.Path.IsEmptyString Then
|
||||||
|
Dim i% = IndexOf(Item)
|
||||||
|
Dim processUpdate As Boolean = True
|
||||||
|
If i >= 0 Then
|
||||||
|
If Locations(i).Model = Item.Model Then
|
||||||
|
processUpdate = False
|
||||||
|
Else
|
||||||
|
Locations(i) = Item
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
If Item.Name.IsEmptyString And AskForName Then Item.Name = InputBoxE("Enter a new name for the new location", "Location name", Item.Path)
|
||||||
|
If Item.Name.IsEmptyString Then Item.Name = Item.Path
|
||||||
|
Locations.Add(Item)
|
||||||
|
Locations.Sort()
|
||||||
|
End If
|
||||||
|
If processUpdate Then Update()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub CopyTo(ByVal Array() As DownloadLocation, ByVal ArrayIndex As Integer) Implements ICollection(Of DownloadLocation).CopyTo
|
||||||
|
Locations.CopyTo(Array, ArrayIndex)
|
||||||
|
End Sub
|
||||||
|
Public Function Contains(ByVal Item As DownloadLocation) As Boolean Implements ICollection(Of DownloadLocation).Contains
|
||||||
|
Return Not Item.Path.IsEmptyString AndAlso Locations.Contains(Item)
|
||||||
|
End Function
|
||||||
|
Public Function IndexOf(ByVal Item As DownloadLocation, Optional ByVal IgnoreModel As Boolean = False) As Integer
|
||||||
|
Return Locations.FindIndex(Function(d) d.Path = Item.Path And (d.Model = Item.Model Or IgnoreModel))
|
||||||
|
End Function
|
||||||
|
Public Function Remove(ByVal Item As DownloadLocation) As Boolean Implements ICollection(Of DownloadLocation).Remove
|
||||||
|
If Locations.Remove(Item) Then
|
||||||
|
Update()
|
||||||
|
Return True
|
||||||
|
Else
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Private Function GetEnumerator() As IEnumerator(Of DownloadLocation) Implements IEnumerable(Of DownloadLocation).GetEnumerator
|
||||||
|
Return New MyEnumerator(Of DownloadLocation)(Me)
|
||||||
|
End Function
|
||||||
|
Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
|
||||||
|
Return GetEnumerator()
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
@@ -16,5 +16,12 @@ Namespace DownloadObjects.STDownloader
|
|||||||
ReadOnly Property OnItemDoubleClick As DoubleClickBehavior
|
ReadOnly Property OnItemDoubleClick As DoubleClickBehavior
|
||||||
ReadOnly Property OpenFolderInOtherProgram As Boolean
|
ReadOnly Property OpenFolderInOtherProgram As Boolean
|
||||||
ReadOnly Property OpenFolderInOtherProgram_Command As String
|
ReadOnly Property OpenFolderInOtherProgram_Command As String
|
||||||
|
ReadOnly Property OutputPathAskForName As Boolean
|
||||||
|
ReadOnly Property OutputPathAutoAddPaths As Boolean
|
||||||
|
ReadOnly Property CreateUrlFiles As Boolean
|
||||||
|
ReadOnly Property ENVIR_FFMPEG As SFile
|
||||||
|
ReadOnly Property ENVIR_YTDLP As SFile
|
||||||
|
ReadOnly Property ENVIR_GDL As SFile
|
||||||
|
ReadOnly Property ENVIR_CURL As SFile
|
||||||
End Interface
|
End Interface
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -115,31 +115,36 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.New
|
Me.New
|
||||||
Const d$ = " " & ChrW(183) & " "
|
Const d$ = " " & ChrW(183) & " "
|
||||||
MyContainer = Container
|
MyContainer = Container
|
||||||
MyContainer.Progress = MyProgress
|
With MyContainer
|
||||||
If MyContainer.HasElements Then FileOption = SFO.Path Else FileOption = SFO.File
|
.Progress = MyProgress
|
||||||
If Not MyContainer.SiteKey = YouTubeSiteKey Then
|
If .HasElements Then FileOption = SFO.Path Else FileOption = SFO.File
|
||||||
|
If .DownloadState = Plugin.UserMediaStates.Downloaded AndAlso
|
||||||
|
(.ObjectType = Base.YouTubeMediaType.Channel Or .ObjectType = Base.YouTubeMediaType.PlayList) AndAlso FileOption = SFO.File AndAlso
|
||||||
|
Not .File.Exists AndAlso .File.Exists(SFO.Path, False) Then FileOption = SFO.Path
|
||||||
|
If Not .SiteKey = YouTubeSiteKey Then
|
||||||
BTT_DOWN_AGAIN.Visible = False
|
BTT_DOWN_AGAIN.Visible = False
|
||||||
SEP_DOWN_AGAIN.Visible = False
|
SEP_DOWN_AGAIN.Visible = False
|
||||||
End If
|
End If
|
||||||
|
|
||||||
ICON_SITE.Image = MyContainer.SiteIcon
|
ICON_SITE.Image = .SiteIcon
|
||||||
LBL_TIME.Text = AConvert(Of String)(Container.Duration, TimeToStringProvider, String.Empty)
|
LBL_TIME.Text = AConvert(Of String)(.Duration, TimeToStringProvider, String.Empty)
|
||||||
LBL_TITLE.Text = Container.ToString(True)
|
LBL_TITLE.Text = .ToString(True)
|
||||||
If Not Container.SiteKey = YouTubeSiteKey And Container.ContentType = Plugin.UserMediaTypes.Picture Then
|
If Not .SiteKey = YouTubeSiteKey And .ContentType = Plugin.UserMediaTypes.Picture Then
|
||||||
LBL_INFO.Text = Container.File.Extension.StringToUpper
|
LBL_INFO.Text = .File.Extension.StringToUpper
|
||||||
ElseIf Not Container.IsMusic Then
|
ElseIf Not .IsMusic Then
|
||||||
If Container.Height > 0 Then
|
If .Height > 0 Then
|
||||||
LBL_INFO.Text = $"{Container.File.Extension.StringToUpper}{d}{Container.Height}p"
|
LBL_INFO.Text = $"{ .File.Extension.StringToUpper}{d}{ .Height}p"
|
||||||
Else
|
Else
|
||||||
LBL_INFO.Text = Container.File.Extension.StringToUpper
|
LBL_INFO.Text = .File.Extension.StringToUpper
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
If Container.Bitrate > 0 Then
|
If .Bitrate > 0 Then
|
||||||
LBL_INFO.Text = $"{Container.File.Extension.StringToUpper}{d}{Container.Bitrate}k"
|
LBL_INFO.Text = $"{ .File.Extension.StringToUpper}{d}{ .Bitrate}k"
|
||||||
Else
|
Else
|
||||||
LBL_INFO.Text = Container.File.Extension.StringToUpper
|
LBL_INFO.Text = .File.Extension.StringToUpper
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
|
End With
|
||||||
UpdateMediaIcon()
|
UpdateMediaIcon()
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
@@ -277,6 +282,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
#Region "Context buttons' handlers"
|
#Region "Context buttons' handlers"
|
||||||
Public Sub AddToQueue()
|
Public Sub AddToQueue()
|
||||||
ControlInvokeFast(Me, Sub()
|
ControlInvokeFast(Me, Sub()
|
||||||
|
Pending = True
|
||||||
BTT_DOWN.Visible = False
|
BTT_DOWN.Visible = False
|
||||||
SEP_DOWN.Visible = False
|
SEP_DOWN.Visible = False
|
||||||
End Sub, EDP.None)
|
End Sub, EDP.None)
|
||||||
@@ -300,6 +306,8 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Throw oex
|
Throw oex
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ErrorsDescriber.Execute(EDP.SendToLog, ex, $"MediaItem.Download:{vbCr}{MyContainer.ToString}{vbCr}{MyContainer.URL})")
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, $"MediaItem.Download:{vbCr}{MyContainer.ToString}{vbCr}{MyContainer.URL})")
|
||||||
|
Finally
|
||||||
|
Pending = False
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
@@ -367,12 +375,12 @@ Namespace DownloadObjects.STDownloader
|
|||||||
If FileOption = SFO.File And MyContainer.File.Exists(SFO.File, False) Then
|
If FileOption = SFO.File And MyContainer.File.Exists(SFO.File, False) Then
|
||||||
MyContainer.File.Open(SFO.File,, EDP.ShowMainMsg)
|
MyContainer.File.Open(SFO.File,, EDP.ShowMainMsg)
|
||||||
ElseIf MyContainer.File.Exists(SFO.Path, False) Then
|
ElseIf MyContainer.File.Exists(SFO.Path, False) Then
|
||||||
MyContainer.File.Open(SFO.Path,, EDP.ShowMainMsg)
|
GlobalOpenPath(MyContainer.File, EDP.ShowMainMsg)
|
||||||
Else
|
Else
|
||||||
m.Show()
|
m.Show()
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
If MyContainer.File.Exists(SFO.Path, False) Then MyContainer.File.Open(SFO.Path,, EDP.ShowMainMsg) Else m.Show()
|
If MyContainer.File.Exists(SFO.Path, False) Then GlobalOpenPath(MyContainer.File, EDP.ShowMainMsg) Else m.Show()
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
OnDoubleClick(e)
|
OnDoubleClick(e)
|
||||||
|
|||||||
127
SCrawler.YouTube/Downloader/VideoListForm.Designer.vb
generated
@@ -25,7 +25,13 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Dim SEP_2 As System.Windows.Forms.ToolStripSeparator
|
Dim SEP_2 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim SEP_3 As System.Windows.Forms.ToolStripSeparator
|
Dim SEP_3 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim MENU_ADD_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
Dim MENU_ADD_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Dim MENU_DEL_CLEAR As System.Windows.Forms.ToolStripDropDownButton
|
||||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(VideoListForm))
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(VideoListForm))
|
||||||
|
Dim MENU_DEL_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Me.BTT_DELETE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_CLEAR_SELECTED = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_CLEAR_DONE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_CLEAR_ALL = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.TOOLBAR_BOTTOM = New System.Windows.Forms.StatusStrip()
|
Me.TOOLBAR_BOTTOM = New System.Windows.Forms.StatusStrip()
|
||||||
Me.PR_MAIN = New System.Windows.Forms.ToolStripProgressBar()
|
Me.PR_MAIN = New System.Windows.Forms.ToolStripProgressBar()
|
||||||
Me.LBL_INFO = New System.Windows.Forms.ToolStripStatusLabel()
|
Me.LBL_INFO = New System.Windows.Forms.ToolStripStatusLabel()
|
||||||
@@ -40,16 +46,16 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.BTT_ADD_SHORTS_ONLY = New PersonalUtilities.Forms.Controls.KeyClick.ToolStripMenuItemKeyClick()
|
Me.BTT_ADD_SHORTS_ONLY = New PersonalUtilities.Forms.Controls.KeyClick.ToolStripMenuItemKeyClick()
|
||||||
Me.BTT_DOWN = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_DOWN = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_STOP = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_STOP = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_DELETE = New System.Windows.Forms.ToolStripButton()
|
|
||||||
Me.BTT_CLEAR_DONE = New System.Windows.Forms.ToolStripButton()
|
|
||||||
Me.BTT_CLEAR_ALL = New System.Windows.Forms.ToolStripButton()
|
|
||||||
Me.SEP_LOG = New System.Windows.Forms.ToolStripSeparator()
|
Me.SEP_LOG = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.BTT_LOG = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_LOG = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_INFO = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_INFO = New System.Windows.Forms.ToolStripButton()
|
||||||
Me.BTT_DONATE = New System.Windows.Forms.ToolStripButton()
|
Me.BTT_DONATE = New System.Windows.Forms.ToolStripButton()
|
||||||
|
Me.BTT_BUG_REPORT = New System.Windows.Forms.ToolStripButton()
|
||||||
SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
SEP_3 = New System.Windows.Forms.ToolStripSeparator()
|
SEP_3 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
MENU_ADD_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
MENU_ADD_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
|
MENU_DEL_CLEAR = New System.Windows.Forms.ToolStripDropDownButton()
|
||||||
|
MENU_DEL_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.TOOLBAR_BOTTOM.SuspendLayout()
|
Me.TOOLBAR_BOTTOM.SuspendLayout()
|
||||||
Me.TOOLBAR_TOP.SuspendLayout()
|
Me.TOOLBAR_TOP.SuspendLayout()
|
||||||
Me.SuspendLayout()
|
Me.SuspendLayout()
|
||||||
@@ -69,6 +75,59 @@ Namespace DownloadObjects.STDownloader
|
|||||||
MENU_ADD_SEP_1.Name = "MENU_ADD_SEP_1"
|
MENU_ADD_SEP_1.Name = "MENU_ADD_SEP_1"
|
||||||
MENU_ADD_SEP_1.Size = New System.Drawing.Size(181, 6)
|
MENU_ADD_SEP_1.Size = New System.Drawing.Size(181, 6)
|
||||||
'
|
'
|
||||||
|
'MENU_DEL_CLEAR
|
||||||
|
'
|
||||||
|
MENU_DEL_CLEAR.AutoToolTip = False
|
||||||
|
MENU_DEL_CLEAR.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_DELETE, MENU_DEL_SEP_1, Me.BTT_CLEAR_SELECTED, Me.BTT_CLEAR_DONE, Me.BTT_CLEAR_ALL})
|
||||||
|
MENU_DEL_CLEAR.Image = CType(resources.GetObject("MENU_DEL_CLEAR.Image"), System.Drawing.Image)
|
||||||
|
MENU_DEL_CLEAR.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
|
MENU_DEL_CLEAR.Name = "MENU_DEL_CLEAR"
|
||||||
|
MENU_DEL_CLEAR.Size = New System.Drawing.Size(107, 22)
|
||||||
|
MENU_DEL_CLEAR.Text = "Delete / Clear"
|
||||||
|
'
|
||||||
|
'BTT_DELETE
|
||||||
|
'
|
||||||
|
Me.BTT_DELETE.Image = CType(resources.GetObject("BTT_DELETE.Image"), System.Drawing.Image)
|
||||||
|
Me.BTT_DELETE.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
|
Me.BTT_DELETE.Name = "BTT_DELETE"
|
||||||
|
Me.BTT_DELETE.Size = New System.Drawing.Size(185, 22)
|
||||||
|
Me.BTT_DELETE.Text = "Delete selected items"
|
||||||
|
Me.BTT_DELETE.ToolTipText = "Delete selected items"
|
||||||
|
'
|
||||||
|
'MENU_DEL_SEP_1
|
||||||
|
'
|
||||||
|
MENU_DEL_SEP_1.Name = "MENU_DEL_SEP_1"
|
||||||
|
MENU_DEL_SEP_1.Size = New System.Drawing.Size(182, 6)
|
||||||
|
'
|
||||||
|
'BTT_CLEAR_SELECTED
|
||||||
|
'
|
||||||
|
Me.BTT_CLEAR_SELECTED.AutoToolTip = True
|
||||||
|
Me.BTT_CLEAR_SELECTED.Image = CType(resources.GetObject("BTT_CLEAR_SELECTED.Image"), System.Drawing.Image)
|
||||||
|
Me.BTT_CLEAR_SELECTED.Name = "BTT_CLEAR_SELECTED"
|
||||||
|
Me.BTT_CLEAR_SELECTED.Size = New System.Drawing.Size(185, 22)
|
||||||
|
Me.BTT_CLEAR_SELECTED.Text = "Clear selected"
|
||||||
|
Me.BTT_CLEAR_SELECTED.ToolTipText = "Remove all checked items from the list"
|
||||||
|
'
|
||||||
|
'BTT_CLEAR_DONE
|
||||||
|
'
|
||||||
|
Me.BTT_CLEAR_DONE.AutoToolTip = True
|
||||||
|
Me.BTT_CLEAR_DONE.Image = CType(resources.GetObject("BTT_CLEAR_DONE.Image"), System.Drawing.Image)
|
||||||
|
Me.BTT_CLEAR_DONE.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
|
Me.BTT_CLEAR_DONE.Name = "BTT_CLEAR_DONE"
|
||||||
|
Me.BTT_CLEAR_DONE.Size = New System.Drawing.Size(185, 22)
|
||||||
|
Me.BTT_CLEAR_DONE.Text = "Clear downloaded"
|
||||||
|
Me.BTT_CLEAR_DONE.ToolTipText = "Remove all downloaded items from the list"
|
||||||
|
'
|
||||||
|
'BTT_CLEAR_ALL
|
||||||
|
'
|
||||||
|
Me.BTT_CLEAR_ALL.AutoToolTip = True
|
||||||
|
Me.BTT_CLEAR_ALL.Image = CType(resources.GetObject("BTT_CLEAR_ALL.Image"), System.Drawing.Image)
|
||||||
|
Me.BTT_CLEAR_ALL.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
|
Me.BTT_CLEAR_ALL.Name = "BTT_CLEAR_ALL"
|
||||||
|
Me.BTT_CLEAR_ALL.Size = New System.Drawing.Size(185, 22)
|
||||||
|
Me.BTT_CLEAR_ALL.Text = "Clear all"
|
||||||
|
Me.BTT_CLEAR_ALL.ToolTipText = "Remove all items from the list"
|
||||||
|
'
|
||||||
'TOOLBAR_BOTTOM
|
'TOOLBAR_BOTTOM
|
||||||
'
|
'
|
||||||
Me.TOOLBAR_BOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_MAIN, Me.LBL_INFO})
|
Me.TOOLBAR_BOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_MAIN, Me.LBL_INFO})
|
||||||
@@ -104,7 +163,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
'TOOLBAR_TOP
|
'TOOLBAR_TOP
|
||||||
'
|
'
|
||||||
Me.TOOLBAR_TOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
|
Me.TOOLBAR_TOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
|
||||||
Me.TOOLBAR_TOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_SETTINGS, Me.SEP_1, Me.MENU_ADD, SEP_2, Me.BTT_DOWN, Me.BTT_STOP, SEP_3, Me.BTT_DELETE, Me.BTT_CLEAR_DONE, Me.BTT_CLEAR_ALL, Me.SEP_LOG, Me.BTT_LOG, Me.BTT_INFO, Me.BTT_DONATE})
|
Me.TOOLBAR_TOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_SETTINGS, Me.SEP_1, Me.MENU_ADD, SEP_2, Me.BTT_DOWN, Me.BTT_STOP, SEP_3, MENU_DEL_CLEAR, Me.SEP_LOG, Me.BTT_LOG, Me.BTT_INFO, Me.BTT_DONATE, Me.BTT_BUG_REPORT})
|
||||||
Me.TOOLBAR_TOP.Location = New System.Drawing.Point(0, 0)
|
Me.TOOLBAR_TOP.Location = New System.Drawing.Point(0, 0)
|
||||||
Me.TOOLBAR_TOP.Name = "TOOLBAR_TOP"
|
Me.TOOLBAR_TOP.Name = "TOOLBAR_TOP"
|
||||||
Me.TOOLBAR_TOP.Size = New System.Drawing.Size(584, 25)
|
Me.TOOLBAR_TOP.Size = New System.Drawing.Size(584, 25)
|
||||||
@@ -143,7 +202,8 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.BTT_ADD.Size = New System.Drawing.Size(184, 22)
|
Me.BTT_ADD.Size = New System.Drawing.Size(184, 22)
|
||||||
Me.BTT_ADD.Tag = "a"
|
Me.BTT_ADD.Tag = "a"
|
||||||
Me.BTT_ADD.Text = "Add (Ins)"
|
Me.BTT_ADD.Text = "Add (Ins)"
|
||||||
Me.BTT_ADD.ToolTipText = "Click to add." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Ctrl+click to use cookies for download (if supported)."
|
Me.BTT_ADD.ToolTipText = "Click to add." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Ctrl+click to use cookies for download (if supported)." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Shift to a" &
|
||||||
|
"dd without downloading."
|
||||||
'
|
'
|
||||||
'BTT_ADD_PLS_ARR
|
'BTT_ADD_PLS_ARR
|
||||||
'
|
'
|
||||||
@@ -154,7 +214,8 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.BTT_ADD_PLS_ARR.Size = New System.Drawing.Size(184, 22)
|
Me.BTT_ADD_PLS_ARR.Size = New System.Drawing.Size(184, 22)
|
||||||
Me.BTT_ADD_PLS_ARR.Tag = "pls"
|
Me.BTT_ADD_PLS_ARR.Tag = "pls"
|
||||||
Me.BTT_ADD_PLS_ARR.Text = "Add playlist array"
|
Me.BTT_ADD_PLS_ARR.Text = "Add playlist array"
|
||||||
Me.BTT_ADD_PLS_ARR.ToolTipText = "Click to add." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Ctrl+click to use cookies for download (if supported)."
|
Me.BTT_ADD_PLS_ARR.ToolTipText = "Click to add." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Ctrl+click to use cookies for download (if supported)." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Shift to a" &
|
||||||
|
"dd without downloading."
|
||||||
'
|
'
|
||||||
'BTT_ADD_NO_SHORTS
|
'BTT_ADD_NO_SHORTS
|
||||||
'
|
'
|
||||||
@@ -166,7 +227,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.BTT_ADD_NO_SHORTS.Tag = "ans"
|
Me.BTT_ADD_NO_SHORTS.Tag = "ans"
|
||||||
Me.BTT_ADD_NO_SHORTS.Text = "Add (without Shorts)"
|
Me.BTT_ADD_NO_SHORTS.Text = "Add (without Shorts)"
|
||||||
Me.BTT_ADD_NO_SHORTS.ToolTipText = "Download all videos except 'Shorts'." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Click to add." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Ctrl+click to use cookies fo" &
|
Me.BTT_ADD_NO_SHORTS.ToolTipText = "Download all videos except 'Shorts'." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Click to add." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Ctrl+click to use cookies fo" &
|
||||||
"r download (if supported)."
|
"r download (if supported)." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Shift to add without downloading."
|
||||||
'
|
'
|
||||||
'BTT_ADD_SHORTS_ONLY
|
'BTT_ADD_SHORTS_ONLY
|
||||||
'
|
'
|
||||||
@@ -178,53 +239,27 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.BTT_ADD_SHORTS_ONLY.Tag = "as"
|
Me.BTT_ADD_SHORTS_ONLY.Tag = "as"
|
||||||
Me.BTT_ADD_SHORTS_ONLY.Text = "Add (Shorts only)"
|
Me.BTT_ADD_SHORTS_ONLY.Text = "Add (Shorts only)"
|
||||||
Me.BTT_ADD_SHORTS_ONLY.ToolTipText = "Download only 'Shorts' videos." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Click to add." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Ctrl+click to use cookies for down" &
|
Me.BTT_ADD_SHORTS_ONLY.ToolTipText = "Download only 'Shorts' videos." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Click to add." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Ctrl+click to use cookies for down" &
|
||||||
"load (if supported)."
|
"load (if supported)." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Shift to add without downloading."
|
||||||
'
|
'
|
||||||
'BTT_DOWN
|
'BTT_DOWN
|
||||||
'
|
'
|
||||||
Me.BTT_DOWN.Image = CType(resources.GetObject("BTT_DOWN.Image"), System.Drawing.Image)
|
Me.BTT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_Green_16
|
||||||
Me.BTT_DOWN.ImageTransparentColor = System.Drawing.Color.Magenta
|
Me.BTT_DOWN.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
Me.BTT_DOWN.Name = "BTT_DOWN"
|
Me.BTT_DOWN.Name = "BTT_DOWN"
|
||||||
Me.BTT_DOWN.Size = New System.Drawing.Size(81, 22)
|
Me.BTT_DOWN.Size = New System.Drawing.Size(81, 22)
|
||||||
Me.BTT_DOWN.Text = "Download"
|
Me.BTT_DOWN.Text = "Download"
|
||||||
Me.BTT_DOWN.ToolTipText = "Download pending items"
|
Me.BTT_DOWN.ToolTipText = "Download pending items (F5)"
|
||||||
'
|
'
|
||||||
'BTT_STOP
|
'BTT_STOP
|
||||||
'
|
'
|
||||||
Me.BTT_STOP.AutoToolTip = False
|
Me.BTT_STOP.AutoToolTip = False
|
||||||
|
Me.BTT_STOP.Enabled = False
|
||||||
Me.BTT_STOP.Image = CType(resources.GetObject("BTT_STOP.Image"), System.Drawing.Image)
|
Me.BTT_STOP.Image = CType(resources.GetObject("BTT_STOP.Image"), System.Drawing.Image)
|
||||||
Me.BTT_STOP.ImageTransparentColor = System.Drawing.Color.Magenta
|
Me.BTT_STOP.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
Me.BTT_STOP.Name = "BTT_STOP"
|
Me.BTT_STOP.Name = "BTT_STOP"
|
||||||
Me.BTT_STOP.Size = New System.Drawing.Size(51, 22)
|
Me.BTT_STOP.Size = New System.Drawing.Size(51, 22)
|
||||||
Me.BTT_STOP.Text = "Stop"
|
Me.BTT_STOP.Text = "Stop"
|
||||||
'
|
'
|
||||||
'BTT_DELETE
|
|
||||||
'
|
|
||||||
Me.BTT_DELETE.Image = CType(resources.GetObject("BTT_DELETE.Image"), System.Drawing.Image)
|
|
||||||
Me.BTT_DELETE.ImageTransparentColor = System.Drawing.Color.Magenta
|
|
||||||
Me.BTT_DELETE.Name = "BTT_DELETE"
|
|
||||||
Me.BTT_DELETE.Size = New System.Drawing.Size(60, 22)
|
|
||||||
Me.BTT_DELETE.Text = "Delete"
|
|
||||||
Me.BTT_DELETE.ToolTipText = "Delete selected items"
|
|
||||||
'
|
|
||||||
'BTT_CLEAR_DONE
|
|
||||||
'
|
|
||||||
Me.BTT_CLEAR_DONE.Image = CType(resources.GetObject("BTT_CLEAR_DONE.Image"), System.Drawing.Image)
|
|
||||||
Me.BTT_CLEAR_DONE.ImageTransparentColor = System.Drawing.Color.Magenta
|
|
||||||
Me.BTT_CLEAR_DONE.Name = "BTT_CLEAR_DONE"
|
|
||||||
Me.BTT_CLEAR_DONE.Size = New System.Drawing.Size(54, 22)
|
|
||||||
Me.BTT_CLEAR_DONE.Text = "Clear"
|
|
||||||
Me.BTT_CLEAR_DONE.ToolTipText = "Remove all downloaded items"
|
|
||||||
'
|
|
||||||
'BTT_CLEAR_ALL
|
|
||||||
'
|
|
||||||
Me.BTT_CLEAR_ALL.Image = CType(resources.GetObject("BTT_CLEAR_ALL.Image"), System.Drawing.Image)
|
|
||||||
Me.BTT_CLEAR_ALL.ImageTransparentColor = System.Drawing.Color.Magenta
|
|
||||||
Me.BTT_CLEAR_ALL.Name = "BTT_CLEAR_ALL"
|
|
||||||
Me.BTT_CLEAR_ALL.Size = New System.Drawing.Size(69, 22)
|
|
||||||
Me.BTT_CLEAR_ALL.Text = "Clear all"
|
|
||||||
Me.BTT_CLEAR_ALL.ToolTipText = "Remove all items (pending and downloaded)"
|
|
||||||
'
|
|
||||||
'SEP_LOG
|
'SEP_LOG
|
||||||
'
|
'
|
||||||
Me.SEP_LOG.Name = "SEP_LOG"
|
Me.SEP_LOG.Name = "SEP_LOG"
|
||||||
@@ -259,6 +294,16 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.BTT_DONATE.Size = New System.Drawing.Size(23, 22)
|
Me.BTT_DONATE.Size = New System.Drawing.Size(23, 22)
|
||||||
Me.BTT_DONATE.ToolTipText = "Support"
|
Me.BTT_DONATE.ToolTipText = "Support"
|
||||||
'
|
'
|
||||||
|
'BTT_BUG_REPORT
|
||||||
|
'
|
||||||
|
Me.BTT_BUG_REPORT.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right
|
||||||
|
Me.BTT_BUG_REPORT.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
|
||||||
|
Me.BTT_BUG_REPORT.Image = Global.SCrawler.My.Resources.Resources.MailPic_16
|
||||||
|
Me.BTT_BUG_REPORT.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
|
Me.BTT_BUG_REPORT.Name = "BTT_BUG_REPORT"
|
||||||
|
Me.BTT_BUG_REPORT.Size = New System.Drawing.Size(23, 22)
|
||||||
|
Me.BTT_BUG_REPORT.Text = "Bug report"
|
||||||
|
'
|
||||||
'VideoListForm
|
'VideoListForm
|
||||||
'
|
'
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
@@ -286,9 +331,9 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Private WithEvents LBL_INFO As ToolStripStatusLabel
|
Private WithEvents LBL_INFO As ToolStripStatusLabel
|
||||||
Protected WithEvents TP_CONTROLS As TableLayoutPanel
|
Protected WithEvents TP_CONTROLS As TableLayoutPanel
|
||||||
Private WithEvents TOOLBAR_TOP As ToolStrip
|
Private WithEvents TOOLBAR_TOP As ToolStrip
|
||||||
Private WithEvents BTT_DELETE As ToolStripButton
|
Private WithEvents BTT_DELETE As ToolStripMenuItem
|
||||||
Private WithEvents BTT_CLEAR_DONE As ToolStripButton
|
Private WithEvents BTT_CLEAR_DONE As ToolStripMenuItem
|
||||||
Private WithEvents BTT_CLEAR_ALL As ToolStripButton
|
Private WithEvents BTT_CLEAR_ALL As ToolStripMenuItem
|
||||||
Private WithEvents BTT_SETTINGS As ToolStripButton
|
Private WithEvents BTT_SETTINGS As ToolStripButton
|
||||||
Private WithEvents SEP_1 As ToolStripSeparator
|
Private WithEvents SEP_1 As ToolStripSeparator
|
||||||
Private WithEvents SEP_LOG As ToolStripSeparator
|
Private WithEvents SEP_LOG As ToolStripSeparator
|
||||||
@@ -302,5 +347,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Protected WithEvents BTT_ADD_SHORTS_ONLY As PersonalUtilities.Forms.Controls.KeyClick.ToolStripMenuItemKeyClick
|
Protected WithEvents BTT_ADD_SHORTS_ONLY As PersonalUtilities.Forms.Controls.KeyClick.ToolStripMenuItemKeyClick
|
||||||
Protected WithEvents MENU_ADD As ToolStripDropDownButton
|
Protected WithEvents MENU_ADD As ToolStripDropDownButton
|
||||||
Protected WithEvents BTT_DOWN As ToolStripButton
|
Protected WithEvents BTT_DOWN As ToolStripButton
|
||||||
|
Private WithEvents BTT_BUG_REPORT As ToolStripButton
|
||||||
|
Private WithEvents BTT_CLEAR_SELECTED As ToolStripMenuItem
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -126,253 +126,296 @@
|
|||||||
<metadata name="MENU_ADD_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="MENU_ADD_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="TOOLBAR_BOTTOM.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="MENU_DEL_CLEAR.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>17, 17</value>
|
<value>False</value>
|
||||||
</metadata>
|
|
||||||
<metadata name="TOOLBAR_TOP.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>177, 17</value>
|
|
||||||
</metadata>
|
</metadata>
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
<data name="BTT_ADD.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
|
||||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN7SURBVEhLrZVJTFNRFIafQhgkQA1OZYriSI0UtUI0vIKg
|
|
||||||
UEGNBRSUIQ4MihElUAgOqeKwcGM07owLYoxxYzSuHBZIjAoKrfpaoBZLJyiaYNxf83vus0QWBAy+k/xp
|
|
||||||
k3vzf+ee99/3hNkq7GZIZ/itEEwnvhbcNvfiRmlWDcu1iNj5UYRBItlE7HflyZDgtrkXN9n4ScMWdAuI
|
|
||||||
eSsg7r2AhL5Q1PoKlQPoJA2LfSdg8ft5WG4JR7oUg9ZAiXKATALwzlOs4dhkj0XO4FJc+V6pHECU0liK
|
|
||||||
NQJb7CoUOOJp/qtwc6JOOcBRScd0NhUKHQk4NLIWde503P3ZqBygWcpihi+JqHKnosGzCc3ebbj/0/Rv
|
|
||||||
gJlyPqkjluxfle51OOXRoW1UxKVAPjp/tGDRg8gZpX4U1Sl3mDeZccp30aCIYkcuql0FOOXdi3b/flwN
|
|
||||||
VNN/Hc769egIFODyuAGdEy24N2GSQXcmGnHjew06xivQ6i+lERahwV0G9eMoyABuHvOGMt4jINESBi3F
|
|
||||||
kCfFOJyCI+71OO3NxLnR7WRgwLXxQhlwaSyfzETUedJxYHg18oaWQWuLQVJ/GFTkU2Yz/gXwzrk5X9Ta
|
|
||||||
ommzGiVB8zO+TJz35+JywECAfFwYy4XJn0XPYjMOj2iwz7kC2YNLsEGKRrwlFKpeAZF0KUs+TgEU2UUk
|
|
||||||
k3k6dZDnUMsxrPVo0eTLwNnRHJwn03Z/Nky+LJzxbkE9rVW5NdjjXA49nVQ27w8Fv4zcfN5zAcbeKYCD
|
|
||||||
jh3Yao+jGCaiwrUOjfQwWygpbWTITZt922Q10ajqaSQ8TbudycgaWILUz1FQfwhBNI04okuA8Iz0mACv
|
|
||||||
pwBOSBnMNKBnZmcVMw8fY+av9czsqqPf4+yi/SS7/e0EmWeg1q1F+cgaFDqT0OatRtmHHb9qpGxWKYms
|
|
||||||
nKQniZ9IfaQekckAHtPpIjYpvun6QBur9aSh3LUau+iUmXTaBk+5vDajeExnK76xw97EDtBzKRhKwGa6
|
|
||||||
0SutkTjsKpZNgtvmXtzELDWw/KF4+UXH36ZxlJRDjuCM/7f+AGrYRlssEikpCynO/NtQOpnz/y1u0ihV
|
|
||||||
sKT+cKgohgteCQh5QSmxKgg4KukZN4+gzufzGD4lwDsFARUUv0jqXKALJDwhPSRAt4KA0s9GeSTGHhJd
|
|
||||||
IGMX6aVSAMoyN5pWs+ZcEH4DgcGuQfDpaFIAAAAASUVORK5CYII=
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="BTT_ADD_PLS_ARR.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
|
||||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN6SURBVEhLrZVbSJNhGMe/UjyiLixrnig7J7WVphXOLa25
|
|
||||||
tKKlluYBy1MZWaJLNGNkh6sgiu6iC4mIbsLoqsNFRZRa6bRva1vW3MlmgeH9G/+e92OSF6Jh3wN/Nnhf
|
|
||||||
/r/nfb7/+33CfBV2M6Qn/FYIZhNfC25beHEjtSWd5Q1psHdYA4NIsmpQ6sqXIMFtCy9ukjGSzqJeC4h9
|
|
||||||
JyD+vYCkj6Go9xXKB8gS01lcn4Bl7xdh5VA41GIszgeK5QPsJADvPM0Sjm22OOjsy3HlZ6V8AK2oZmmW
|
|
||||||
CGy3KVDgTKT5r8HNyQb5ACfELJZpVaDQmYRjY+vR4Fbj7lSzfIBWMZcZviSjyr0RTZ5taPXuwv0p078B
|
|
||||||
5sr5tGqHdb8r3RtwxpOJ9nENLgX06PnVhqUPIueU8lF0j9Rh/nTGKd9Fdg0OO/NQ7SrAGe9BdPhLcTVQ
|
|
||||||
Tf8z0enPRXegAJcnDOiZbMO9SZMEujPZjBs/69A9UYHz/hIaYRGa3Eeh7I2GBODmsW8p4/0CkofCoKIY
|
|
||||||
8qQYv6bhuDsdZ73ZuDC+mwwMuDZRKAEufdeTmQYNHjWOfF2LfMcKqKyxSBkMg4J8jlqNfwG8c27OF1XW
|
|
||||||
GNqsRHHQ/JwvG13+PFwOGAigx8XveTD5c+hZZKBmbBMOja6C1p6AzWIMEodCoRgQEEmXsnh4BqDIpkEq
|
|
||||||
maupg3ynUophvUeFFl8WOsd16CLTDr8WJl8Oznm3o5HWqtybcGB0JXLppJL5YCj4ZeTmi54JMA7MAJQ7
|
|
||||||
92CnLZ5imIwK1wY008Nso6S0kyE3bfXtktRCo2qkkfA07R9NRc7nBGz8FA3lhxDE0IgjXgoQnpJ6CfBm
|
|
||||||
BuCUbQczOXTM/K2KmV21zDzWyMzuBvo9ybrtp9ntH6fIPAv1bhXKxtahcDQF7d5qlA/qf9eJu1mlqGVl
|
|
||||||
JB1JO0L6SOrXMgnAYzpbxKbFN113tLN6zxaUudZiH50ym07b5CmT1uYUj+l8xTdesbewI/RcChxJyKAb
|
|
||||||
vdoSiRrXYckkuG3hxU3M1iamdyRKLzr+No2npBxzBmf8vyUBxDq21RqHZErKEooz/zaUTOf8f4ubNIsV
|
|
||||||
LGUwHAqKYdQrASHPKSUWGQEnRB3j5hHU+WIewycE6JMRUEHxi6TOBbpAwmPSQwK8lhFQ8skojcTYT6IL
|
|
||||||
ZHxJeiEXgLLMjWbVvDkXhD8Iya6ZQXWVtAAAAABJRU5ErkJggg==
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="BTT_ADD_NO_SHORTS.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
|
||||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOBSURBVEhLrZVbSJNhGMe/Ujwk6sJO8xBlJy1qljapnKUr
|
|
||||||
nd8qmlqtPNDBQxmtRJd0IrKSbiKKoIvoQiKimyi66nBREZWabtVmbk12tplheP/Gv+f92MgL0bDvgT8M
|
|
||||||
3pf/73mf9/9+E6aqmBtRnbE3ozCR+Fp42/SLG22yqlmxRYNtnzTQ2Uh2DXa7tRIkvG36xU0KP6vZrDcC
|
|
||||||
kt4LSOkRkNYbjfqAKB+gyKZmyR8EzO2ZgUWWWOTYknAqVCEfYCsBeOeZ1lis60/GloH5uDxSLR9AtG1i
|
|
||||||
mdY4rO9XoNSZSvNfihujDfIBDn0tYnl2BURnGvZ7VqDBm4O7Yyb5AC2uMqb7lo4abzaafOvQ4t+I+2Pm
|
|
||||||
fwNMlvOITC7972pvFo778tA2pMHFUAk6f7VizoP4SaV8lNApdaiNZJzyrR/QoNxZjFp3KY77d+J0cDeu
|
|
||||||
hGrpdx7OBAvRHirFpWEdOkdbcW/ULIHujJpwfaQO7cNVOBWspBHq0eTdC+XjBEgAbp70jjLeJSDdEgMV
|
|
||||||
xZAnxTCYiYPeVTjhz8fZoSIy0KFjWJQAF7+XkJkGDb4c7BlcBq1jAVT2JGT0xUBBPnvthr8A3jk354sq
|
|
||||||
eyJtVqIibH4ykI9zwWJcCukIUILz34thDhbQXeTigGcldrkWY/PAPKy2JSLVEg1Ft4B4epQVn8YB9P0a
|
|
||||||
LCTzHOpA61RKMaz3qdAcUOPM0BacI9PTwc0wBwpw0r8ejbRW412JHa5FKKSTSuZ90eCPkZvPeC7A0D0O
|
|
||||||
sM+5FRv6UyiG6ahyZ8FEl9lKSWkjQ27aEtgoqZlG1Ugj4Wna7lqIgq/zkP0lAcqPUUikEce9EiA8Iz0m
|
|
||||||
wNtxgKNeLTMH9OzCcA1r/3GYdYw0so6fDezqyBF2zX+M3fpxlMzVqPeqYPQsh+jKQJu/FnUOw+8613ZW
|
|
||||||
7RCZ0SYyPUn8TOoldYlMAvCYThSxiPim24E2Vu9bA6N7GcrolPl02iafUVqbVDymUxXfeN3fzPbQvZQ6
|
|
||||||
0pBLL3qJNR4H3OWSSXjb9IubXPY0sRJHqvSh41/TFErKfmd4xv9b3OTCYB1ba09GOiVlNsWZ/zdURnL+
|
|
||||||
v8VNTM4qltEXCwXFcNZrAVEvKCVWGQGH7HrGzeOo85k8hk8J8EFGQBXFL546F+gBCU9IDwnwRkZA5ReD
|
|
||||||
NBJDF4kekOEV6aVcAMoyN5pQU+ZcEP4ATUiw5fkSx60AAAAASUVORK5CYII=
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="BTT_ADD_SHORTS_ONLY.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
|
||||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOBSURBVEhLrZVbSJNhGMe/Ujwk6sJO8xBlJy1qljapnKUr
|
|
||||||
nd8qmlqtPNDBQxmtRJd0IrKSbiKKoIvoQiKimyi66nBREZWabtVmbk12tplheP/Gv+f92MgL0bDvgT8M
|
|
||||||
3pf/73mf9/9+E6aqmBtRnbE3ozCR+Fp42/SLG22yqlmxRYNtnzTQ2Uh2DXa7tRIkvG36xU0KP6vZrDcC
|
|
||||||
kt4LSOkRkNYbjfqAKB+gyKZmyR8EzO2ZgUWWWOTYknAqVCEfYCsBeOeZ1lis60/GloH5uDxSLR9AtG1i
|
|
||||||
mdY4rO9XoNSZSvNfihujDfIBDn0tYnl2BURnGvZ7VqDBm4O7Yyb5AC2uMqb7lo4abzaafOvQ4t+I+2Pm
|
|
||||||
fwNMlvOITC7972pvFo778tA2pMHFUAk6f7VizoP4SaV8lNApdaiNZJzyrR/QoNxZjFp3KY77d+J0cDeu
|
|
||||||
hGrpdx7OBAvRHirFpWEdOkdbcW/ULIHujJpwfaQO7cNVOBWspBHq0eTdC+XjBEgAbp70jjLeJSDdEgMV
|
|
||||||
xZAnxTCYiYPeVTjhz8fZoSIy0KFjWJQAF7+XkJkGDb4c7BlcBq1jAVT2JGT0xUBBPnvthr8A3jk354sq
|
|
||||||
eyJtVqIibH4ykI9zwWJcCukIUILz34thDhbQXeTigGcldrkWY/PAPKy2JSLVEg1Ft4B4epQVn8YB9P0a
|
|
||||||
LCTzHOpA61RKMaz3qdAcUOPM0BacI9PTwc0wBwpw0r8ejbRW412JHa5FKKSTSuZ90eCPkZvPeC7A0D0O
|
|
||||||
sM+5FRv6UyiG6ahyZ8FEl9lKSWkjQ27aEtgoqZlG1Ugj4Wna7lqIgq/zkP0lAcqPUUikEce9EiA8Iz0m
|
|
||||||
wNtxgKNeLTMH9OzCcA1r/3GYdYw0so6fDezqyBF2zX+M3fpxlMzVqPeqYPQsh+jKQJu/FnUOw+8613ZW
|
|
||||||
7RCZ0SYyPUn8TOoldYlMAvCYThSxiPim24E2Vu9bA6N7GcrolPl02iafUVqbVDymUxXfeN3fzPbQvZQ6
|
|
||||||
0pBLL3qJNR4H3OWSSXjb9IubXPY0sRJHqvSh41/TFErKfmd4xv9b3OTCYB1ba09GOiVlNsWZ/zdURnL+
|
|
||||||
v8VNTM4qltEXCwXFcNZrAVEvKCVWGQGH7HrGzeOo85k8hk8J8EFGQBXFL546F+gBCU9IDwnwRkZA5ReD
|
|
||||||
NBJDF4kekOEV6aVcAMoyN5pQU+ZcEP4ATUiw5fkSx60AAAAASUVORK5CYII=
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="MENU_ADD.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
|
||||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN/SURBVEhLrZVbSJNhGMc/Uzwk6sJO80RZdqRm5ZTElc3S
|
|
||||||
bVa01LQ8YOWhDE3RKZ0INesmiiK6iS4kIroJo6sOFxZRWalTtzXnYu5kU8Ho/o1/z/s1yQvR0O+BPwze
|
|
||||||
h//vfZ/3/34T5qvgO4GdIXcDMZv4mr9t4cWN0o1Kpu5X4cCAChoTyaxCgSNLhPjbFl7cRDWoZEvfCYj8
|
|
||||||
KCD6i4DY3iBUenTSATJNShb1ScCKLwFY0x+CZFMkmn150gGyCMB3nmgMwU5LFDKtq3BtskQ6gNaUzhKN
|
|
||||||
oVBaZMixxdD81+POVJV0gFOWTJZilkFni8WJ0Y2ocibj4a866QCNIxqmGYlDqXMzalw70ehOx+Nfhv8D
|
|
||||||
zJXzadWO6H6XODeh1pWCljEVWn3Z6PzZhOVPwuaU/Fl4599LnM445TvXqsJRmxpljhzUug/jgrcAHb4y
|
|
||||||
+p2Ci949aPPloH1cg86pJjyaMoigB1N1uD1ZgbbxYjR782mEuahxFkLeFQ4RwM0jP1DGewTE9QdDQTHk
|
|
||||||
SdF/T8RJ51acd6fh0tg+MtDg+rhOBLT+yCYzFapcyTj2PQlZw6uhMEcivi8YMvIpNOv/AfjOuTlfVJgj
|
|
||||||
qFmOPL95vScNl71qtPs0BMjGlR9qGLwZdBe7UD66BUfsa7HXuhLbTBGI6Q+C7LOAMHqUeQMzALkWFRLI
|
|
||||||
PJl2kGWTizGsdCnQ4EnFxbFMXCbTC969MHgyUO9WoprWSp1bcMi+BnvopKJ5XxD4Y+TmAa8E6D/PABy3
|
|
||||||
7cduSzTFMA7Fjk2oo8tsoqS0kCE3bfSki2qgUVXTSHiaDtoTkPFtJTYPhUP+NRARNOLQbgHCS1IXAd7P
|
|
||||||
AJwdVTODW8eu+kpZ6/hp1jFRzTomq9iNiTPspuscuzdxlsxTUelUoGh0A3T2eLS4y3DaeuR3xUguK7Fq
|
|
||||||
WZFJy3Qk7SCpl9SjZSKAx3S2iE2LN913t7BK13YUOZKgpVOm0WlrXEXi2pziMZ2veOMtVwM7RveSMxyL
|
|
||||||
XfSi1xnDUO44Kpr42xZe3KTdUcOyh2PEDx3/mkZTUk7Y/DNebHGTq/YKtsMchThKyjKKM/9vyJ/O+WKL
|
|
||||||
m9QNF7P4vhDIKIZL3woIfE0pMUoIOGXSMW4eSjtfwmP4ggCfJAQUU/zCaOcCPSDhOekpAd5JCMgf0osj
|
|
||||||
0feQ6AHpu0lvpAJQlrnRrJo354LwB0sEsKr2elKBAAAAAElFTkSuQmCC
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="BTT_DOWN.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
|
||||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN7SURBVEhLrZVJTFNRFIafQhgkQA1OZYriSI0UtUI0vIKg
|
|
||||||
UEGNBRSUIQ4MihElUAgOqeKwcGM07owLYoxxYzSuHBZIjAoKrfpaoBZLJyiaYNxf83vus0QWBAy+k/xp
|
|
||||||
k3vzf+ee99/3hNkq7GZIZ/itEEwnvhbcNvfiRmlWDcu1iNj5UYRBItlE7HflyZDgtrkXN9n4ScMWdAuI
|
|
||||||
eSsg7r2AhL5Q1PoKlQPoJA2LfSdg8ft5WG4JR7oUg9ZAiXKATALwzlOs4dhkj0XO4FJc+V6pHECU0liK
|
|
||||||
NQJb7CoUOOJp/qtwc6JOOcBRScd0NhUKHQk4NLIWde503P3ZqBygWcpihi+JqHKnosGzCc3ebbj/0/Rv
|
|
||||||
gJlyPqkjluxfle51OOXRoW1UxKVAPjp/tGDRg8gZpX4U1Sl3mDeZccp30aCIYkcuql0FOOXdi3b/flwN
|
|
||||||
VNN/Hc769egIFODyuAGdEy24N2GSQXcmGnHjew06xivQ6i+lERahwV0G9eMoyABuHvOGMt4jINESBi3F
|
|
||||||
kCfFOJyCI+71OO3NxLnR7WRgwLXxQhlwaSyfzETUedJxYHg18oaWQWuLQVJ/GFTkU2Yz/gXwzrk5X9Ta
|
|
||||||
ommzGiVB8zO+TJz35+JywECAfFwYy4XJn0XPYjMOj2iwz7kC2YNLsEGKRrwlFKpeAZF0KUs+TgEU2UUk
|
|
||||||
k3k6dZDnUMsxrPVo0eTLwNnRHJwn03Z/Nky+LJzxbkE9rVW5NdjjXA49nVQ27w8Fv4zcfN5zAcbeKYCD
|
|
||||||
jh3Yao+jGCaiwrUOjfQwWygpbWTITZt922Q10ajqaSQ8TbudycgaWILUz1FQfwhBNI04okuA8Iz0mACv
|
|
||||||
pwBOSBnMNKBnZmcVMw8fY+av9czsqqPf4+yi/SS7/e0EmWeg1q1F+cgaFDqT0OatRtmHHb9qpGxWKYms
|
|
||||||
nKQniZ9IfaQekckAHtPpIjYpvun6QBur9aSh3LUau+iUmXTaBk+5vDajeExnK76xw97EDtBzKRhKwGa6
|
|
||||||
0SutkTjsKpZNgtvmXtzELDWw/KF4+UXH36ZxlJRDjuCM/7f+AGrYRlssEikpCynO/NtQOpnz/y1u0ihV
|
|
||||||
sKT+cKgohgteCQh5QSmxKgg4KukZN4+gzufzGD4lwDsFARUUv0jqXKALJDwhPSRAt4KA0s9GeSTGHhJd
|
|
||||||
IGMX6aVSAMoyN5pWs+ZcEH4DgcGuQfDpaFIAAAAASUVORK5CYII=
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="BTT_STOP.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
|
||||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAVDSURBVEhLjZVrTJNXGMcLQmdHO6AdarLSOcQBAgX61tK6
|
|
||||||
qTAuUrRgC4KOETWj4gqKF5QoRmM00SgmS/Zh+7B92DKTGbdEl2VjwiibCmTKAKdbuQ5rKb0XXnZJFujZ
|
|
||||||
/5RWZywbT/JL+57znP/z73NOz8uh0V9QEGVMSPiwc8WK4RsSyQebxeKXMBzhn/yfGFIolL9JJDdHli/v
|
|
||||||
u5aYWI6hKBDmn6Rx32Dg3yko+HyoqYmMX7pE7jU2+m4olR3ZAsFqTEfOZ4UOE8O8bt2x4yF74QKZaWkh
|
|
||||||
wxUV7veSk+sk0dGxmJ4v0rFq1fuDhw6RsdOnyfipU8SCZPPRo6RVqbwpFQheRUrIIiMq1RsQN7MXLxIW
|
|
||||||
a9nmZjJz8iQZ1Gg8X4rF7yJFCCI4nSKRhYqPNTaSh8ePEwuSJs+dI6amJt8NheJWukCQhMSniqAthdbK
|
|
||||||
Sgt1TsVnIM4eOUJmYMxbXU2McXEPkKYEAk57fPzl4ZoaMo4CZmA5doxYscB+9iwZQrvalcruND4/Gcn+
|
|
||||||
IkMyWeFkRYVl+vx5wsLMDEyxWDdz8CCZ2ruXtCoUzp0i0VWkFgMhR7dy5cutcvnNgd27fY+QNAEm4caO
|
|
||||||
PXGhZY7Dh0knimTx+Sk/MUzBRHm5dfrMGX9LWDhm0V62oYFMQ9yYleVO4vE+gbAeSAHdcE4kIxIlo0i3
|
|
||||||
eedOYt23j9jq64n9wAHiRDEPhEbr6309KtXAaGmphT1xwu+YxRyLXLau7rF4Co93GXo1IDUgHg78wc0S
|
|
||||||
ClO+lcm6fq2q8tlqa4kDuAwG4oaAF8W8+/eTabidpsJ4ZvHsF0d7u+Ryj5TPp+LU+RqwFDw5qoHgKoTC
|
|
||||||
Ne0ZGd3WbduIY9cu4gIevZ544XAKBaewgVOlpcSbm0u8KhVxg67sbG+mQHAF6/cA6pwHnhEPBndtbGxq
|
|
||||||
u1TaPZibO+vevp241GriYhjiFIuJUyAgzshI4lyyhIzy+b62hASPMiaGbmgtSAPPgwXFg+Fv1x2ptH8S
|
|
||||||
gjaI2YEDUGE/ERGkLyPjr/Lk5K+R/w5IB4sS94e1utpgVanMNh7vWXFAx0yJibNGjWY0JT6+FEuiweLE
|
|
||||||
vXr9YWdentMG9wuJT4CHwJyaSvq02gdvrluXiaX/ea34w6XXNzs2bXLZoqKeEXeg97RdVHwcDIeHk/ug
|
|
||||||
NzPT119W9ku5UknbtHARz549x+1FRe5Qzh0iEXlUVPT3UFKSj4oPBcVBF+hmmLl++ksWKoKj2GzLy/PY
|
|
||||||
+Hy/8FNtWbaMmIqLfz+zYUNP75Ytk+aUFPIzRO+C2+AHYAS31q6d+7G8fCBPKqUX5JOr3l1T00TF7aHE
|
|
||||||
4+KIaePGP+oYph2p9UVpaW89KCkZNaH3QfEO0AZaQadCMddTVtb7sUZDN54LwjjurVst9piY0M4hXiuT
|
|
||||||
tSHRAOhGCg/k5LzWp9ONDKSnPxb/BnwFroN+mWz2rk43iNyVgMuxabUmt0QS0rmBYb5DUl1APPim4h7M
|
|
||||||
z1f2lZWNfJ+e7vu3+BdhYeRuVtasUa2eQF4BiOX0VFXtmFSrXS6IBp3fLyz8c19o8WBwG3JysrGxw3cy
|
|
||||||
Msi1gLgxO3vuM7X6UfHq1R8hZ74AYmlbRcUJS0mJZ0yp9FHnDXJ5B8YXEg8GV79+vYy2A9e5z6hSzV2F
|
|
||||||
8xd4vBbMacF8ixBhTEJCdK9O9+lYSYnjSn4+Tl94A8YZwKfzNGmB4F6vrHz7nlY7cVujcRYlJdF3gQ6I
|
|
||||||
AT2uj9fSLzFADjYHPhf7938O0KNJT84W8AoI+YdbAqhj+rKmn/R5MUFN0Pv/xQC0YMAYh/MP1UTZ10sP
|
|
||||||
VAUAAAAASUVORK5CYII=
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="BTT_DELETE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="BTT_DELETE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
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
|
||||||
OqoAAAAASUVORK5CYII=
|
9iQAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="MENU_DEL_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="BTT_CLEAR_SELECTED.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BTT_CLEAR_DONE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="BTT_CLEAR_DONE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
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
|
||||||
OqoAAAAASUVORK5CYII=
|
9iQAAAAASUVORK5CYII=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BTT_CLEAR_ALL.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="BTT_CLEAR_ALL.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
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
|
||||||
OqoAAAAASUVORK5CYII=
|
9iQAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="MENU_DEL_CLEAR.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
|
22tl8CvUAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="TOOLBAR_BOTTOM.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TOOLBAR_TOP.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>177, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="BTT_ADD.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||||
|
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANxSURBVEhLrZVJTFNRFIYfQhgD1OBUpiCKQwkUoUA0FBAU
|
||||||
|
KqixAlpliAODYEQJFAJiCKBujcadcUGMMW4MxpXDAoeoOEDR1woVUjph0QTD/pLfcx8lsiBg8J3kT9vc
|
||||||
|
k/+797z/vgorlf9N376AW75YSnzN27b64kYqk4rlDWuxf0QLnUgya1Fmy5cg3rbVlwT4omLBrwSEvRMQ
|
||||||
|
8VFA1Gc/1LiK5AMkiioW/l7A+o8+iBsOQIoYhlZPiXyAZALwncebApBqCUfu6EZc/VUhH0BDgHhTINIt
|
||||||
|
ChRaI2n+W3FzplY+wBkxkWnMChRZo3Bycjtq7Sm4O9soH6BZTGO679GotO9EgyMVzc49uD9r/DfAcjlf
|
||||||
|
kOFtzlyFfQcuODRom9Ki21OAvt8tWPcgaFkpH4X0STvMX8g45bt4VIuj1jxU2QpxwXkY7e4yXPNU0XcN
|
||||||
|
OtzZ6PEUondah76ZFtybMUqgOzONuPGrGj3T5Wh1l9IIi9FgPw5lfwgkADcPe0sZHxQQPewPNcWQJ0U/
|
||||||
|
EY/T9kRcdGbi8tReMtDh+nSRBOj+UUBmWtQ6UnBsIgH5Y5ugNochZsgfCvI5btb/BfCdc3O+qDaHUrMS
|
||||||
|
JV7zS65MdLrz0OvREaAAV37kwejOomeRhlOTKhwZ34yc0Q1IEkMROewHxQcBQXQpS0YWAYotWsSSeQrt
|
||||||
|
IN+qlGJY41CjyZWBjqlcdJJpuzsHRlcWLjnTUUdrlXYVDo3HIZtOKpkP+YFfRm7u80yA/sMiwAnrPuy2
|
||||||
|
RFAMo1Fu24FGepgtlJQ2MuSmza49kppoVHU0Ep6mg+OxyPq2ATu/hkD5yRehNOLAAQHCU1I/Ad4sAtSL
|
||||||
|
ScwoprMusZJ0lnWZ61iXpZY+z9Hv8+z2z3oyz0CNXQ3D5DYUjcegzVmFw69z5qrFDFYhapiBlE7SfCF9
|
||||||
|
Jg1qmATgMV0qYgviTd1iG6txJMNgS8ABOmUmnbbBYZDWlhWP6UrFG7vEJnaMnkvhWBTS6EZvMQXhlO2o
|
||||||
|
ZOJtW33NAxpYwVik9KLjb9MISspJq3fG/1vzgGq2yxyOaErKWooz/28oXcj5/xY3aRTLWcxQABQUw+CX
|
||||||
|
AnyfU0pMMgLOUMK4eSDtfA2P4RMCvJcRUE7xC6KdC3SBhMekhwR4JSOg9KteGol+kEQXSD9AeiEXgLLM
|
||||||
|
jZbUijkXhD9w0a0SO8Tg+AAAAABJRU5ErkJggg==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BTT_ADD_PLS_ARR.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||||
|
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN0SURBVEhLrZVJTFNRFIafQhgD1KBoGYzihDXYqtCqoYKg
|
||||||
|
UEENFUSkQFApKEaUQCVOaQR1azTujAtijHFjNK4cFmocGASKvFaokNIJiiYY99f8nvsskQUBg+8kf9rk
|
||||||
|
3vzfuef99z1hvgq7FdIRfjsEs4mvBbctvLiRyqZiuf167B3QwyCS7HocduVJkOC2hZcE+KxiUW8FxH4U
|
||||||
|
EN8jIKk3FGZfoXyAdFHF4joFLOtZhFX94dCIsTgfKJEPoCEA7zzVFo6tjjjkDC3Hte+V8gG0BEi1RSDT
|
||||||
|
oUCBM5Hmvxa3purkAxwX01mGXYFCZxIqxjagzq3BvZ+N8gGaxUxm+JqMKvdGNHi2otm7Ew9+Wv4NMFfO
|
||||||
|
p1XRmf2r0p2GM54MtI7rcTWQj44fLVj6MHJOKR9Hd0gd5k1nnPJdNKTHIWcuql0FOOM9iAv+w7geqKb/
|
||||||
|
Gbjo34W2QAHaJw3omGrB/SmLBLo71Yib32vRNmnCeX8pjbAIDe4jUD6JhgTg5rEfKONdApL7w6CmGPKk
|
||||||
|
GEdTccy9CWe9Olwa300GBtyYLJQAVyfyyUyPOo8GZaPrkDe8Amp7LFL6wqAgnyN2418A75yb80W1PYY2
|
||||||
|
K1ESND/n0+GyPxftAQMB8nFlIhcWfxY9i22oGVOheGQ1socS6K7EILE/FIpuAZF0KUsGZgCKHHqsJHMN
|
||||||
|
dZDnVEoxNHvUaPJpcXE8B5fJ9II/GxZfFs55M1FPa1VuFQ6MrMIuOqlk3hcKfhm5+aIXAozdMwBHnXuw
|
||||||
|
wxFPMUyGyZWGRnqYLZSUVjLkps2+nZKaaFT1NBKepv0jK5H1JQEbB6Oh/BSCGBpxxGsBwnPSEwK8mwE4
|
||||||
|
JaqZRdQxq72KWR0nmPVLPbMO1dHvSWYVT7M7306RuRZmtxrlY+tROJKCVm81it9n/6oVt7NKUcvKSTqS
|
||||||
|
9jOpl9SlZRKAx3S2iE2Lb2oXW5nZsxnlrnXYR6fU0WkbPOXS2pziMZ2v+Ear2MTK6LkUDCdhG93oNbZI
|
||||||
|
1LgOSSbBbQuvP4AGlj+cKL3o+Ns0npJS4QzO+H/rD6CWbbHHIZmSsoTizL8NpdM5/9/iJo2iiaX0hUNB
|
||||||
|
MYx6IyDkJaXEJiPgOCWMm0dQ54t5DJ8RoFNGgIniF0mdC3SBhKekRwR4KyOgdNAojcTYRaILZHxNeiUX
|
||||||
|
gLLMjWbVvDkXhN9lPK1NCDBSGgAAAABJRU5ErkJggg==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BTT_ADD_NO_SHORTS.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||||
|
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN6SURBVEhLrZVJTFNRFIYfQhgkQA1OZTCKoqLBVgRRpEpb
|
||||||
|
hQpqrAwiBYJIQTCiBCpxSuO41GjcGRfEGOPGYFw5LJAYFQco8opQIKUTFEkw7K/5PfelRBYEDL6T/GmT
|
||||||
|
e/N/55733/eEhSr0XnBb2P1gzCW+Fti2+OJGabZUpuvR4ECvBgaRZNeg2KmXIIFtiy9ukvE9lS3tFBD9
|
||||||
|
UUDsFwHx30Jg9ubLB9glprKYTwJWfAnC2p4wqMVoXPAXygfYQwDeeZItDGn9McgZWIWbk+XyAbRiGkuy
|
||||||
|
hSOjX4E8RxzNfwPuTdXKB6gWd7F0uwL5jniUjW5CrUuNR9ON8gGaxRxmGEpAhSsFDe40NHuy8GTa8m+A
|
||||||
|
+XI+I3Of7ne5azPOutPROqbBNX8u2n61YPnTiHmlfB7ZJnWon8k45btgQINjDh0qnXk46zmCi75i3PJX
|
||||||
|
0v90XPLtxXV/Hm5MGNA21YLHUxYJ9HCqEXcna3B9woQLviIaYQEaXMehbI+EBODm0R8o410CEnpCoaIY
|
||||||
|
8qQYR5Jw0rUV5zyZuDymJQMDbk/kS4Br47lkpkGtW42SkWToB1dDZY9GYncoFORz3G78C+Cdc3O+qLJH
|
||||||
|
0WYlCgPm572ZuOLT4YbfQIBcXB3XweLLpmexA1WjW3B0eB32DaxEqhiFuJ4QKD4LiKBLWdg7C1DQr8Ea
|
||||||
|
MldTB3qHUoqh2a1Ck3cnLo3l4AqZXvTtg8WbjfOeDNTRWoVrCw4Pr8VeOqlk3h0Cfhm5edBrAcbPswAn
|
||||||
|
HPuxuz+WYpgAk3MzGulhtlBSWsmQmzZ7syQ10ajqaCQ8TYeG1yD7x0qk9EVC+TUYUTTi8A4BwitSOwHe
|
||||||
|
zwLUD2Qxy5COWUcrmNV1ilnddczqqaXf0+ym4wx78LOezHfC7FKhdHQj8ocT0eqphMlm+F0j6lm5qGWl
|
||||||
|
JB1J+530jdSlZRKAx3SuiM2Ib7oz1MrM7m0odSbjIJ0yk07b4C6V1uYVj+lCxTfedjSxEnoueYPx2EE3
|
||||||
|
er0tAlXOY5JJYNvii5tYfzSw3ME46UXH36axlJQyR2DG/1sSQKxh2+0xSKCkLKM4829D0UzO/7e4SaNo
|
||||||
|
YondYVBQDJe+ExD8hlJikxFQLeoYNw+nzpfwGL4kwCcZASaKXwR1LtAFEl6QnhGgU0ZAUZ9RGomxi0QX
|
||||||
|
yNhBeisXgLLMjebUgjkXhD+4Jq73JQ87ogAAAABJRU5ErkJggg==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BTT_ADD_SHORTS_ONLY.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||||
|
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN6SURBVEhLrZVJTFNRFIYfQhgkQA1OZTCKoqLBVgRRpEpb
|
||||||
|
hQpqrAwiBYJIQTCiBCpxSuO41GjcGRfEGOPGYFw5LJAYFQco8opQIKUTFEkw7K/5PfelRBYEDL6T/GmT
|
||||||
|
e/N/55733/eEhSr0XnBb2P1gzCW+Fti2+OJGabZUpuvR4ECvBgaRZNeg2KmXIIFtiy9ukvE9lS3tFBD9
|
||||||
|
UUDsFwHx30Jg9ubLB9glprKYTwJWfAnC2p4wqMVoXPAXygfYQwDeeZItDGn9McgZWIWbk+XyAbRiGkuy
|
||||||
|
hSOjX4E8RxzNfwPuTdXKB6gWd7F0uwL5jniUjW5CrUuNR9ON8gGaxRxmGEpAhSsFDe40NHuy8GTa8m+A
|
||||||
|
+XI+I3Of7ne5azPOutPROqbBNX8u2n61YPnTiHmlfB7ZJnWon8k45btgQINjDh0qnXk46zmCi75i3PJX
|
||||||
|
0v90XPLtxXV/Hm5MGNA21YLHUxYJ9HCqEXcna3B9woQLviIaYQEaXMehbI+EBODm0R8o410CEnpCoaIY
|
||||||
|
8qQYR5Jw0rUV5zyZuDymJQMDbk/kS4Br47lkpkGtW42SkWToB1dDZY9GYncoFORz3G78C+Cdc3O+qLJH
|
||||||
|
0WYlCgPm572ZuOLT4YbfQIBcXB3XweLLpmexA1WjW3B0eB32DaxEqhiFuJ4QKD4LiKBLWdg7C1DQr8Ea
|
||||||
|
MldTB3qHUoqh2a1Ck3cnLo3l4AqZXvTtg8WbjfOeDNTRWoVrCw4Pr8VeOqlk3h0Cfhm5edBrAcbPswAn
|
||||||
|
HPuxuz+WYpgAk3MzGulhtlBSWsmQmzZ7syQ10ajqaCQ8TYeG1yD7x0qk9EVC+TUYUTTi8A4BwitSOwHe
|
||||||
|
zwLUD2Qxy5COWUcrmNV1ilnddczqqaXf0+ym4wx78LOezHfC7FKhdHQj8ocT0eqphMlm+F0j6lm5qGWl
|
||||||
|
JB1J+530jdSlZRKAx3SuiM2Ib7oz1MrM7m0odSbjIJ0yk07b4C6V1uYVj+lCxTfedjSxEnoueYPx2EE3
|
||||||
|
er0tAlXOY5JJYNvii5tYfzSw3ME46UXH36axlJQyR2DG/1sSQKxh2+0xSKCkLKM4829D0UzO/7e4SaNo
|
||||||
|
YondYVBQDJe+ExD8hlJikxFQLeoYNw+nzpfwGL4kwCcZASaKXwR1LtAFEl6QnhGgU0ZAUZ9RGomxi0QX
|
||||||
|
yNhBeisXgLLMjebUgjkXhD+4Jq73JQ87ogAAAABJRU5ErkJggg==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="MENU_ADD.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||||
|
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN7SURBVEhLrZVbSJNhGMe/Ujwk6sKy5iHKsqysaVojcbnN
|
||||||
|
cksrWmqZJ8o8pJEluqQTo6zuIoruoguJiG7C6KrDhUlUdnDTvk23jLmTzQSj+zf+Pe/HJC9Ew74H/mzw
|
||||||
|
vvx/z/t8//f7hPkq4nZYd+SdMMwmvhbatvDiRtm2TKa3arBnUAOjSLJrUO4ulCChbQsvbpI7lMmW9AmI
|
||||||
|
eycg4aOA5M/haPAXywdQi5ks/r2A5R8XYbU1ElliHM4FS+UD5BGAd55mi8Q2Rzy0IytwbbJaPoBWzGZp
|
||||||
|
tihsdyhgcCXR/Nfh9lSjfIA6Uc1y7QoUu5JRObYBjZ4s3P/VKh+gXSxgxq8pqPFsRIt3G9p9eXj4y/xv
|
||||||
|
gLlyPq36Id3vak8GTntz0TmuwZVgEbp/dmDZo+g5pXwS0y11WDidccp3yYgGh1x61LoNOO07gPOBclwP
|
||||||
|
1tL/XFwI7MLVoAFdE0Z0T3XgwZRZAt2basWtyXpcnajCuUAZjbAELZ4jUPbEQAJw87i3lPF+ASnWCKgo
|
||||||
|
hjwppm9pOO7ZjDM+NS6O68jAiBsTxRLgyvciMtOg0ZuFw9/SUehcCZU9DqkDEVCQzxG76S+Ad87N+aLK
|
||||||
|
HkublSgNmZ/1q3EpoEdX0EiAIlz+roc5kE/PIgfHxjbh4OgaFIwkYosYiyRrOBQfBETTpSwdnAEocWiw
|
||||||
|
isyzqINCl1KKYYNXhTb/DlwY1+ISmZ4PFMDsz8dZ33Y00VqNZxP2j67GLjqpZD4QDn4ZufmiFwJMH2YA
|
||||||
|
jrp2Y6cjgWKYgip3BlrpYXZQUjrJkJu2+/MktdGommgkPE37RlchfzgRG7/EQPkpDLE04qheAcJzUg8B
|
||||||
|
3swANA/vZGaXjlncNcwydoJZPE3M4m2k35Osy3mK3f3RTOY70OBRoWJsPYpHU9Hpq0Wl1fC7XtSzalHL
|
||||||
|
Kkg6knaI9JnUr2USgMd0tohNi2+66epkDd6tqHCnYy+dUk2nbfFWSGtzisd0vuIbrzvb2GF6LgZnMnLo
|
||||||
|
Rq+1ReOY+5BkEtq28OImFkcLK3ImSS86/jZNoKRUukIz/t+SAGI9y7bHI4WSspTizL8NZdM5/9/iJq1i
|
||||||
|
FUsdiISCYrjktYCwl5QSm4yAOlHHuHkUdb6Yx/AZAd7LCKii+EVT5wJdIOEp6TEB+mQElH0xSSMx9ZPo
|
||||||
|
Apl6Sa/kAlCWudGsmjfngvAH4HCuyOLK/ToAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BTT_STOP.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
|
ugAAAABJRU5ErkJggg==
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BTT_LOG.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="BTT_LOG.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
|||||||
@@ -50,7 +50,11 @@ Namespace DownloadObjects.STDownloader
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
If AppMode Then
|
If AppMode Then
|
||||||
If Now.Month.ValueBetween(6, 8) Then Text = "SCrawler: Happy LGBT Pride Month! :-)"
|
If Now.Month.ValueBetween(6, 8) Then
|
||||||
|
Text = "SCrawler: Happy LGBT Pride Month! :-)"
|
||||||
|
ElseIf Not MyYouTubeSettings Is Nothing AndAlso Not MyYouTubeSettings.ProgramText.IsEmptyString Then
|
||||||
|
Text = MyYouTubeSettings.ProgramText
|
||||||
|
End If
|
||||||
MyNotificator = New YTNotificator(Me)
|
MyNotificator = New YTNotificator(Me)
|
||||||
MyDownloaderSettings = MyYouTubeSettings
|
MyDownloaderSettings = MyYouTubeSettings
|
||||||
End If
|
End If
|
||||||
@@ -64,6 +68,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
BTT_LOG.Visible = False
|
BTT_LOG.Visible = False
|
||||||
BTT_INFO.Visible = False
|
BTT_INFO.Visible = False
|
||||||
BTT_DONATE.Visible = False
|
BTT_DONATE.Visible = False
|
||||||
|
BTT_BUG_REPORT.Visible = False
|
||||||
End If
|
End If
|
||||||
MyProgress.Visible = False
|
MyProgress.Visible = False
|
||||||
LoadData()
|
LoadData()
|
||||||
@@ -81,7 +86,13 @@ Namespace DownloadObjects.STDownloader
|
|||||||
If Not MyYouTubeSettings Is Nothing Then MyYouTubeSettings.Close()
|
If Not MyYouTubeSettings Is Nothing Then MyYouTubeSettings.Close()
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub VideoListForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
Private Sub VideoListForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
||||||
If e.KeyCode = Keys.Insert Then BTT_ADD.PerformClick() : e.Handled = True
|
Dim b As Boolean = True
|
||||||
|
Select Case e.KeyCode
|
||||||
|
Case Keys.Insert : BTT_ADD.PerformClick()
|
||||||
|
Case Keys.F5 : BTT_DOWN.PerformClick()
|
||||||
|
Case Else : b = False
|
||||||
|
End Select
|
||||||
|
If b Then e.Handled = True
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Refill, save list"
|
#Region "Refill, save list"
|
||||||
@@ -90,7 +101,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
If c.ListExists Then
|
If c.ListExists Then
|
||||||
c.Sort(New ContainerDateComparer)
|
c.Sort(New ContainerDateComparer)
|
||||||
SuspendLayout()
|
SuspendLayout()
|
||||||
For i% = c.Count - 1 To 0 Step -1 : ControlCreateAndAdd(c(i), True, i = 0) : Next
|
For i% = c.Count - 1 To 0 Step -1 : ControlCreateAndAdd(c(i), True, i = 0, True) : Next
|
||||||
ResumeLayout(False)
|
ResumeLayout(False)
|
||||||
PerformLayout()
|
PerformLayout()
|
||||||
End If
|
End If
|
||||||
@@ -115,11 +126,11 @@ Namespace DownloadObjects.STDownloader
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Controls"
|
#Region "Controls"
|
||||||
Protected Sub ControlCreateAndAdd(ByVal Container As IYouTubeMediaContainer, Optional ByVal DisableDownload As Boolean = False,
|
Protected Sub ControlCreateAndAdd(ByVal Container As IYouTubeMediaContainer, Optional ByVal DisableDownload As Boolean = False,
|
||||||
Optional ByVal PerformClick As Boolean = True)
|
Optional ByVal PerformClick As Boolean = True, Optional ByVal IsLoading As Boolean = False)
|
||||||
ControlInvokeFast(TP_CONTROLS, Sub()
|
ControlInvokeFast(TP_CONTROLS, Sub()
|
||||||
With TP_CONTROLS
|
With TP_CONTROLS
|
||||||
.SuspendLayout()
|
.SuspendLayout()
|
||||||
If DisableDownload Or Not MyDownloaderSettings.DownloadAutomatically Then Container.Save()
|
If Not IsLoading And (DisableDownload Or Not MyDownloaderSettings.DownloadAutomatically) Then Container.Save()
|
||||||
'.AutoScroll = True
|
'.AutoScroll = True
|
||||||
'.HorizontalScroll.Visible = False
|
'.HorizontalScroll.Visible = False
|
||||||
.RowStyles.Insert(0, New RowStyle(SizeType.Absolute, 60))
|
.RowStyles.Insert(0, New RowStyle(SizeType.Absolute, 60))
|
||||||
@@ -230,42 +241,61 @@ Namespace DownloadObjects.STDownloader
|
|||||||
BTT_ADD_NO_SHORTS.KeyClick, BTT_ADD_SHORTS_ONLY.KeyClick
|
BTT_ADD_NO_SHORTS.KeyClick, BTT_ADD_SHORTS_ONLY.KeyClick
|
||||||
Dim pForm As ParsingProgressForm = Nothing
|
Dim pForm As ParsingProgressForm = Nothing
|
||||||
Try
|
Try
|
||||||
Dim canProcess As Boolean = True
|
|
||||||
If TP_CONTROLS.Controls.Count >= MyYouTubeSettings.ItemsListLimit Then canProcess = TP_CONTROLS.Controls.Cast(Of MediaItem).ListExists(ControlsDownloaded)
|
|
||||||
If canProcess Then
|
|
||||||
Dim useCookies As Boolean = MyYouTubeSettings.DefaultUseCookies
|
Dim useCookies As Boolean = MyYouTubeSettings.DefaultUseCookies
|
||||||
|
Dim sTag$ = If(Sender?.Tag, String.Empty)
|
||||||
|
Dim disableDown As Boolean = e.Shift
|
||||||
If e.Control Then useCookies = True
|
If e.Control Then useCookies = True
|
||||||
Dim useCookiesParse As Boolean? = Nothing
|
Dim useCookiesParse As Boolean? = Nothing
|
||||||
If useCookies Then useCookiesParse = True
|
If useCookies Then useCookiesParse = True
|
||||||
|
Dim standardizeUrls As Boolean = MyYouTubeSettings.StandardizeURLs
|
||||||
|
Dim standardize As Func(Of String, String) = Function(input) If(standardizeUrls, YouTubeFunctions.StandardizeURL(input), input)
|
||||||
|
|
||||||
Dim c As IYouTubeMediaContainer = Nothing
|
Dim c As IYouTubeMediaContainer = Nothing
|
||||||
Dim url$ = String.Empty
|
Dim url$ = String.Empty
|
||||||
Dim GetDefault As Boolean = True
|
Dim GetDefault As Boolean = True
|
||||||
Dim GetShorts As Boolean = True
|
Dim GetShorts As Boolean = True
|
||||||
|
|
||||||
If Sender.Tag = "pls" Then
|
If sTag = "pls" Then
|
||||||
Using pf As New PlaylistArrayForm With {.DesignXML = DesignXML}
|
Using pf As New PlaylistArrayForm With {.DesignXML = DesignXML}
|
||||||
pf.ShowDialog()
|
pf.ShowDialog()
|
||||||
If pf.DialogResult = DialogResult.OK Then
|
If pf.DialogResult = DialogResult.OK Then
|
||||||
With pf.URLs
|
With pf.URLs
|
||||||
If .Count > 0 Then
|
If .Count > 0 Then
|
||||||
pForm = New ParsingProgressForm
|
pForm = New ParsingProgressForm(.Count)
|
||||||
pForm.Show()
|
pForm.Show(Me)
|
||||||
pForm.SetInitialValues(.Count, "Parsing playlists...")
|
pForm.SetInitialValues(.Count, "Parsing playlists...")
|
||||||
Dim containers As New List(Of IYouTubeMediaContainer)
|
Dim containers As New List(Of IYouTubeMediaContainer)
|
||||||
For Each u$ In .Self : containers.Add(YouTubeFunctions.Parse(u, useCookiesParse, pForm.Token, pForm.MyProgress, True, False)) : pForm.MyProgress.Perform() : Next
|
For Each u$ In .Self
|
||||||
|
containers.Add(YouTubeFunctions.Parse(standardize(u), useCookiesParse, pForm.Token, pForm.MyProgress, True, False))
|
||||||
|
pForm.NextPlaylist()
|
||||||
|
pForm.MyProgress.Perform()
|
||||||
|
Next
|
||||||
pForm.Dispose()
|
pForm.Dispose()
|
||||||
If containers.Count > 0 Then containers.ListDisposeRemoveAll(Function(cc) cc.HasError Or Not cc.Exists)
|
If containers.Count > 0 Then containers.ListDisposeRemoveAll(Function(cc) cc.HasError Or Not cc.Exists)
|
||||||
If containers.Count > 0 Then
|
If containers.Count > 0 Then
|
||||||
c = New Channel With {.UserTitle = IIf(pf.IsOneArtist, containers(0).UserTitle, "Playlists")}
|
c = New Channel With {
|
||||||
|
.UserTitle = IIf(pf.IsOneArtist, containers(0).UserTitle, "Playlists"),
|
||||||
|
.IsMusic = containers.Any(Function(cc) cc.IsMusic)
|
||||||
|
}
|
||||||
c.Elements.AddRange(containers)
|
c.Elements.AddRange(containers)
|
||||||
|
Dim path$ = c.Elements(0).File.PathWithSeparator
|
||||||
|
For Each list As List(Of String) In {
|
||||||
|
c.Elements.Select(Function(cc) cc.UserTitle).ListWithRemove(Function(cc) cc.IsEmptyString).ListIfNothing,
|
||||||
|
c.Elements.Select(Function(cc) cc.PlaylistTitle).ListWithRemove(Function(cc) cc.IsEmptyString).ListIfNothing
|
||||||
|
}
|
||||||
|
If list.Count > 0 AndAlso
|
||||||
|
(list.Count = 1 OrElse
|
||||||
|
ListAddList(Nothing, list, LAP.NotContainsOnly, EDP.ReturnValue).ListIfNothing.Count = 1) Then _
|
||||||
|
path &= $"{list(0)}\"
|
||||||
|
Next
|
||||||
|
c.File = path
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
End If
|
End If
|
||||||
End Using
|
End Using
|
||||||
Else
|
Else
|
||||||
Select Case CStr(Sender.Tag)
|
Select Case sTag
|
||||||
Case "ans" : GetShorts = False
|
Case "ans" : GetShorts = False
|
||||||
Case "as" : GetDefault = False : GetShorts = True
|
Case "as" : GetDefault = False : GetShorts = True
|
||||||
End Select
|
End Select
|
||||||
@@ -276,9 +306,9 @@ Namespace DownloadObjects.STDownloader
|
|||||||
If Not c Is Nothing OrElse YouTubeFunctions.IsMyUrl(url) Then
|
If Not c Is Nothing OrElse YouTubeFunctions.IsMyUrl(url) Then
|
||||||
If c Is Nothing Then
|
If c Is Nothing Then
|
||||||
pForm = New ParsingProgressForm
|
pForm = New ParsingProgressForm
|
||||||
pForm.Show()
|
pForm.Show(Me)
|
||||||
pForm.SetInitialValues(1, "Parsing data...")
|
pForm.SetInitialValues(1, "Parsing data...")
|
||||||
c = YouTubeFunctions.Parse(url, useCookiesParse, pForm.Token, pForm.MyProgress, GetDefault, GetShorts)
|
c = YouTubeFunctions.Parse(standardize(url), useCookiesParse, pForm.Token, pForm.MyProgress, GetDefault, GetShorts)
|
||||||
pForm.Dispose()
|
pForm.Dispose()
|
||||||
End If
|
End If
|
||||||
If Not c Is Nothing Then
|
If Not c Is Nothing Then
|
||||||
@@ -296,18 +326,11 @@ Namespace DownloadObjects.STDownloader
|
|||||||
If Not f Is Nothing Then
|
If Not f Is Nothing Then
|
||||||
If TypeOf f Is IDesignXMLContainer Then DirectCast(f, IDesignXMLContainer).DesignXML = DesignXML
|
If TypeOf f Is IDesignXMLContainer Then DirectCast(f, IDesignXMLContainer).DesignXML = DesignXML
|
||||||
f.ShowDialog()
|
f.ShowDialog()
|
||||||
If f.DialogResult = DialogResult.OK Then
|
If f.DialogResult = DialogResult.OK Then ControlCreateAndAdd(c, disableDown)
|
||||||
If TP_CONTROLS.Controls.Count >= MyYouTubeSettings.ItemsListLimit Then _
|
|
||||||
RemoveControls(TP_CONTROLS.Controls.Cast(Of MediaItem).LastOrDefault(ControlsDownloaded))
|
|
||||||
ControlCreateAndAdd(c)
|
|
||||||
End If
|
|
||||||
f.Dispose()
|
f.Dispose()
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
Else
|
|
||||||
MsgBoxE({$"Number of items to download exceeded!{vbCr}Reduce the number of items or increase the limit.", "New download"}, vbCritical)
|
|
||||||
End If
|
|
||||||
Catch oex As OperationCanceledException
|
Catch oex As OperationCanceledException
|
||||||
Catch dex As ObjectDisposedException
|
Catch dex As ObjectDisposedException
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
@@ -331,35 +354,43 @@ Namespace DownloadObjects.STDownloader
|
|||||||
ControlInvoke(TOOLBAR_TOP, BTT_STOP, Sub() BTT_STOP.Enabled = False, EDP.SendToLog)
|
ControlInvoke(TOOLBAR_TOP, BTT_STOP, Sub() BTT_STOP.Enabled = False, EDP.SendToLog)
|
||||||
MyJob.Cancel()
|
MyJob.Cancel()
|
||||||
End Sub
|
End Sub
|
||||||
|
#Region "Delete / Clear"
|
||||||
Private Sub BTT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_DELETE.Click
|
Private Sub BTT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_DELETE.Click
|
||||||
RemoveControls(ControlsChecked)
|
RemoveControls(ControlsChecked, True)
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_CLEAR_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_CLEAR_SELECTED.Click
|
||||||
|
RemoveControls(ControlsChecked, False)
|
||||||
End Sub
|
End Sub
|
||||||
Protected Overridable Sub BTT_CLEAR_DONE_Click(sender As Object, e As EventArgs) Handles BTT_CLEAR_DONE.Click
|
Protected Overridable Sub BTT_CLEAR_DONE_Click(sender As Object, e As EventArgs) Handles BTT_CLEAR_DONE.Click
|
||||||
RemoveControls(ControlsDownloaded)
|
RemoveControls(ControlsDownloaded, False)
|
||||||
End Sub
|
End Sub
|
||||||
Protected Overridable Sub BTT_CLEAR_ALL_Click(sender As Object, e As EventArgs) Handles BTT_CLEAR_ALL.Click
|
Protected Overridable Sub BTT_CLEAR_ALL_Click(sender As Object, e As EventArgs) Handles BTT_CLEAR_ALL.Click
|
||||||
RemoveControls()
|
RemoveControls(, False)
|
||||||
End Sub
|
End Sub
|
||||||
|
#End Region
|
||||||
Private Sub BTT_LOG_Click(sender As Object, e As EventArgs) Handles BTT_LOG.Click
|
Private Sub BTT_LOG_Click(sender As Object, e As EventArgs) Handles BTT_LOG.Click
|
||||||
MyMainLOG_ShowForm(DesignXML,,,, AddressOf UpdateLogButton)
|
MyMainLOG_ShowForm(DesignXML,,,, AddressOf UpdateLogButton)
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub UpdateLogButton()
|
Friend Sub UpdateLogButton()
|
||||||
If AppMode Then MyMainLOG_UpdateLogButton(BTT_LOG, TOOLBAR_TOP)
|
If AppMode Then MyMainLOG_UpdateLogButton(BTT_LOG, TOOLBAR_TOP)
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub BTT_BUG_REPORT_Click(sender As Object, e As EventArgs) Handles BTT_BUG_REPORT.Click
|
||||||
|
Try
|
||||||
|
With MyYouTubeSettings
|
||||||
|
Using f As New Editors.BugReporterForm(MyCache, .DesignXml, .ProgramText, My.Application.Info.Version,
|
||||||
|
True, .Self, .ProgramDescription) : f.ShowDialog() : End Using
|
||||||
|
End With
|
||||||
|
Catch
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
Private Sub BTT_DONATE_Click(sender As Object, e As EventArgs) Handles BTT_DONATE.Click
|
Private Sub BTT_DONATE_Click(sender As Object, e As EventArgs) Handles BTT_DONATE.Click
|
||||||
Try : Process.Start("https://github.com/AAndyProgram/SCrawler/blob/main/HowToSupport.md") : Catch : End Try
|
Try : Process.Start("https://github.com/AAndyProgram/SCrawler/blob/main/HowToSupport.md") : Catch : End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_INFO_Click(sender As Object, e As EventArgs) Handles BTT_INFO.Click
|
Private Sub BTT_INFO_Click(sender As Object, e As EventArgs) Handles BTT_INFO.Click
|
||||||
Try
|
ShowProgramInfo(MyYouTubeSettings.ProgramText.Value.IfNullOrEmpty("YouTube Downloader"),
|
||||||
MsgBoxE({$"YouTube Downloader v{My.Application.Info.Version}" & vbCr &
|
My.Application.Info.Version, False, True, MyYouTubeSettings, True,, False, MyYouTubeSettings.ProgramDescription)
|
||||||
$"Address: https://github.com/AAndyProgram/SCrawler" & vbCr &
|
|
||||||
"Created by Greek LGBT person Andy (Gay)",
|
|
||||||
"Program information"},,,,
|
|
||||||
{"OK", New MsgBoxButton("Go to site") With {.CallBack = Sub(r, n, b) Process.Start("https://github.com/AAndyProgram/SCrawler/releases")}})
|
|
||||||
Catch
|
|
||||||
End Try
|
|
||||||
End Sub
|
End Sub
|
||||||
Protected Overloads Sub RemoveControls(Optional ByVal Predicate As Predicate(Of MediaItem) = Nothing)
|
Protected Overloads Sub RemoveControls(Optional ByVal Predicate As Predicate(Of MediaItem) = Nothing, Optional ByVal RemoveFiles As Boolean = False)
|
||||||
ControlInvokeFast(TP_CONTROLS, Sub()
|
ControlInvokeFast(TP_CONTROLS, Sub()
|
||||||
With TP_CONTROLS
|
With TP_CONTROLS
|
||||||
If .Controls.Count > 0 Then
|
If .Controls.Count > 0 Then
|
||||||
@@ -374,7 +405,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
For i = rCnt.Count - 1 To 0 Step -1
|
For i = rCnt.Count - 1 To 0 Step -1
|
||||||
cnt = .Controls(rCnt(i))
|
cnt = .Controls(rCnt(i))
|
||||||
.Controls.RemoveAt(rCnt(i))
|
.Controls.RemoveAt(rCnt(i))
|
||||||
If Not cnt.MyContainer Is Nothing Then cnt.MyContainer.Delete(False)
|
If Not cnt.MyContainer Is Nothing Then cnt.MyContainer.Delete(RemoveFiles) : cnt.MyContainer.Dispose()
|
||||||
cnt.Dispose()
|
cnt.Dispose()
|
||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
@@ -390,19 +421,24 @@ Namespace DownloadObjects.STDownloader
|
|||||||
UpdateScrolls(Nothing, Nothing)
|
UpdateScrolls(Nothing, Nothing)
|
||||||
End Sub, EDP.None)
|
End Sub, EDP.None)
|
||||||
End Sub
|
End Sub
|
||||||
Private Overloads Sub RemoveControls(ByVal CNT As MediaItem)
|
Private Overloads Sub RemoveControls(ByVal CNT As MediaItem, Optional ByVal RemoveFiles As Boolean = False)
|
||||||
ControlInvokeFast(TP_CONTROLS, Sub()
|
ControlInvokeFast(TP_CONTROLS, Sub()
|
||||||
If Not CNT Is Nothing Then TP_CONTROLS.Controls.Remove(CNT) : OffsetControls()
|
If Not CNT Is Nothing Then
|
||||||
|
If Not CNT.MyContainer Is Nothing Then CNT.MyContainer.Delete(RemoveFiles) : CNT.MyContainer.Dispose()
|
||||||
|
TP_CONTROLS.Controls.Remove(CNT)
|
||||||
|
OffsetControls()
|
||||||
|
CNT.Dispose()
|
||||||
|
End If
|
||||||
End Sub, EDP.None)
|
End Sub, EDP.None)
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Media controls' handlers"
|
#Region "Media controls' handlers"
|
||||||
Private Sub MediaControl_FileDownloaded(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
Private Sub MediaControl_FileDownloaded(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
||||||
If MyDownloaderSettings.ShowNotifications Then MyNotificator.ShowNotification(Container.ToString(), Container.ThumbnailFile)
|
If MyDownloaderSettings.ShowNotifications Then MyNotificator.ShowNotification(Container.ToString(), Container.ThumbnailFile)
|
||||||
If MyDownloaderSettings.RemoveDownloadedAutomatically Then RemoveControls(Sender)
|
If MyDownloaderSettings.RemoveDownloadedAutomatically Then RemoveControls(Sender, False)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub MediaControl_Removal(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
Private Sub MediaControl_Removal(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
||||||
RemoveControls(Sender)
|
RemoveControls(Sender, False)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub MediaControl_DownloadAgain(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
Private Sub MediaControl_DownloadAgain(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
||||||
If Not Container.URL.IsEmptyString Then BufferText = Container.URL : BTT_ADD.PerformClick()
|
If Not Container.URL.IsEmptyString Then BufferText = Container.URL : BTT_ADD.PerformClick()
|
||||||
@@ -425,12 +461,16 @@ Namespace DownloadObjects.STDownloader
|
|||||||
UpdateLogButton()
|
UpdateLogButton()
|
||||||
End Sub
|
End Sub
|
||||||
Protected Sub AddToDownload(ByRef Item As MediaItem, ByVal RunThread As Boolean)
|
Protected Sub AddToDownload(ByRef Item As MediaItem, ByVal RunThread As Boolean)
|
||||||
If MyJob.Count = 0 OrElse Not MyJob.Items.Exists(Function(i) i.MyContainer.GetHashCode) Then
|
Try
|
||||||
Item.Pending = True
|
Dim hc% = Item.MyContainer.GetHashCode
|
||||||
|
If MyJob.Count = 0 OrElse Not MyJob.Items.Exists(Function(i) i.MyContainer.GetHashCode = hc) Then
|
||||||
MyJob.Add(Item)
|
MyJob.Add(Item)
|
||||||
Item.AddToQueue()
|
Item.AddToQueue()
|
||||||
If RunThread Then StartDownloading()
|
If RunThread Then StartDownloading()
|
||||||
End If
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[VideoListForm.AddToDownload]")
|
||||||
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub StartDownloading()
|
Private Sub StartDownloading()
|
||||||
If Not MyJob.Working And MyJob.Count > 0 Then
|
If Not MyJob.Working And MyJob.Count > 0 Then
|
||||||
@@ -450,37 +490,55 @@ Namespace DownloadObjects.STDownloader
|
|||||||
MyJob.Start()
|
MyJob.Start()
|
||||||
Const nf As ANumbers.Formats = ANumbers.Formats.Number
|
Const nf As ANumbers.Formats = ANumbers.Formats.Number
|
||||||
Dim t As New List(Of Task)
|
Dim t As New List(Of Task)
|
||||||
Dim i%
|
Dim i%, iAbs%
|
||||||
Dim __item As MediaItem
|
Dim __item As MediaItem
|
||||||
Dim Indexes As New List(Of Integer)
|
Dim Indexes As New List(Of Integer)
|
||||||
|
Dim IndexesToRemove As New List(Of Integer)
|
||||||
Dim maxJobCount% = MyDownloaderSettings.MaxJobsCount
|
Dim maxJobCount% = MyDownloaderSettings.MaxJobsCount
|
||||||
If maxJobCount <= 0 Then maxJobCount = 1
|
If maxJobCount <= 0 Then maxJobCount = 1
|
||||||
MyProgress.Visible = True
|
MyProgress.Visible = True
|
||||||
MyProgress.Maximum = MyJob.Count
|
MyProgress.Maximum = MyJob.Count
|
||||||
Do While MyJob.Count > 0 And Not MyJob.IsCancellationRequested
|
Do While MyJob.Count > 0 And Not MyJob.IsCancellationRequested
|
||||||
i = -1
|
i = -1
|
||||||
|
iAbs = -1
|
||||||
Indexes.Clear()
|
Indexes.Clear()
|
||||||
|
IndexesToRemove.Clear()
|
||||||
For Each __item In MyJob.Items
|
For Each __item In MyJob.Items
|
||||||
|
iAbs += 1
|
||||||
|
If Not __item.IsDisposed And Not If(__item.MyContainer?.DownloadState, Plugin.UserMediaStates.Unknown) = Plugin.UserMediaStates.Downloaded Then
|
||||||
i += 1
|
i += 1
|
||||||
If i <= maxJobCount - 1 Then
|
If i <= maxJobCount - 1 Then
|
||||||
Indexes.Add(i)
|
Indexes.Add(iAbs)
|
||||||
t.Add(Task.Run(Sub() __item.Download(MyJob.Token)))
|
t.Add(Task.Run(Sub() __item.Download(MyJob.Token)))
|
||||||
Else
|
Else
|
||||||
Exit For
|
Exit For
|
||||||
End If
|
End If
|
||||||
|
Else
|
||||||
|
IndexesToRemove.Add(iAbs)
|
||||||
|
End If
|
||||||
Next
|
Next
|
||||||
|
If IndexesToRemove.Count > 0 Then
|
||||||
|
For i = IndexesToRemove.Count - 1 To 0 Step -1
|
||||||
|
If Not MyJob.Items(IndexesToRemove(i)).IsDisposed Then MyJob.Items(IndexesToRemove(i)).Pending = False
|
||||||
|
MyJob.Items.RemoveAt(IndexesToRemove(i))
|
||||||
|
Next
|
||||||
|
End If
|
||||||
If t.Count > 0 Then
|
If t.Count > 0 Then
|
||||||
MyProgress.Information = $"Downloading {t.Count.NumToString(nf, PNumProv)}/{MyJob.Count.NumToString(nf, PNumProv)}"
|
MyProgress.Information = $"Downloading {t.Count.NumToString(nf, PNumProv)}/{MyJob.Count.NumToString(nf, PNumProv)}"
|
||||||
MyProgress.InformationTemporary = MyProgress.Information
|
MyProgress.InformationTemporary = MyProgress.Information
|
||||||
Task.WaitAll(t.ToArray)
|
Task.WaitAll(t.ToArray)
|
||||||
MyProgress.Perform(t.Count)
|
MyProgress.Perform(t.Count)
|
||||||
If Indexes.Count > 0 Then
|
If Indexes.Count > 0 Then
|
||||||
For i = Indexes.Count - 1 To 0 Step -1 : MyJob.Items.RemoveAt(Indexes(i)) : Next
|
For i = Indexes.Count - 1 To 0 Step -1
|
||||||
|
MyJob.Item(Indexes(i)).Pending = False
|
||||||
|
MyJob.Items.RemoveAt(Indexes(i))
|
||||||
|
Next
|
||||||
End If
|
End If
|
||||||
t.Clear()
|
t.Clear()
|
||||||
End If
|
End If
|
||||||
Loop
|
Loop
|
||||||
Indexes.Clear()
|
Indexes.Clear()
|
||||||
|
IndexesToRemove.Clear()
|
||||||
MyProgress.Done()
|
MyProgress.Done()
|
||||||
MyProgress.InformationTemporary = "Download completed"
|
MyProgress.InformationTemporary = "Download completed"
|
||||||
Catch aoex As ArgumentOutOfRangeException
|
Catch aoex As ArgumentOutOfRangeException
|
||||||
@@ -490,6 +548,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
MyProgress.InformationTemporary = "Download error"
|
MyProgress.InformationTemporary = "Download error"
|
||||||
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[VideoListForm.DownloadData]")
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[VideoListForm.DownloadData]")
|
||||||
Finally
|
Finally
|
||||||
|
MyProgress.Visible(, False) = False
|
||||||
MyJob.Finish()
|
MyJob.Finish()
|
||||||
EnableDownloadButtons(False)
|
EnableDownloadButtons(False)
|
||||||
End Try
|
End Try
|
||||||
|
|||||||
361
SCrawler.YouTube/Editors/BugReporterForm.Designer.vb
generated
Normal file
@@ -0,0 +1,361 @@
|
|||||||
|
' 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 Editors
|
||||||
|
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||||
|
Partial Public Class BugReporterForm : Inherits System.Windows.Forms.Form
|
||||||
|
<System.Diagnostics.DebuggerNonUserCode()>
|
||||||
|
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||||
|
Try
|
||||||
|
If disposing AndAlso components IsNot Nothing Then
|
||||||
|
components.Dispose()
|
||||||
|
End If
|
||||||
|
Finally
|
||||||
|
MyBase.Dispose(disposing)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private components As System.ComponentModel.IContainer
|
||||||
|
<System.Diagnostics.DebuggerStepThrough()>
|
||||||
|
Private Sub InitializeComponent()
|
||||||
|
Me.components = New System.ComponentModel.Container()
|
||||||
|
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim TP_BUTTONS As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(BugReporterForm))
|
||||||
|
Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton5 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Me.BTT_EMAIL = New System.Windows.Forms.Button()
|
||||||
|
Me.BTT_GITHUB = New System.Windows.Forms.Button()
|
||||||
|
Me.BTT_COPY = New System.Windows.Forms.Button()
|
||||||
|
Me.BTT_CANCEL = New System.Windows.Forms.Button()
|
||||||
|
Me.BTT_ANON = New System.Windows.Forms.Button()
|
||||||
|
Me.TT_MAIN = New System.Windows.Forms.ToolTip(Me.components)
|
||||||
|
Me.TXT_DESCR = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
|
Me.TXT_URL_PROFILE = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
|
Me.TXT_URL_POST = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
|
Me.TXT_REPRODUCE = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
|
Me.TXT_EXPECT = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
|
Me.TXT_LOG = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
|
Me.TXT_FILES = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
|
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TP_BUTTONS = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TP_MAIN.SuspendLayout()
|
||||||
|
TP_BUTTONS.SuspendLayout()
|
||||||
|
CType(Me.TXT_DESCR, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.TXT_URL_PROFILE, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.TXT_URL_POST, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.TXT_REPRODUCE, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.TXT_EXPECT, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.TXT_LOG, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.TXT_FILES, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
Me.SuspendLayout()
|
||||||
|
'
|
||||||
|
'TP_MAIN
|
||||||
|
'
|
||||||
|
TP_MAIN.ColumnCount = 1
|
||||||
|
TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_MAIN.Controls.Add(Me.TXT_DESCR, 0, 0)
|
||||||
|
TP_MAIN.Controls.Add(Me.TXT_URL_PROFILE, 0, 1)
|
||||||
|
TP_MAIN.Controls.Add(Me.TXT_URL_POST, 0, 2)
|
||||||
|
TP_MAIN.Controls.Add(Me.TXT_REPRODUCE, 0, 3)
|
||||||
|
TP_MAIN.Controls.Add(Me.TXT_EXPECT, 0, 4)
|
||||||
|
TP_MAIN.Controls.Add(Me.TXT_LOG, 0, 5)
|
||||||
|
TP_MAIN.Controls.Add(TP_BUTTONS, 0, 7)
|
||||||
|
TP_MAIN.Controls.Add(Me.TXT_FILES, 0, 6)
|
||||||
|
TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_MAIN.Location = New System.Drawing.Point(0, 0)
|
||||||
|
TP_MAIN.Name = "TP_MAIN"
|
||||||
|
TP_MAIN.RowCount = 8
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
|
||||||
|
TP_MAIN.Size = New System.Drawing.Size(584, 461)
|
||||||
|
TP_MAIN.TabIndex = 0
|
||||||
|
'
|
||||||
|
'TP_BUTTONS
|
||||||
|
'
|
||||||
|
TP_BUTTONS.ColumnCount = 6
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100.0!))
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100.0!))
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100.0!))
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100.0!))
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100.0!))
|
||||||
|
TP_BUTTONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
|
||||||
|
TP_BUTTONS.Controls.Add(Me.BTT_EMAIL, 2, 0)
|
||||||
|
TP_BUTTONS.Controls.Add(Me.BTT_GITHUB, 3, 0)
|
||||||
|
TP_BUTTONS.Controls.Add(Me.BTT_COPY, 4, 0)
|
||||||
|
TP_BUTTONS.Controls.Add(Me.BTT_CANCEL, 5, 0)
|
||||||
|
TP_BUTTONS.Controls.Add(Me.BTT_ANON, 1, 0)
|
||||||
|
TP_BUTTONS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_BUTTONS.Location = New System.Drawing.Point(0, 431)
|
||||||
|
TP_BUTTONS.Margin = New System.Windows.Forms.Padding(0)
|
||||||
|
TP_BUTTONS.Name = "TP_BUTTONS"
|
||||||
|
TP_BUTTONS.RowCount = 1
|
||||||
|
TP_BUTTONS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_BUTTONS.Size = New System.Drawing.Size(584, 30)
|
||||||
|
TP_BUTTONS.TabIndex = 7
|
||||||
|
'
|
||||||
|
'BTT_EMAIL
|
||||||
|
'
|
||||||
|
Me.BTT_EMAIL.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_EMAIL.Location = New System.Drawing.Point(187, 3)
|
||||||
|
Me.BTT_EMAIL.Name = "BTT_EMAIL"
|
||||||
|
Me.BTT_EMAIL.Size = New System.Drawing.Size(94, 24)
|
||||||
|
Me.BTT_EMAIL.TabIndex = 1
|
||||||
|
Me.BTT_EMAIL.Text = "email"
|
||||||
|
Me.TT_MAIN.SetToolTip(Me.BTT_EMAIL, "Create a message to send via email.")
|
||||||
|
Me.BTT_EMAIL.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'BTT_GITHUB
|
||||||
|
'
|
||||||
|
Me.BTT_GITHUB.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_GITHUB.Location = New System.Drawing.Point(287, 3)
|
||||||
|
Me.BTT_GITHUB.Name = "BTT_GITHUB"
|
||||||
|
Me.BTT_GITHUB.Size = New System.Drawing.Size(94, 24)
|
||||||
|
Me.BTT_GITHUB.TabIndex = 2
|
||||||
|
Me.BTT_GITHUB.Text = "GitHub"
|
||||||
|
Me.TT_MAIN.SetToolTip(Me.BTT_GITHUB, "Create a MarkDown message to post to GitHub.")
|
||||||
|
Me.BTT_GITHUB.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'BTT_COPY
|
||||||
|
'
|
||||||
|
Me.BTT_COPY.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_COPY.Location = New System.Drawing.Point(387, 3)
|
||||||
|
Me.BTT_COPY.Name = "BTT_COPY"
|
||||||
|
Me.BTT_COPY.Size = New System.Drawing.Size(94, 24)
|
||||||
|
Me.BTT_COPY.TabIndex = 3
|
||||||
|
Me.BTT_COPY.Text = "Copy"
|
||||||
|
Me.TT_MAIN.SetToolTip(Me.BTT_COPY, "Create a message and copy to your clipboard.")
|
||||||
|
Me.BTT_COPY.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'BTT_CANCEL
|
||||||
|
'
|
||||||
|
Me.BTT_CANCEL.DialogResult = System.Windows.Forms.DialogResult.Cancel
|
||||||
|
Me.BTT_CANCEL.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_CANCEL.Location = New System.Drawing.Point(487, 3)
|
||||||
|
Me.BTT_CANCEL.Name = "BTT_CANCEL"
|
||||||
|
Me.BTT_CANCEL.Size = New System.Drawing.Size(94, 24)
|
||||||
|
Me.BTT_CANCEL.TabIndex = 4
|
||||||
|
Me.BTT_CANCEL.Text = "Cancel"
|
||||||
|
Me.BTT_CANCEL.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'BTT_ANON
|
||||||
|
'
|
||||||
|
Me.BTT_ANON.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.BTT_ANON.Location = New System.Drawing.Point(87, 3)
|
||||||
|
Me.BTT_ANON.Name = "BTT_ANON"
|
||||||
|
Me.BTT_ANON.Size = New System.Drawing.Size(94, 24)
|
||||||
|
Me.BTT_ANON.TabIndex = 0
|
||||||
|
Me.BTT_ANON.Text = "Anon message"
|
||||||
|
Me.TT_MAIN.SetToolTip(Me.BTT_ANON, resources.GetString("BTT_ANON.ToolTip"))
|
||||||
|
Me.BTT_ANON.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'TXT_DESCR
|
||||||
|
'
|
||||||
|
ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton1.Dock = System.Windows.Forms.DockStyle.Top
|
||||||
|
ActionButton1.Name = "Clear"
|
||||||
|
ActionButton1.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
Me.TXT_DESCR.Buttons.Add(ActionButton1)
|
||||||
|
Me.TXT_DESCR.CaptionDock = System.Windows.Forms.DockStyle.Top
|
||||||
|
Me.TXT_DESCR.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.None
|
||||||
|
Me.TXT_DESCR.CaptionVisible = False
|
||||||
|
Me.TXT_DESCR.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_DESCR.GroupBoxed = True
|
||||||
|
Me.TXT_DESCR.GroupBoxText = "Describe the bug or write your message"
|
||||||
|
Me.TXT_DESCR.Lines = New String(-1) {}
|
||||||
|
Me.TXT_DESCR.Location = New System.Drawing.Point(3, 3)
|
||||||
|
Me.TXT_DESCR.Multiline = True
|
||||||
|
Me.TXT_DESCR.Name = "TXT_DESCR"
|
||||||
|
Me.TXT_DESCR.Size = New System.Drawing.Size(578, 69)
|
||||||
|
Me.TXT_DESCR.TabIndex = 0
|
||||||
|
Me.TXT_DESCR.TextToolTip = "A clear and concise description of what the bug is"
|
||||||
|
Me.TXT_DESCR.TextToolTipEnabled = True
|
||||||
|
'
|
||||||
|
'TXT_URL_PROFILE
|
||||||
|
'
|
||||||
|
ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton2.Name = "Clear"
|
||||||
|
ActionButton2.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
Me.TXT_URL_PROFILE.Buttons.Add(ActionButton2)
|
||||||
|
Me.TXT_URL_PROFILE.CaptionText = "Profile URL"
|
||||||
|
Me.TXT_URL_PROFILE.CaptionWidth = 75.0R
|
||||||
|
Me.TXT_URL_PROFILE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_URL_PROFILE.Lines = New String(-1) {}
|
||||||
|
Me.TXT_URL_PROFILE.Location = New System.Drawing.Point(3, 78)
|
||||||
|
Me.TXT_URL_PROFILE.Name = "TXT_URL_PROFILE"
|
||||||
|
Me.TXT_URL_PROFILE.Size = New System.Drawing.Size(578, 22)
|
||||||
|
Me.TXT_URL_PROFILE.TabIndex = 1
|
||||||
|
'
|
||||||
|
'TXT_URL_POST
|
||||||
|
'
|
||||||
|
ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton3.Name = "Clear"
|
||||||
|
ActionButton3.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
Me.TXT_URL_POST.Buttons.Add(ActionButton3)
|
||||||
|
Me.TXT_URL_POST.CaptionText = "Post URL"
|
||||||
|
Me.TXT_URL_POST.CaptionWidth = 75.0R
|
||||||
|
Me.TXT_URL_POST.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_URL_POST.Lines = New String(-1) {}
|
||||||
|
Me.TXT_URL_POST.Location = New System.Drawing.Point(3, 106)
|
||||||
|
Me.TXT_URL_POST.Name = "TXT_URL_POST"
|
||||||
|
Me.TXT_URL_POST.Size = New System.Drawing.Size(578, 22)
|
||||||
|
Me.TXT_URL_POST.TabIndex = 2
|
||||||
|
'
|
||||||
|
'TXT_REPRODUCE
|
||||||
|
'
|
||||||
|
ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton4.Dock = System.Windows.Forms.DockStyle.Top
|
||||||
|
ActionButton4.Name = "Clear"
|
||||||
|
ActionButton4.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
Me.TXT_REPRODUCE.Buttons.Add(ActionButton4)
|
||||||
|
Me.TXT_REPRODUCE.CaptionDock = System.Windows.Forms.DockStyle.Top
|
||||||
|
Me.TXT_REPRODUCE.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.None
|
||||||
|
Me.TXT_REPRODUCE.CaptionVisible = False
|
||||||
|
Me.TXT_REPRODUCE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_REPRODUCE.GroupBoxed = True
|
||||||
|
Me.TXT_REPRODUCE.GroupBoxText = "To Reproduce"
|
||||||
|
Me.TXT_REPRODUCE.Lines = New String(-1) {}
|
||||||
|
Me.TXT_REPRODUCE.Location = New System.Drawing.Point(3, 134)
|
||||||
|
Me.TXT_REPRODUCE.Multiline = True
|
||||||
|
Me.TXT_REPRODUCE.Name = "TXT_REPRODUCE"
|
||||||
|
Me.TXT_REPRODUCE.Size = New System.Drawing.Size(578, 69)
|
||||||
|
Me.TXT_REPRODUCE.TabIndex = 3
|
||||||
|
Me.TXT_REPRODUCE.TextToolTip = "Steps to reproduce the behavior:" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "1. Do something" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "2. See error"
|
||||||
|
Me.TXT_REPRODUCE.TextToolTipEnabled = True
|
||||||
|
'
|
||||||
|
'TXT_EXPECT
|
||||||
|
'
|
||||||
|
ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton5.Dock = System.Windows.Forms.DockStyle.Top
|
||||||
|
ActionButton5.Name = "Clear"
|
||||||
|
ActionButton5.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
Me.TXT_EXPECT.Buttons.Add(ActionButton5)
|
||||||
|
Me.TXT_EXPECT.CaptionDock = System.Windows.Forms.DockStyle.Top
|
||||||
|
Me.TXT_EXPECT.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.None
|
||||||
|
Me.TXT_EXPECT.CaptionVisible = False
|
||||||
|
Me.TXT_EXPECT.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_EXPECT.GroupBoxed = True
|
||||||
|
Me.TXT_EXPECT.GroupBoxText = "Expected behavior"
|
||||||
|
Me.TXT_EXPECT.Lines = New String(-1) {}
|
||||||
|
Me.TXT_EXPECT.Location = New System.Drawing.Point(3, 209)
|
||||||
|
Me.TXT_EXPECT.Multiline = True
|
||||||
|
Me.TXT_EXPECT.Name = "TXT_EXPECT"
|
||||||
|
Me.TXT_EXPECT.Size = New System.Drawing.Size(578, 69)
|
||||||
|
Me.TXT_EXPECT.TabIndex = 4
|
||||||
|
Me.TXT_EXPECT.TextToolTip = "A clear and concise description of what you expected to happen."
|
||||||
|
Me.TXT_EXPECT.TextToolTipEnabled = True
|
||||||
|
'
|
||||||
|
'TXT_LOG
|
||||||
|
'
|
||||||
|
ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton6.Dock = System.Windows.Forms.DockStyle.Top
|
||||||
|
ActionButton6.Name = "Open"
|
||||||
|
ActionButton6.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
||||||
|
ActionButton6.ToolTipText = "Select log files to add their text to the message"
|
||||||
|
ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton7.Dock = System.Windows.Forms.DockStyle.Top
|
||||||
|
ActionButton7.Name = "Clear"
|
||||||
|
ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton7.ToolTipText = "Empty"
|
||||||
|
Me.TXT_LOG.Buttons.Add(ActionButton6)
|
||||||
|
Me.TXT_LOG.Buttons.Add(ActionButton7)
|
||||||
|
Me.TXT_LOG.CaptionDock = System.Windows.Forms.DockStyle.Top
|
||||||
|
Me.TXT_LOG.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.None
|
||||||
|
Me.TXT_LOG.CaptionVisible = False
|
||||||
|
Me.TXT_LOG.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_LOG.GroupBoxed = True
|
||||||
|
Me.TXT_LOG.GroupBoxText = "Log data"
|
||||||
|
Me.TXT_LOG.Lines = New String(-1) {}
|
||||||
|
Me.TXT_LOG.Location = New System.Drawing.Point(3, 284)
|
||||||
|
Me.TXT_LOG.Multiline = True
|
||||||
|
Me.TXT_LOG.Name = "TXT_LOG"
|
||||||
|
Me.TXT_LOG.Size = New System.Drawing.Size(578, 69)
|
||||||
|
Me.TXT_LOG.TabIndex = 5
|
||||||
|
'
|
||||||
|
'TXT_FILES
|
||||||
|
'
|
||||||
|
ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton8.Dock = System.Windows.Forms.DockStyle.Top
|
||||||
|
ActionButton8.Name = "Add"
|
||||||
|
ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Add
|
||||||
|
ActionButton8.ToolTipText = "Add files"
|
||||||
|
ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton9.Dock = System.Windows.Forms.DockStyle.Top
|
||||||
|
ActionButton9.Name = "Clear"
|
||||||
|
ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton9.ToolTipText = "Clear files"
|
||||||
|
Me.TXT_FILES.Buttons.Add(ActionButton8)
|
||||||
|
Me.TXT_FILES.Buttons.Add(ActionButton9)
|
||||||
|
Me.TXT_FILES.CaptionDock = System.Windows.Forms.DockStyle.Top
|
||||||
|
Me.TXT_FILES.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.None
|
||||||
|
Me.TXT_FILES.CaptionVisible = False
|
||||||
|
Me.TXT_FILES.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_FILES.GroupBoxed = True
|
||||||
|
Me.TXT_FILES.GroupBoxText = "Files"
|
||||||
|
Me.TXT_FILES.Lines = New String(-1) {}
|
||||||
|
Me.TXT_FILES.Location = New System.Drawing.Point(3, 359)
|
||||||
|
Me.TXT_FILES.Multiline = True
|
||||||
|
Me.TXT_FILES.Name = "TXT_FILES"
|
||||||
|
Me.TXT_FILES.Size = New System.Drawing.Size(578, 69)
|
||||||
|
Me.TXT_FILES.TabIndex = 6
|
||||||
|
Me.TXT_FILES.TextBoxReadOnly = True
|
||||||
|
Me.TXT_FILES.TextToolTip = "Attach files to your message (only works with anonymous message)"
|
||||||
|
Me.TXT_FILES.TextToolTipEnabled = True
|
||||||
|
'
|
||||||
|
'BugReporterForm
|
||||||
|
'
|
||||||
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
|
Me.CancelButton = Me.BTT_CANCEL
|
||||||
|
Me.ClientSize = New System.Drawing.Size(584, 461)
|
||||||
|
Me.Controls.Add(TP_MAIN)
|
||||||
|
Me.KeyPreview = True
|
||||||
|
Me.MinimumSize = New System.Drawing.Size(600, 500)
|
||||||
|
Me.Name = "BugReporterForm"
|
||||||
|
Me.Text = "New message"
|
||||||
|
TP_MAIN.ResumeLayout(False)
|
||||||
|
TP_BUTTONS.ResumeLayout(False)
|
||||||
|
CType(Me.TXT_DESCR, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
CType(Me.TXT_URL_PROFILE, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
CType(Me.TXT_URL_POST, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
CType(Me.TXT_REPRODUCE, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
CType(Me.TXT_EXPECT, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
CType(Me.TXT_LOG, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
CType(Me.TXT_FILES, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
Me.ResumeLayout(False)
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private WithEvents TXT_DESCR As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
Private WithEvents TXT_URL_PROFILE As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
Private WithEvents TXT_URL_POST As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
Private WithEvents TXT_REPRODUCE As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
Private WithEvents TXT_EXPECT As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
Private WithEvents TXT_LOG As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
Private WithEvents TT_MAIN As ToolTip
|
||||||
|
Private WithEvents BTT_EMAIL As Button
|
||||||
|
Private WithEvents BTT_GITHUB As Button
|
||||||
|
Private WithEvents BTT_COPY As Button
|
||||||
|
Private WithEvents BTT_CANCEL As Button
|
||||||
|
Private WithEvents BTT_ANON As Button
|
||||||
|
Private WithEvents TXT_FILES As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
225
SCrawler.YouTube/Editors/BugReporterForm.resx
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="TP_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
|
<data name="ActionButton1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton2.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton3.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton4.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton5.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton6.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
|
WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP
|
||||||
|
aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+
|
||||||
|
5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8
|
||||||
|
vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB
|
||||||
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton7.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="TP_BUTTONS.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TT_MAIN.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="BTT_ANON.ToolTip" xml:space="preserve">
|
||||||
|
<value>Send an anonymous message.
|
||||||
|
The developer will not be able you contact you back.
|
||||||
|
You can attach files (images, photos) to your message.
|
||||||
|
If you would like a response from the developer, response, please add your contact details (email, Discord, etc.).</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton8.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
||||||
|
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE
|
||||||
|
QVRIS62WWWxMURjHL220JW1HausmlFrDFKUhnUGH6bRFzJ2idImlC0Vp2mlji1A8iNhCPIjIRES8EU+W
|
||||||
|
h2oEtbSDTk3HNNM7S01VKsXjkb/vXBo3k1Ee7sMvmZzzzf//ne/+z50RAAxL1MUIG4G/YAv3HSVhF5Vw
|
||||||
|
IYNdz3LadVj9RgdTB+HQYYPHIJuE1ocSdlEJFzG+1bPRLQLinglIeCkg+XUkKvz56hnkOfQs/rmA8S9H
|
||||||
|
YEp7FDI64tAQtKhnsMapZ7zzNHsUFnbGY4VzIk70l6hnIH4wsDR7NBZ3apDrSqL5T8eFgUr1DLZ78lim
|
||||||
|
Q4N8VzK29MxEpZSBa4M16hnU+c3M9CEFpdJsVHsXos63DDcHrf9nQEXD5VymwW/5USLNwl5vJhp7dTgW
|
||||||
|
NML2pR7jbsUMS+KdMTa5Q8NQxinfBU4dRFcOyjy52OtbhwOBDTgZLKPPmTgY0ON4MBdNfSbYBupxY8Aq
|
||||||
|
G10dqMG5/nIc7ytGQ6CQRliAamkTN/g1Ai4e95Qy3iogpX0UtBRDnhRzdxq2SXOxz5eFQ70rScCEU335
|
||||||
|
ssGxj0YS06HSm4GN3ekwdE2C1hGH1LZR0JDOJof5jwHvnIvzTa0jlooTYfktvt+fhcOBHDQFTWRgxJGP
|
||||||
|
ObAGsulZLMLWnjlY756K5c4JmNcRi6T2SGheCIihS2l5ozAo6NRhMolnUAcGV6IcwwqvFrX+JTjYuwKH
|
||||||
|
SfRAYDms/mzs9y1GFe2VSnOw1j0FejqpLN4WCX4ZufiIBwLMLxQGm12rsLQzgWKYgmLPLNTQw6ynpDSS
|
||||||
|
IBet8y+TqaVRVdFIeJrWuCcj+/0EzH43BomvIhBLI45uFiDcJ+6QwROFwa6+Amb9bGFNg6Xs9Ncd7Oy3
|
||||||
|
Knb2eyU7/20nu9y/m136tIvEl6BC0qKoZwby3alo9JVhj7T5R7m/kJVIIityi8zyXmTiW+I10SqyIQNb
|
||||||
|
uIgNwYuuf25kFd75KPKkI49OmUWnrfYWyXv/wBb2cijhhVf6a9lGei65XclYRDd6mj0GWz2iLBJaH0rY
|
||||||
|
RSVc5Eywmhm7kuQXHX+bJlBStrh+zTi0PpSwi0q4yNFAOVvgiEcKJWUsxZn/NhT+znlofShhF5VwkRpv
|
||||||
|
MUtti4KGYjj6sYCIh5QSu4oG27stjItHU+cjeQzvkcFzFQ2KnSKLoc4FukDCXeI2GbSoaFD4ziyPxNxK
|
||||||
|
0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton9.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
|
tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
|
||||||
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
238
SCrawler.YouTube/Editors/BugReporterForm.vb
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
' 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
|
||||||
|
Imports System.ComponentModel
|
||||||
|
Imports PersonalUtilities.Bots
|
||||||
|
Imports PersonalUtilities.Tools
|
||||||
|
Imports PersonalUtilities.Forms
|
||||||
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
|
Imports PersonalUtilities.Functions.XML
|
||||||
|
Imports PersonalUtilities.Functions.Messaging
|
||||||
|
Imports BStyle = PersonalUtilities.Bots.IBot.Styles
|
||||||
|
Imports ADB = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons
|
||||||
|
Namespace Editors
|
||||||
|
Public Class BugReporterForm
|
||||||
|
#Region "Declarations"
|
||||||
|
Private Const MsgTitle As String = "Bug report"
|
||||||
|
Private ReadOnly MyView As FormView
|
||||||
|
Private ReadOnly MyFieldsChecker As FieldsChecker
|
||||||
|
Private MyProgramInfo As String
|
||||||
|
Private MyProgramInfoPopulated As Boolean = False
|
||||||
|
Private ReadOnly MyProgramText As String
|
||||||
|
Private ReadOnly MyCurrentVersion As Version
|
||||||
|
Private ReadOnly MyIsYouTube As Boolean
|
||||||
|
Private ReadOnly MyEnvirData As DownloadObjects.STDownloader.IDownloaderSettings
|
||||||
|
Private ReadOnly MyAdditText As String
|
||||||
|
Private ReadOnly MyCache As CacheKeeper
|
||||||
|
#End Region
|
||||||
|
#Region "Initializer"
|
||||||
|
Public Sub New(ByVal Cache As CacheKeeper, ByVal DesignXML As EContainer, ByVal ProgramText As String, ByVal CurrentVersion As Version, ByVal IsYouTube As Boolean,
|
||||||
|
ByVal EnvirData As DownloadObjects.STDownloader.IDownloaderSettings, Optional ByVal AdditText As String = Nothing)
|
||||||
|
InitializeComponent()
|
||||||
|
MyView = New FormView(Me, DesignXML)
|
||||||
|
MyFieldsChecker = New FieldsChecker
|
||||||
|
MyCache = Cache
|
||||||
|
MyProgramText = ProgramText
|
||||||
|
MyCurrentVersion = CurrentVersion
|
||||||
|
MyIsYouTube = IsYouTube
|
||||||
|
MyEnvirData = EnvirData
|
||||||
|
MyAdditText = AdditText
|
||||||
|
Icon = ImageRenderer.GetIcon(My.Resources.MailPic_16, EDP.ReturnValue)
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Form handlers"
|
||||||
|
Private Async Sub BugReporterForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||||
|
MyView.Import()
|
||||||
|
MyView.SetFormSize()
|
||||||
|
With MyFieldsChecker
|
||||||
|
.AddControl(Of String)(TXT_DESCR, TXT_DESCR.GroupBoxText)
|
||||||
|
.EndLoaderOperations()
|
||||||
|
End With
|
||||||
|
TXT_LOG.Text = MyMainLOG
|
||||||
|
Await Task.Run(Sub()
|
||||||
|
MyProgramInfo = ProgramInfo.GetProgramText(MyProgramText.IfNullOrEmpty(IIf(MyIsYouTube, "YouTube downloader", "SCrawler")),
|
||||||
|
MyCurrentVersion, MyIsYouTube, MyEnvirData, MyAdditText)
|
||||||
|
MyProgramInfoPopulated = True
|
||||||
|
End Sub)
|
||||||
|
End Sub
|
||||||
|
Private Sub BugReporterForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
|
||||||
|
MyView.Dispose()
|
||||||
|
MyFieldsChecker.Dispose()
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Message"
|
||||||
|
Private Sub WaitLoadingDone()
|
||||||
|
While Not MyProgramInfoPopulated : Threading.Thread.Sleep(100) : End While
|
||||||
|
End Sub
|
||||||
|
Private Function CreateMessage(ByVal ForGitHub As Boolean, Optional ByVal ForDiscord As Boolean = False) As Object
|
||||||
|
Try
|
||||||
|
Dim nl$ = vbNewLine.StringDup(2)
|
||||||
|
Dim data As New List(Of BotMessage)
|
||||||
|
Dim t$ = String.Empty
|
||||||
|
Dim discordAppendNl As Action = Sub() data.Add(New BotMessage(vbNewLine))
|
||||||
|
Dim appendNewLine As Action = Sub() If ForDiscord Then data.Add(New BotMessage(nl)) Else t &= nl
|
||||||
|
Dim ghBold As Func(Of String, Object) = Function(ByVal input As String) As Object
|
||||||
|
If ForDiscord Then
|
||||||
|
Return New BotMessage(input, BStyle.Bold)
|
||||||
|
Else
|
||||||
|
Return String.Format("{1}{0}{1}", input, IIf(ForGitHub, "**", ""))
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Dim appendData As Action(Of Object) = Sub(ByVal input As Object)
|
||||||
|
If ForDiscord Then
|
||||||
|
discordAppendNl.Invoke
|
||||||
|
data.Add(If(TypeOf input Is BotMessage, input, New BotMessage(input.ToString)))
|
||||||
|
Else
|
||||||
|
t.StringAppendLine(input)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
appendData(ghBold("Describe the bug"))
|
||||||
|
appendData(TXT_DESCR.Text)
|
||||||
|
If Not TXT_URL_PROFILE.IsEmptyString Then appendData($"Profile URL: {TXT_URL_PROFILE.Text}")
|
||||||
|
If Not TXT_URL_POST.IsEmptyString Then appendData($"Post URL: {TXT_URL_POST.Text}")
|
||||||
|
If Not TXT_REPRODUCE.IsEmptyString Then
|
||||||
|
appendNewLine.Invoke
|
||||||
|
appendData(ghBold("To Reproduce"))
|
||||||
|
appendData(TXT_REPRODUCE.Text)
|
||||||
|
End If
|
||||||
|
If Not TXT_EXPECT.IsEmptyString Then
|
||||||
|
appendNewLine.Invoke
|
||||||
|
appendData(ghBold("Expected behavior"))
|
||||||
|
appendData(TXT_EXPECT.Text)
|
||||||
|
End If
|
||||||
|
If Not TXT_LOG.IsEmptyString Then
|
||||||
|
appendNewLine.Invoke
|
||||||
|
If ForDiscord Then
|
||||||
|
data.Add(New BotMessage(TXT_LOG.Text, BStyle.Code))
|
||||||
|
ElseIf ForGitHub Then
|
||||||
|
appendData($"<details><summary>Log data</summary><pre>{TXT_LOG.Text}</pre></details>")
|
||||||
|
Else
|
||||||
|
appendData(ghBold("LOG"))
|
||||||
|
appendData(TXT_LOG.Text)
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
|
||||||
|
WaitLoadingDone()
|
||||||
|
appendNewLine.Invoke
|
||||||
|
appendData(ghBold("Release information:"))
|
||||||
|
appendData(MyProgramInfo)
|
||||||
|
|
||||||
|
Return If(ForDiscord, data, t)
|
||||||
|
Catch ex As Exception
|
||||||
|
Return ErrorsDescriber.Execute(EDP.SendToLog + EDP.ReturnValue, ex, "[BugReporterForm.CreateMessage]")
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
Private Function ValidateFields(Optional ByVal SimpleMode As Boolean = False) As Boolean
|
||||||
|
If MyFieldsChecker.AllParamsOK Then
|
||||||
|
Dim opts$ = String.Empty
|
||||||
|
If TXT_URL_PROFILE.IsEmptyString Then opts.StringAppend("profile URL")
|
||||||
|
If TXT_URL_POST.IsEmptyString Then opts.StringAppend("post URL")
|
||||||
|
If TXT_LOG.Text.IsEmptyString Then opts.StringAppend("LOG")
|
||||||
|
Return opts.IsEmptyString OrElse SimpleMode OrElse
|
||||||
|
MsgBoxE({$"You haven't completed the following fields: {opts}.{vbCr}Are you sure you want to skip them?",
|
||||||
|
MsgTitle}, vbExclamation,,, {"Process", "Cancel"}) = 0
|
||||||
|
End If
|
||||||
|
Return False
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
|
#Region "Buttons"
|
||||||
|
Private Sub BTT_ANON_Click(sender As Object, e As EventArgs) Handles BTT_ANON.Click
|
||||||
|
Try
|
||||||
|
If ValidateFields(True) Then
|
||||||
|
Dim files As List(Of SFile) = Nothing
|
||||||
|
If TXT_FILES.Lines.ListExists Then files.ListAddList(TXT_FILES.Lines, LAP.NotContainsOnly)
|
||||||
|
Dim msgs As New List(Of BotMessage)
|
||||||
|
Dim isSimple As Boolean = False
|
||||||
|
Dim aMsg$ = String.Empty
|
||||||
|
Select Case MsgBoxE(New MMessage("Do you want to send a simple message or report a bug?", MsgTitle,
|
||||||
|
{New MsgBoxButton("Nice", "Say something nice to the developer." & vbCr &
|
||||||
|
"You can also attach cat picture :-)" & vbCr &
|
||||||
|
$"The message will be sent from the '{TXT_DESCR.GroupBoxText}' field."),
|
||||||
|
New MsgBoxButton("Simple", $"The developer will only receive the message from the '{TXT_DESCR.GroupBoxText}' field."),
|
||||||
|
New MsgBoxButton("Bug report", "The developer will receive a full bug report."),
|
||||||
|
"Cancel"}, vbQuestion) With {.ButtonsPerRow = 4, .DefaultButton = 2, .CancelButton = 3}).Index
|
||||||
|
Case 0 : msgs.Add(TXT_DESCR.Text) : aMsg = $"{vbCr}Thank you very much. I'm very grateful for your messages. You are awesome!"
|
||||||
|
Case 1 : isSimple = True : msgs.Add(TXT_DESCR.Text)
|
||||||
|
Case 2 : msgs = CreateMessage(False, True)
|
||||||
|
Case Else : Exit Sub
|
||||||
|
End Select
|
||||||
|
If msgs.ListExists Then
|
||||||
|
Dim nErr As New ErrorsDescriber(EDP.None)
|
||||||
|
Using d As New DiscordBot With {.Credential = DiscordWebHook, .User = "Anonymous user"}
|
||||||
|
d.SendMessage(New BotMessage(msgs.ToArray), EDP.ThrowException)
|
||||||
|
If isSimple Then WaitLoadingDone() : d.SendMessage(MyProgramInfo, nErr)
|
||||||
|
If files.ListExists Then files.ForEach(Sub(ff) d.SendFile(BotMessage.FromFile(ff),, nErr))
|
||||||
|
End Using
|
||||||
|
msgs.Clear()
|
||||||
|
MsgBoxE({$"Your message has been sent to the developer.{aMsg}", MsgTitle})
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
MsgBoxE({"Something is wrong. Your message has not been sent to the developer.", MsgTitle}, vbCritical)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_EMAIL_Click(sender As Object, e As EventArgs) Handles BTT_EMAIL.Click
|
||||||
|
If ValidateFields() Then
|
||||||
|
Dim msg$ = CreateMessage(False)
|
||||||
|
Dim cmd$ = "START mailto:""andyprogram@proton.me?to=andyprogram@proton.me&subject=Application%%20bug%%20report"""
|
||||||
|
BufferText = msg
|
||||||
|
MsgBoxE({"The message has been copied to your clipboard. Click OK and paste this message into the window that opens.", MsgTitle})
|
||||||
|
Using b As New BatchExecutor
|
||||||
|
b.FileExchanger = MyCache.NewInstance(Of BatchFileExchanger)
|
||||||
|
b.Execute(cmd)
|
||||||
|
End Using
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_GITHUB_Click(sender As Object, e As EventArgs) Handles BTT_GITHUB.Click
|
||||||
|
If ValidateFields() Then
|
||||||
|
Dim msg$ = CreateMessage(True)
|
||||||
|
BufferText = msg
|
||||||
|
MsgBoxE({"The message has been copied to your clipboard. Create a new issue on GitHub and paste this message.", MsgTitle})
|
||||||
|
Try : Process.Start("https://github.com/AAndyProgram/SCrawler/issues/new?assignees=&labels=&projects=&template=custom.md&title=") : Catch : End Try
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_COPY_Click(sender As Object, e As EventArgs) Handles BTT_COPY.Click
|
||||||
|
If ValidateFields() Then
|
||||||
|
Dim msg$ = CreateMessage(MsgBoxE({"Will you post this message on GitHub?", MsgTitle}, vbQuestion + vbYesNo) = vbYes)
|
||||||
|
BufferText = msg
|
||||||
|
MsgBoxE({"The message has been copied to your clipboard.", MsgTitle})
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_CANCEL_Click(sender As Object, e As EventArgs) Handles BTT_CANCEL.Click
|
||||||
|
DialogResult = DialogResult.Cancel
|
||||||
|
Close()
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Logs"
|
||||||
|
Private Sub TXT_LOG_ActionOnButtonClick(ByVal Sender As Object, ByVal e As ActionButtonEventArgs) Handles TXT_LOG.ActionOnButtonClick
|
||||||
|
If e.DefaultButton = ADB.Open Then
|
||||||
|
Dim files As List(Of SFile) = SFile.SelectFiles("LOGs\",, "Select log files", "Log files|*.txt|All files|*.*", EDP.ReturnValue)
|
||||||
|
If files.ListExists Then
|
||||||
|
Dim t$
|
||||||
|
For Each file As SFile In files
|
||||||
|
t = file.GetText
|
||||||
|
If Not t.IsEmptyString Then _
|
||||||
|
TXT_LOG.Text = $"{TXT_LOG.Text}{If(TXT_LOG.Text.IsEmptyString, String.Empty, vbNewLine.StringDup(2))}{file.Name}{vbNewLine}{t}"
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub TXT_FILES_ActionOnButtonClick(ByVal Sender As Object, ByVal e As ActionButtonEventArgs) Handles TXT_FILES.ActionOnButtonClick
|
||||||
|
Try
|
||||||
|
If e.DefaultButton = ADB.Add Then
|
||||||
|
Dim f As List(Of SFile) = SFile.SelectFiles(,, "Select files to be sent", "Images|*.jpg;*.jpeg;*.png;*.webp;*.webm;*.gif|All files|*.*", EDP.ReturnValue)
|
||||||
|
If f.ListExists Then TXT_FILES.Lines = ListAddList(Nothing, TXT_FILES.Lines.Concat(f.Select(Function(ff) ff.ToString)),
|
||||||
|
LAP.NotContainsOnly, EDP.ReturnValue).ToArray
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
@@ -7,6 +7,8 @@
|
|||||||
' This program is distributed in the hope that it will be useful,
|
' This program is distributed in the hope that it will be useful,
|
||||||
' but WITHOUT ANY WARRANTY
|
' but WITHOUT ANY WARRANTY
|
||||||
Imports PersonalUtilities.Tools
|
Imports PersonalUtilities.Tools
|
||||||
|
Imports PersonalUtilities.Tools.Web
|
||||||
|
Imports PersonalUtilities.Functions.Messaging
|
||||||
Imports SCrawler.DownloadObjects.STDownloader
|
Imports SCrawler.DownloadObjects.STDownloader
|
||||||
Public Module MainModShared
|
Public Module MainModShared
|
||||||
Public Property BATCH As BatchExecutor
|
Public Property BATCH As BatchExecutor
|
||||||
@@ -36,4 +38,98 @@ Public Module MainModShared
|
|||||||
End If
|
End If
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
Public Sub ShowProgramInfo(ByVal ProgramText As String, ByVal CurrentVersion As Version, ByVal CheckForUpdate As Boolean, ByVal Force As Boolean,
|
||||||
|
ByVal EnvirData As IDownloaderSettings, ByVal IsYouTube As Boolean,
|
||||||
|
Optional ByRef NewVersionDestination As String = Nothing, Optional ByVal ShowNewVersionNotification As Boolean = True,
|
||||||
|
Optional ByVal AdditText As String = Nothing)
|
||||||
|
Try
|
||||||
|
Dim GoToSite As New MsgBoxButton("Go to site") With {.CallBack = Sub(r, n, b) Process.Start("https://github.com/AAndyProgram/SCrawler/releases/latest")}
|
||||||
|
If CheckForUpdate AndAlso GitHub.NewVersionExists(CurrentVersion, "AAndyProgram", "SCrawler", NewVersionDestination) Then
|
||||||
|
If ShowNewVersionNotification Or Force Then
|
||||||
|
If MsgBoxE(New MMessage($"{ProgramText}: new version detected" & vbCr &
|
||||||
|
$"Current version: {CurrentVersion}" & vbCr &
|
||||||
|
$"New version: {NewVersionDestination}",
|
||||||
|
"New version",
|
||||||
|
{"OK", GoToSite, "Disable notifications"})) = 2 Then ShowNewVersionNotification = False
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
If Force Then
|
||||||
|
Dim pVer$ = $"{ProgramText} v{CurrentVersion} ({IIf(Environment.Is64BitProcess, "x64", "x86")})"
|
||||||
|
Dim eText$ = Editors.ProgramInfo.GetProgramBaseText(ProgramText, CurrentVersion, AdditText)
|
||||||
|
Dim m As New MMessage($"{pVer}" & vbCr &
|
||||||
|
"Address: https://github.com/AAndyProgram/SCrawler" & vbCr &
|
||||||
|
"Created by Greek LGBT person Andy (Gay)",
|
||||||
|
"Program information",
|
||||||
|
{"OK",
|
||||||
|
GoToSite,
|
||||||
|
New MsgBoxButton("Environment", "Show program environment") With {
|
||||||
|
.IsDialogResultButton = False,
|
||||||
|
.CallBack = Sub(r, n, b) ShowProgramEnvir(EnvirData, IsYouTube, eText)}
|
||||||
|
}) With {.DefaultButton = 0, .CancelButton = 0}
|
||||||
|
If Not AdditText.IsEmptyString Then m.Text &= $"{vbCr}{AdditText}"
|
||||||
|
m.Show()
|
||||||
|
End If
|
||||||
|
ShowNewVersionNotification = True
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub ShowProgramEnvir(ByVal EnvirData As IDownloaderSettings, ByVal IsYouTube As Boolean, ByVal AdditCopyText As String)
|
||||||
|
Dim m As New MMessage(Editors.ProgramInfo.GetProgramEnvirText(EnvirData, IsYouTube), "Program environment", {"OK", "Copy"}) With {.Editable = True, .DefaultButton = 0, .CancelButton = 0}
|
||||||
|
If m.Text = Editors.ProgramInfo.EnvironmentNotFound Then m.Style = vbCritical
|
||||||
|
m.Text = $"{AdditCopyText}{vbCr}{m.Text}"
|
||||||
|
If m.Show() = 1 Then BufferText = m.Text
|
||||||
|
End Sub
|
||||||
End Module
|
End Module
|
||||||
|
Namespace Editors
|
||||||
|
Public NotInheritable Class ProgramInfo
|
||||||
|
Public Const EnvironmentNotFound As String = "Environment not found"
|
||||||
|
Private Sub New()
|
||||||
|
End Sub
|
||||||
|
Public Shared Function GetProgramText(ByVal ProgramText As String, ByVal CurrentVersion As Version, ByVal IsYouTube As Boolean,
|
||||||
|
ByVal EnvirData As IDownloaderSettings, Optional ByVal AdditText As String = Nothing) As String
|
||||||
|
Return GetProgramBaseText(ProgramText, CurrentVersion, AdditText) & vbNewLine & GetProgramEnvirText(EnvirData, IsYouTube)
|
||||||
|
End Function
|
||||||
|
Public Shared Function GetProgramBaseText(ByVal ProgramText As String, ByVal CurrentVersion As Version, Optional ByVal AdditText As String = Nothing) As String
|
||||||
|
Dim pVer$ = $"{ProgramText} v{CurrentVersion} ({IIf(Environment.Is64BitProcess, "x64", "x86")})"
|
||||||
|
Dim WinVer$ = String.Empty
|
||||||
|
Try : WinVer = $"OS: {My.Computer.Info.OSFullName} ({IIf(Environment.Is64BitOperatingSystem, "x64", "x86")})" : Catch : End Try
|
||||||
|
Return pVer.StringDup(1).StringAppendLine(WinVer).StringAppendLine(AdditText)
|
||||||
|
End Function
|
||||||
|
Public Shared Function GetProgramEnvirText(ByVal EnvirData As IDownloaderSettings, ByVal IsYouTube As Boolean) As String
|
||||||
|
Try
|
||||||
|
Dim output$ = String.Empty
|
||||||
|
Using b As New BatchExecutor(True)
|
||||||
|
Dim f As SFile
|
||||||
|
Dim cmd$, ff$, vText$
|
||||||
|
|
||||||
|
For i% = 0 To IIf(IsYouTube, 1, 3)
|
||||||
|
cmd = "--version"
|
||||||
|
Select Case i
|
||||||
|
Case 0 : f = EnvirData.ENVIR_FFMPEG : ff = "ffmpeg" : cmd = "-version"
|
||||||
|
Case 1 : f = EnvirData.ENVIR_YTDLP : ff = "yt-dlp"
|
||||||
|
Case 2 : f = EnvirData.ENVIR_GDL : ff = "gallery-dl"
|
||||||
|
Case 3 : f = EnvirData.ENVIR_CURL : ff = "cURL"
|
||||||
|
Case Else : f = Nothing : ff = Nothing : cmd = Nothing
|
||||||
|
End Select
|
||||||
|
If Not ff.IsEmptyString Then
|
||||||
|
If f.IsEmptyString Then
|
||||||
|
output.StringAppendLine($"[{ff}] NOT FOUND")
|
||||||
|
Else
|
||||||
|
b.Reset()
|
||||||
|
b.Execute($"""{f}"" {cmd}", EDP.None)
|
||||||
|
If b.OutputData.Count > 3 Then vText = b.OutputData(3) Else vText = "undefined"
|
||||||
|
output.StringAppendLine($"{ff} version: {vText}")
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
|
||||||
|
If output.IsEmptyString Then output = EnvironmentNotFound
|
||||||
|
End Using
|
||||||
|
Return output
|
||||||
|
Catch ex As Exception
|
||||||
|
Return ErrorsDescriber.Execute(EDP.SendToLog + EDP.ReturnValue, ex, "[ProgramInfo.GetProgramEnvirText]", String.Empty)
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
@@ -13,7 +13,7 @@ Imports System.Runtime.InteropServices
|
|||||||
<Assembly: AssemblyDescription("YouTube plugin environment")>
|
<Assembly: AssemblyDescription("YouTube plugin environment")>
|
||||||
<Assembly: AssemblyCompany("AndyProgram")>
|
<Assembly: AssemblyCompany("AndyProgram")>
|
||||||
<Assembly: AssemblyProduct("SCrawler.YouTube")>
|
<Assembly: AssemblyProduct("SCrawler.YouTube")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2023")>
|
<Assembly: AssemblyCopyright("Copyright © 2024")>
|
||||||
<Assembly: AssemblyTrademark("AndyProgram")>
|
<Assembly: AssemblyTrademark("AndyProgram")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
|||||||
' by using the '*' as shown below:
|
' by using the '*' as shown below:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("2023.4.28.0")>
|
<Assembly: AssemblyVersion("2023.11.24.0")>
|
||||||
<Assembly: AssemblyFileVersion("2023.4.28.0")>
|
<Assembly: AssemblyFileVersion("2023.11.24.0")>
|
||||||
<Assembly: NeutralResourcesLanguage("en")>
|
<Assembly: NeutralResourcesLanguage("en")>
|
||||||
|
|||||||
20
SCrawler.YouTube/My Project/Resources.Designer.vb
generated
@@ -130,6 +130,16 @@ Namespace My.Resources
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
'''</summary>
|
||||||
|
Public ReadOnly Property MailPic_16() As System.Drawing.Bitmap
|
||||||
|
Get
|
||||||
|
Dim obj As Object = ResourceManager.GetObject("MailPic_16", resourceCulture)
|
||||||
|
Return CType(obj,System.Drawing.Bitmap)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
|
||||||
'''<summary>
|
'''<summary>
|
||||||
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
'''</summary>
|
'''</summary>
|
||||||
@@ -150,6 +160,16 @@ Namespace My.Resources
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
'''</summary>
|
||||||
|
Public ReadOnly Property StartPic_Green_16() As System.Drawing.Bitmap
|
||||||
|
Get
|
||||||
|
Dim obj As Object = ResourceManager.GetObject("StartPic_Green_16", resourceCulture)
|
||||||
|
Return CType(obj,System.Drawing.Bitmap)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
|
||||||
'''<summary>
|
'''<summary>
|
||||||
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
'''</summary>
|
'''</summary>
|
||||||
|
|||||||
@@ -139,12 +139,18 @@
|
|||||||
<data name="LinkPic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="LinkPic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\LinkPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\LinkPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="MailPic_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\MailPic_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
<data name="RulerPic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="RulerPic_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\RulerPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\RulerPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SettingsPic_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="SettingsPic_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\SettingsPic_16.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\SettingsPic_16.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="StartPic_Green_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\StartPic_Green_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
<data name="VideoCamera_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="VideoCamera_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\VideoCamera_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\VideoCamera_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ Namespace API.YouTube.Objects
|
|||||||
ReadOnly Property MediaType As UMTypes
|
ReadOnly Property MediaType As UMTypes
|
||||||
ReadOnly Property MediaState As UMStates
|
ReadOnly Property MediaState As UMStates
|
||||||
Property IsMusic As Boolean
|
Property IsMusic As Boolean
|
||||||
|
Property IsShorts As Boolean
|
||||||
Property ID As String
|
Property ID As String
|
||||||
Property Description As String
|
Property Description As String
|
||||||
Property PlaylistID As String
|
Property PlaylistID As String
|
||||||
|
|||||||
@@ -22,17 +22,8 @@ Imports UMStates = SCrawler.Plugin.UserMediaStates
|
|||||||
Imports CollectionModes = PersonalUtilities.Functions.XML.Objects.IXMLValuesCollection.Modes
|
Imports CollectionModes = PersonalUtilities.Functions.XML.Objects.IXMLValuesCollection.Modes
|
||||||
Namespace API.YouTube.Objects
|
Namespace API.YouTube.Objects
|
||||||
Public Class ContainerDateComparer : Implements IComparer(Of IYouTubeMediaContainer)
|
Public Class ContainerDateComparer : Implements IComparer(Of IYouTubeMediaContainer)
|
||||||
Private ReadOnly NullDateValue As New Date
|
|
||||||
Public Function Compare(ByVal x As IYouTubeMediaContainer, ByVal y As IYouTubeMediaContainer) As Integer Implements IComparer(Of IYouTubeMediaContainer).Compare
|
Public Function Compare(ByVal x As IYouTubeMediaContainer, ByVal y As IYouTubeMediaContainer) As Integer Implements IComparer(Of IYouTubeMediaContainer).Compare
|
||||||
If x.DateDownloaded = NullDateValue And y.DateDownloaded = NullDateValue Then
|
|
||||||
Return x.DateCreated.CompareTo(y.DateCreated) * -1
|
Return x.DateCreated.CompareTo(y.DateCreated) * -1
|
||||||
ElseIf x.DateDownloaded = NullDateValue Then
|
|
||||||
Return -1
|
|
||||||
ElseIf y.DateDownloaded = NullDateValue Then
|
|
||||||
Return 1
|
|
||||||
Else
|
|
||||||
Return x.DateDownloaded.CompareTo(y.DateDownloaded) * -1
|
|
||||||
End If
|
|
||||||
End Function
|
End Function
|
||||||
End Class
|
End Class
|
||||||
Public MustInherit Class YouTubeMediaContainerBase : Implements IYouTubeMediaContainer
|
Public MustInherit Class YouTubeMediaContainerBase : Implements IYouTubeMediaContainer
|
||||||
@@ -74,6 +65,7 @@ Namespace API.YouTube.Objects
|
|||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
Protected _MediaState As UMStates = UMStates.Unknown
|
Protected _MediaState As UMStates = UMStates.Unknown
|
||||||
|
Protected _MediaStateOnLoad As UMStates = UMStates.Unknown
|
||||||
<XMLEC> Public Property MediaState As UMStates Implements IYouTubeMediaContainer.MediaState, IUserMedia.DownloadState
|
<XMLEC> Public Property MediaState As UMStates Implements IYouTubeMediaContainer.MediaState, IUserMedia.DownloadState
|
||||||
Get
|
Get
|
||||||
If _MediaState = UMStates.Unknown And HasElements Then
|
If _MediaState = UMStates.Unknown And HasElements Then
|
||||||
@@ -119,8 +111,9 @@ Namespace API.YouTube.Objects
|
|||||||
_SiteKey = Key
|
_SiteKey = Key
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
|
<XMLEC> Public Property AccountName As String = String.Empty Implements IDownloadableMedia.AccountName
|
||||||
<XMLEC(Name_IsMusic)> Public Property IsMusic As Boolean = False Implements IYouTubeMediaContainer.IsMusic
|
<XMLEC(Name_IsMusic)> Public Property IsMusic As Boolean = False Implements IYouTubeMediaContainer.IsMusic
|
||||||
<XMLEC> Public Property IsShorts As Boolean = False
|
<XMLEC> Public Property IsShorts As Boolean = False Implements IYouTubeMediaContainer.IsShorts
|
||||||
<XMLEC> Public Property ID As String Implements IYouTubeMediaContainer.ID, IUserMedia.PostID
|
<XMLEC> Public Property ID As String Implements IYouTubeMediaContainer.ID, IUserMedia.PostID
|
||||||
<XMLEC> Public Property Title As String Implements IDownloadableMedia.Title
|
<XMLEC> Public Property Title As String Implements IDownloadableMedia.Title
|
||||||
<XMLEC> Public Property Description As String Implements IYouTubeMediaContainer.Description
|
<XMLEC> Public Property Description As String Implements IYouTubeMediaContainer.Description
|
||||||
@@ -440,7 +433,7 @@ Namespace API.YouTube.Objects
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Protected _Exists As Boolean = True
|
Protected _Exists As Boolean = True
|
||||||
Public ReadOnly Property Exists As Boolean Implements IDownloadableMedia.Exists
|
Public Overridable ReadOnly Property Exists As Boolean Implements IDownloadableMedia.Exists
|
||||||
Get
|
Get
|
||||||
If Not _Exists Then
|
If Not _Exists Then
|
||||||
Return False
|
Return False
|
||||||
@@ -550,6 +543,16 @@ Namespace API.YouTube.Objects
|
|||||||
Return _FileIsPlaylistObject
|
Return _FileIsPlaylistObject
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
Private _AbsolutePath As Boolean = False
|
||||||
|
Public Property AbsolutePath As Boolean
|
||||||
|
Get
|
||||||
|
Return _AbsolutePath
|
||||||
|
End Get
|
||||||
|
Set(ByVal ap As Boolean)
|
||||||
|
_AbsolutePath = ap
|
||||||
|
If Elements.Count > 0 Then Elements.ForEach(Sub(e As YouTubeMediaContainerBase) e.AbsolutePath = ap)
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
Public Overridable Property File As SFile Implements IYouTubeMediaContainer.File
|
Public Overridable Property File As SFile Implements IYouTubeMediaContainer.File
|
||||||
Get
|
Get
|
||||||
Return _File
|
Return _File
|
||||||
@@ -557,11 +560,16 @@ Namespace API.YouTube.Objects
|
|||||||
Set(ByVal f As SFile)
|
Set(ByVal f As SFile)
|
||||||
Select Case ObjectType
|
Select Case ObjectType
|
||||||
Case YouTubeMediaType.Channel : _File = f.Path
|
Case YouTubeMediaType.Channel : _File = f.Path
|
||||||
Case YouTubeMediaType.PlayList : _File.Path = $"{f.PathWithSeparator}{GetPlayListTitle()}"
|
Case YouTubeMediaType.PlayList
|
||||||
|
If AbsolutePath Then
|
||||||
|
_File.Path = f.Path
|
||||||
|
Else
|
||||||
|
_File.Path = $"{f.PathWithSeparator}{GetPlayListTitle()}"
|
||||||
|
End If
|
||||||
Case YouTubeMediaType.Single
|
Case YouTubeMediaType.Single
|
||||||
If PlaylistCount > 0 And Not FileIgnorePlaylist Then
|
If PlaylistCount > 0 And Not FileIgnorePlaylist Then
|
||||||
_File.Path = f.Path
|
_File.Path = f.Path
|
||||||
Dim pls$ = GetPlayListTitle()
|
Dim pls$ = If(AbsolutePath, String.Empty, GetPlayListTitle())
|
||||||
If Not _File.Path.Contains(pls) Then _File.Path = $"{_File.PathWithSeparator(Not pls.IsEmptyString)}{pls}"
|
If Not _File.Path.Contains(pls) Then _File.Path = $"{_File.PathWithSeparator(Not pls.IsEmptyString)}{pls}"
|
||||||
ElseIf Not f.Name.IsEmptyString Then
|
ElseIf Not f.Name.IsEmptyString Then
|
||||||
_File = f
|
_File = f
|
||||||
@@ -600,7 +608,9 @@ Namespace API.YouTube.Objects
|
|||||||
Bitrate = 0
|
Bitrate = 0
|
||||||
_MediaType = UMTypes.Undefined
|
_MediaType = UMTypes.Undefined
|
||||||
If SelectedVideoIndex >= 0 Then
|
If SelectedVideoIndex >= 0 Then
|
||||||
cmd.StringAppend($"bv*[format_id={SelectedVideo.ID}]")
|
'URGENT: 2023.3.4 -> 2023.7.6
|
||||||
|
'cmd.StringAppend($"bv*[format_id={SelectedVideo.ID}]")
|
||||||
|
cmd.StringAppend(SelectedVideo.ID)
|
||||||
_Size = SelectedVideo.Size
|
_Size = SelectedVideo.Size
|
||||||
_MediaType = UMTypes.Video
|
_MediaType = UMTypes.Video
|
||||||
Height = SelectedVideo.Height
|
Height = SelectedVideo.Height
|
||||||
@@ -611,7 +621,9 @@ Namespace API.YouTube.Objects
|
|||||||
End If
|
End If
|
||||||
If SelectedAudioIndex >= 0 Then
|
If SelectedAudioIndex >= 0 Then
|
||||||
Dim atCodec$
|
Dim atCodec$
|
||||||
cmd.StringAppend($"ba*[format_id={SelectedAudio.ID}]", "+")
|
'URGENT: 2023.3.4 -> 2023.7.6
|
||||||
|
'cmd.StringAppend($"ba*[format_id={SelectedAudio.ID}]", "+")
|
||||||
|
cmd.StringAppend(SelectedAudio.ID, "+")
|
||||||
If OutputAudioCodec.StringToLower = ac3 Then
|
If OutputAudioCodec.StringToLower = ac3 Then
|
||||||
PostProcessing_AudioAC3 = True
|
PostProcessing_AudioAC3 = True
|
||||||
formats.StringAppend($"--audio-format {aac}", " ")
|
formats.StringAppend($"--audio-format {aac}", " ")
|
||||||
@@ -642,7 +654,10 @@ Namespace API.YouTube.Objects
|
|||||||
subs = $"--write-subs --write-auto-subs --sub-format {OutputSubtitlesFormat.StringToLower} --sub-langs ""{subs}"" --convert-subs {OutputSubtitlesFormat.StringToLower}"
|
subs = $"--write-subs --write-auto-subs --sub-format {OutputSubtitlesFormat.StringToLower} --sub-langs ""{subs}"" --convert-subs {OutputSubtitlesFormat.StringToLower}"
|
||||||
End If
|
End If
|
||||||
If Not cmd.IsEmptyString Then
|
If Not cmd.IsEmptyString Then
|
||||||
cmd = $"yt-dlp -f ""{cmd}"""
|
'URGENT: 2023.3.4 -> 2023.7.6
|
||||||
|
'cmd = $"yt-dlp -f ""{cmd}"""
|
||||||
|
cmd = $"yt-dlp -f {cmd}"
|
||||||
|
If Not MyYouTubeSettings.ReplaceModificationDate Then cmd &= " --no-mtime"
|
||||||
cmd.StringAppend(formats, " ")
|
cmd.StringAppend(formats, " ")
|
||||||
cmd.StringAppend(subs, " ")
|
cmd.StringAppend(subs, " ")
|
||||||
cmd.StringAppend(YouTubeFunctions.GetCookiesCommand(WithCookies, YouTubeCookieNetscapeFile), " ")
|
cmd.StringAppend(YouTubeFunctions.GetCookiesCommand(WithCookies, YouTubeCookieNetscapeFile), " ")
|
||||||
@@ -710,6 +725,19 @@ Namespace API.YouTube.Objects
|
|||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Download"
|
#Region "Download"
|
||||||
|
Protected Shared Sub CreateUrlFile(ByVal URL As String, ByVal File As SFile)
|
||||||
|
Try
|
||||||
|
File.Extension = "url"
|
||||||
|
Using t As New TextSaver(File)
|
||||||
|
t.AppendLine("[InternetShortcut]")
|
||||||
|
t.AppendLine("IDList=")
|
||||||
|
t.AppendLine($"URL={URL}")
|
||||||
|
t.AppendLine()
|
||||||
|
t.Save(EDP.None)
|
||||||
|
End Using
|
||||||
|
Catch ex As Exception
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
Private ReadOnly DownloadProgressPattern As RParams = RParams.DMS("\[download\]\s*([\d\.,]+)", 1, EDP.ReturnValue)
|
Private ReadOnly DownloadProgressPattern As RParams = RParams.DMS("\[download\]\s*([\d\.,]+)", 1, EDP.ReturnValue)
|
||||||
Public Property Progress As MyProgress Implements IYouTubeMediaContainer.Progress
|
Public Property Progress As MyProgress Implements IYouTubeMediaContainer.Progress
|
||||||
Private Property IDownloadableMedia_Progress As Object Implements IDownloadableMedia.Progress
|
Private Property IDownloadableMedia_Progress As Object Implements IDownloadableMedia.Progress
|
||||||
@@ -808,6 +836,13 @@ Namespace API.YouTube.Objects
|
|||||||
Try
|
Try
|
||||||
Dim url$ = $"https://{IIf(IsMusic, "music", "www")}.youtube.com/playlist?list={PlsId}"
|
Dim url$ = $"https://{IIf(IsMusic, "music", "www")}.youtube.com/playlist?list={PlsId}"
|
||||||
Dim r$
|
Dim r$
|
||||||
|
If DownloadObjects.STDownloader.MyDownloaderSettings.CreateUrlFiles Then
|
||||||
|
Dim ff As SFile = f
|
||||||
|
ff.Name = "album"
|
||||||
|
ff.Extension = "url"
|
||||||
|
CreateUrlFile(url, ff)
|
||||||
|
If ff.Exists Then Files.Add(ff)
|
||||||
|
End If
|
||||||
Using resp As New Responser
|
Using resp As New Responser
|
||||||
If UseCookies And MyYouTubeSettings.Cookies.Count > 0 Then resp.Cookies.AddRange(MyYouTubeSettings.Cookies,, EDP.SendToLog)
|
If UseCookies And MyYouTubeSettings.Cookies.Count > 0 Then resp.Cookies.AddRange(MyYouTubeSettings.Cookies,, EDP.SendToLog)
|
||||||
r = resp.GetResponse(url,, EDP.ReturnValue)
|
r = resp.GetResponse(url,, EDP.ReturnValue)
|
||||||
@@ -864,6 +899,7 @@ Namespace API.YouTube.Objects
|
|||||||
.Information = $"Download {MediaType}"
|
.Information = $"Download {MediaType}"
|
||||||
End With
|
End With
|
||||||
End If
|
End If
|
||||||
|
.MainProcessName = "yt-dlp"
|
||||||
.FileExchanger = MyCache.NewInstance(Of BatchFileExchanger)(CachePath, EDP.ReturnValue)
|
.FileExchanger = MyCache.NewInstance(Of BatchFileExchanger)(CachePath, EDP.ReturnValue)
|
||||||
.FileExchanger.DeleteCacheOnDispose = True
|
.FileExchanger.DeleteCacheOnDispose = True
|
||||||
.AddCommand("chcp 65001")
|
.AddCommand("chcp 65001")
|
||||||
@@ -882,6 +918,21 @@ Namespace API.YouTube.Objects
|
|||||||
End If
|
End If
|
||||||
If Not File.Exists Then _File.Name = File.File
|
If Not File.Exists Then _File.Name = File.File
|
||||||
If File.Exists Then
|
If File.Exists Then
|
||||||
|
|
||||||
|
If DownloadObjects.STDownloader.MyDownloaderSettings.CreateUrlFiles Then
|
||||||
|
Dim fileUrl As SFile = File
|
||||||
|
fileUrl.Extension = "url"
|
||||||
|
CreateUrlFile(URL, fileUrl)
|
||||||
|
If fileUrl.Exists Then Files.Add(fileUrl)
|
||||||
|
End If
|
||||||
|
|
||||||
|
If MyYouTubeSettings.CreateDescriptionFiles And Not Description.IsEmptyString Then
|
||||||
|
Dim fileDesr As SFile = File
|
||||||
|
fileDesr.Extension = "txt"
|
||||||
|
TextSaver.SaveTextToFile(Description, fileDesr,,, EDP.None)
|
||||||
|
If fileDesr.Exists Then Files.Add(fileDesr)
|
||||||
|
End If
|
||||||
|
|
||||||
If PlaylistCount > 0 And Not CoverDownloaded And Not PlaylistID.IsEmptyString Then DownloadPlaylistCover(PlaylistID, File, UseCookies)
|
If PlaylistCount > 0 And Not CoverDownloaded And Not PlaylistID.IsEmptyString Then DownloadPlaylistCover(PlaylistID, File, UseCookies)
|
||||||
If prExists Then Progress.InformationTemporary = $"Download {MediaType}: post processing"
|
If prExists Then Progress.InformationTemporary = $"Download {MediaType}: post processing"
|
||||||
_ThumbnailFile = File
|
_ThumbnailFile = File
|
||||||
@@ -1024,7 +1075,12 @@ Namespace API.YouTube.Objects
|
|||||||
Dim fc As SFile = x.Value(Name_CachePath).CSFileP
|
Dim fc As SFile = x.Value(Name_CachePath).CSFileP
|
||||||
If fc.Exists(SFO.Path, False) AndAlso SFile.GetFiles(fc, "*.json",, EDP.ReturnValue).Count > 0 Then Parse(Nothing, fc, IsMusic)
|
If fc.Exists(SFO.Path, False) AndAlso SFile.GetFiles(fc, "*.json",, EDP.ReturnValue).Count > 0 Then Parse(Nothing, fc, IsMusic)
|
||||||
XMLPopulateData(Me, x)
|
XMLPopulateData(Me, x)
|
||||||
|
_MediaStateOnLoad = _MediaState
|
||||||
|
If Me.MediaState = UMStates.Downloaded Then
|
||||||
|
_Exists = File.Exists(IIf(ObjectType = YouTubeMediaType.Single, SFO.File, SFO.Path), False)
|
||||||
|
Else
|
||||||
_Exists = True
|
_Exists = True
|
||||||
|
End If
|
||||||
If If(x(Name_CheckedElements)?.Count, 0) > 0 Then ApplyElementCheckedValue(x(Name_CheckedElements))
|
If If(x(Name_CheckedElements)?.Count, 0) > 0 Then ApplyElementCheckedValue(x(Name_CheckedElements))
|
||||||
If ArrayMaxResolution <> -10 Then SetMaxResolution(ArrayMaxResolution)
|
If ArrayMaxResolution <> -10 Then SetMaxResolution(ArrayMaxResolution)
|
||||||
End Using
|
End Using
|
||||||
@@ -1038,8 +1094,20 @@ Namespace API.YouTube.Objects
|
|||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Save"
|
#Region "Save"
|
||||||
|
Protected Function NeedToSave() As Boolean
|
||||||
|
Return Not _MediaStateOnLoad = _MediaState And Not FileSettings.Exists
|
||||||
|
End Function
|
||||||
|
Private Function GetThumbnails() As IEnumerable(Of SFile)
|
||||||
|
If HasElements Then
|
||||||
|
Return ListAddList(Of SFile)(New List(Of SFile)({ThumbnailFile}),
|
||||||
|
Elements.SelectMany(Function(ee As YouTubeMediaContainerBase) ee.GetThumbnails))
|
||||||
|
Else
|
||||||
|
Return {ThumbnailFile}
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
Public Overridable Sub Save() Implements IDownloadableMedia.Save
|
Public Overridable Sub Save() Implements IDownloadableMedia.Save
|
||||||
Try
|
Try
|
||||||
|
If NeedToSave() Then
|
||||||
Dim fSettings As SFile = FileSettings
|
Dim fSettings As SFile = FileSettings
|
||||||
If fSettings.IsEmptyString Then fSettings = MyCacheSettings.NewFile
|
If fSettings.IsEmptyString Then fSettings = MyCacheSettings.NewFile
|
||||||
Dim f As SFile = fSettings
|
Dim f As SFile = fSettings
|
||||||
@@ -1066,15 +1134,23 @@ Namespace API.YouTube.Objects
|
|||||||
Else
|
Else
|
||||||
If CachePath.Exists(SFO.Path, False) Then CachePath.Delete(SFO.Path, SFODelete.DeletePermanently, EDP.None)
|
If CachePath.Exists(SFO.Path, False) Then CachePath.Delete(SFO.Path, SFODelete.DeletePermanently, EDP.None)
|
||||||
CachePath = Nothing
|
CachePath = Nothing
|
||||||
|
If ThumbnailFile.IsEmptyString And HasElements Then
|
||||||
|
With ListAddList(Nothing, GetThumbnails, LAP.NotContainsOnly).ListWithRemove(Function(tf) tf.IsEmptyString)
|
||||||
|
If .ListExists Then _ThumbnailFile = .FirstOrDefault(Function(tf) tf.Exists)
|
||||||
|
End With
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
|
|
||||||
Using x As New XmlFile With {.AllowSameNames = True}
|
Using x As New XmlFile With {.AllowSameNames = True}
|
||||||
fSettings.Extension = "xml"
|
fSettings.Extension = "xml"
|
||||||
FileSettings = fSettings
|
FileSettings = fSettings
|
||||||
|
If NeedToSave() Then
|
||||||
x.AddRange(ToEContainer.Elements)
|
x.AddRange(ToEContainer.Elements)
|
||||||
x.Name = "MediaContainer"
|
x.Name = "MediaContainer"
|
||||||
x.Save(fSettings)
|
x.Save(fSettings)
|
||||||
|
End If
|
||||||
End Using
|
End Using
|
||||||
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ErrorsDescriber.Execute(EDP.SendToLog, ex, $"YouTubeMediaContainerBase.Save({FileSettings})")
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, $"YouTubeMediaContainerBase.Save({FileSettings})")
|
||||||
End Try
|
End Try
|
||||||
@@ -1238,25 +1314,27 @@ Namespace API.YouTube.Objects
|
|||||||
obj.Height = AConvert(Of Integer)(ee.Value("height"), NumberProvider, -1)
|
obj.Height = AConvert(Of Integer)(ee.Value("height"), NumberProvider, -1)
|
||||||
obj.FPS = AConvert(Of Double)(ee.Value("fps"), NumberProvider, -1)
|
obj.FPS = AConvert(Of Double)(ee.Value("fps"), NumberProvider, -1)
|
||||||
obj.Bitrate = AConvert(Of Double)(ee.Value("tbr"), NumberProvider, -1)
|
obj.Bitrate = AConvert(Of Double)(ee.Value("tbr"), NumberProvider, -1)
|
||||||
|
obj.Protocol = ee.Value("protocol")
|
||||||
|
If Not obj.Protocol.IsEmptyString Then obj.Protocol = obj.Protocol.Split("_").FirstOrDefault
|
||||||
nValue = AConvert(Of Double)(ee.Value("filesize"), NumberProvider, -1)
|
nValue = AConvert(Of Double)(ee.Value("filesize"), NumberProvider, -1)
|
||||||
If nValue > 0 Then obj.Size = (nValue / 1024).RoundVal(2)
|
If nValue > 0 Then obj.Size = (nValue / 1024).RoundVal(2)
|
||||||
sValue = ee.Value("vcodec")
|
|
||||||
If validCodecValue(sValue) Then
|
|
||||||
obj.Type = UMTypes.Video
|
|
||||||
obj.Codec = sValue.Split(".").First
|
|
||||||
If validCodecValue(ee.Value("acodec")) Then
|
|
||||||
obj.Type = av
|
|
||||||
If obj.Size <= 0 Then
|
If obj.Size <= 0 Then
|
||||||
nValue = AConvert(Of Double)(ee.Value("filesize_approx"), NumberProvider, -1)
|
nValue = AConvert(Of Double)(ee.Value("filesize_approx"), NumberProvider, -1)
|
||||||
If nValue > 0 Then obj.Size = (nValue / 1024).RoundVal(2)
|
If nValue > 0 Then obj.Size = (nValue / 1024).RoundVal(2)
|
||||||
End If
|
End If
|
||||||
End If
|
If obj.Size <= 0 And obj.Bitrate > 0 And Duration.TotalSeconds > 0 Then _
|
||||||
|
obj.Size = (obj.Bitrate / 8 * Duration.TotalSeconds).RoundVal(2)
|
||||||
|
|
||||||
|
sValue = ee.Value("vcodec")
|
||||||
|
If validCodecValue(sValue) Then
|
||||||
|
obj.Type = UMTypes.Video
|
||||||
|
obj.Codec = sValue.Split(".").First
|
||||||
|
If validCodecValue(ee.Value("acodec")) Then obj.Type = av
|
||||||
Else
|
Else
|
||||||
sValue = ee.Value("acodec")
|
sValue = ee.Value("acodec")
|
||||||
If validCodecValue(sValue) Then
|
If validCodecValue(sValue) Then
|
||||||
obj.Type = UMTypes.Audio
|
obj.Type = UMTypes.Audio
|
||||||
obj.Codec = sValue.Split(".").First
|
obj.Codec = sValue.Split(".").First
|
||||||
obj.Bitrate = AConvert(Of Double)(ee.Value("tbr"), NumberProvider, -1)
|
|
||||||
Else
|
Else
|
||||||
Continue For
|
Continue For
|
||||||
End If
|
End If
|
||||||
@@ -1286,8 +1364,29 @@ Namespace API.YouTube.Objects
|
|||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
Dim protocolCleaner As Action =
|
||||||
|
Sub()
|
||||||
|
If Not MyYouTubeSettings.DefaultProtocol.Value = Protocols.Undefined And
|
||||||
|
Not MyYouTubeSettings.DefaultProtocol.Value = Protocols.Any Then
|
||||||
|
Dim data As New List(Of MediaObject)(MediaObjects.Where(Function(mo) mo.ProtocolType = MyYouTubeSettings.DefaultProtocol.Value))
|
||||||
|
If data.ListExists Then
|
||||||
|
Dim dRem As Protocols = IIf(MyYouTubeSettings.DefaultProtocol.Value = Protocols.https, Protocols.m3u8, Protocols.https)
|
||||||
|
Dim d As MediaObject
|
||||||
|
Dim dr As New FPredicate(Of MediaObject)(Function(mo) mo.Height = d.Height And mo.ProtocolType = dRem)
|
||||||
|
For Each d In data
|
||||||
|
If MediaObjects.Count = 0 Then
|
||||||
|
Exit For
|
||||||
|
ElseIf MediaObjects.LongCount(dr) > 0 Then
|
||||||
|
MediaObjects.RemoveAll(dr)
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
If MediaObjects.Count > 0 And Not MyYouTubeSettings.DefaultVideoIncludeNullSize Then MediaObjects.RemoveAll(Function(mo) mo.Size <= 0)
|
||||||
If MediaObjects.Count > 0 Then DupRemover.Invoke(UMTypes.Audio)
|
If MediaObjects.Count > 0 Then DupRemover.Invoke(UMTypes.Audio)
|
||||||
If MediaObjects.Count > 0 Then DupRemover.Invoke(UMTypes.Video)
|
If MediaObjects.Count > 0 Then DupRemover.Invoke(UMTypes.Video)
|
||||||
|
If MediaObjects.Count > 0 Then protocolCleaner.Invoke
|
||||||
If MediaObjects.Count > 0 Then
|
If MediaObjects.Count > 0 Then
|
||||||
MediaObjects.Sort()
|
MediaObjects.Sort()
|
||||||
SelectedAudioIndex = MediaObjects.FindIndex(Function(mo) mo.Type = UMTypes.Audio)
|
SelectedAudioIndex = MediaObjects.FindIndex(Function(mo) mo.Type = UMTypes.Audio)
|
||||||
@@ -1338,18 +1437,27 @@ Namespace API.YouTube.Objects
|
|||||||
Protected Sub ParseSubtitles(ByVal e As EContainer)
|
Protected Sub ParseSubtitles(ByVal e As EContainer)
|
||||||
Dim subt As Subtitles
|
Dim subt As Subtitles
|
||||||
Dim ee As EContainer
|
Dim ee As EContainer
|
||||||
Dim se As EContainer = e({"subtitles"})
|
Dim eSUB As EContainer = e({"subtitles"})
|
||||||
If If(se?.Count, 0) = 0 OrElse (se.Count = 1 And se(0).Name = "live_chat") Then se = e({"automatic_captions"})
|
Dim eCC As EContainer = e({"automatic_captions"})
|
||||||
If If(se?.Count, 0) > 0 Then
|
If If(eSUB?.Count, 0) = 0 OrElse (eSUB.Count = 1 And eSUB(0).Name = "live_chat") Then eSUB = Nothing
|
||||||
If se.Count > 1 OrElse Not se(0).Name = "live_chat" Then
|
If If(eCC?.Count, 0) = 0 OrElse (eCC.Count = 1 And eCC(0).Name = "live_chat") Then eCC = Nothing
|
||||||
|
If If(eSUB?.Count, 0) > 0 Or If(eCC?.Count, 0) > 0 Then
|
||||||
|
Dim sl As New List(Of EContainer)
|
||||||
|
Dim ccExists As Boolean = False
|
||||||
|
Dim ccIndx% = -1, rIndx% = -1
|
||||||
|
If If(eSUB?.Count, 0) > 0 Then sl.Add(eSUB) : ccIndx += 1
|
||||||
|
If If(eCC?.Count, 0) > 0 Then sl.Add(eCC) : ccIndx += 1 : ccExists = True
|
||||||
|
For Each se As EContainer In sl
|
||||||
|
rIndx += 1
|
||||||
For Each ee In se
|
For Each ee In se
|
||||||
subt = New Subtitles With {.ID = ee.Name}
|
subt = New Subtitles With {.ID = ee.Name, .CC = rIndx = ccIndx And ccExists}
|
||||||
If ee.Count > 0 Then
|
If ee.Count > 0 Then
|
||||||
subt.Name = ee(0).Value("name")
|
subt.Name = ee(0).Value("name")
|
||||||
subt.Formats = ee.Select(Function(f) f.Value("ext")).ListToString(",")
|
subt.Formats = ee.Select(Function(f) f.Value("ext")).ListToString(",")
|
||||||
End If
|
End If
|
||||||
If Not subt.ID.IsEmptyString Then _Subtitles.Add(subt)
|
If Not subt.ID.IsEmptyString Then _Subtitles.Add(subt)
|
||||||
Next
|
Next
|
||||||
|
Next
|
||||||
With MyYouTubeSettings
|
With MyYouTubeSettings
|
||||||
If Not .DefaultSubtitlesFormat.IsEmptyString Then OutputSubtitlesFormat = .DefaultSubtitlesFormat
|
If Not .DefaultSubtitlesFormat.IsEmptyString Then OutputSubtitlesFormat = .DefaultSubtitlesFormat
|
||||||
If _Subtitles.Count > 0 And .DefaultSubtitles.Count > 0 Then
|
If _Subtitles.Count > 0 And .DefaultSubtitles.Count > 0 Then
|
||||||
@@ -1360,7 +1468,6 @@ Namespace API.YouTube.Objects
|
|||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
End If
|
End If
|
||||||
End If
|
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "IEContainerProvider Support"
|
#Region "IEContainerProvider Support"
|
||||||
|
|||||||
@@ -121,6 +121,7 @@
|
|||||||
<Compile Include="Controls\PlayListParserForm.vb">
|
<Compile Include="Controls\PlayListParserForm.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Downloader\DownloadLocationsCollection.vb" />
|
||||||
<Compile Include="Downloader\IDownloaderSettings.vb" />
|
<Compile Include="Downloader\IDownloaderSettings.vb" />
|
||||||
<Compile Include="Downloader\Notificator.vb" />
|
<Compile Include="Downloader\Notificator.vb" />
|
||||||
<Compile Include="Downloader\MediaItem.Designer.vb">
|
<Compile Include="Downloader\MediaItem.Designer.vb">
|
||||||
@@ -155,6 +156,13 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Declarations.vb" />
|
<Compile Include="Declarations.vb" />
|
||||||
<Compile Include="Downloader\STDownloaderDeclarations.vb" />
|
<Compile Include="Downloader\STDownloaderDeclarations.vb" />
|
||||||
|
<Compile Include="Editors\BugReporterForm.Designer.vb">
|
||||||
|
<DependentUpon>BugReporterForm.vb</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Editors\BugReporterForm.vb">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Editors\BugReporterFormDiscordWebHook.vb" />
|
||||||
<Compile Include="MainModShared.vb" />
|
<Compile Include="MainModShared.vb" />
|
||||||
<Compile Include="Objects\Channel.vb" />
|
<Compile Include="Objects\Channel.vb" />
|
||||||
<Compile Include="Objects\IYouTubeMediaContainer.vb" />
|
<Compile Include="Objects\IYouTubeMediaContainer.vb" />
|
||||||
@@ -218,6 +226,9 @@
|
|||||||
<EmbeddedResource Include="Controls\VideoOption.resx">
|
<EmbeddedResource Include="Controls\VideoOption.resx">
|
||||||
<DependentUpon>VideoOption.vb</DependentUpon>
|
<DependentUpon>VideoOption.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Editors\BugReporterForm.resx">
|
||||||
|
<DependentUpon>BugReporterForm.vb</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="My Project\Resources.resx">
|
<EmbeddedResource Include="My Project\Resources.resx">
|
||||||
<Generator>PublicVbMyResourcesResXFileCodeGenerator</Generator>
|
<Generator>PublicVbMyResourcesResXFileCodeGenerator</Generator>
|
||||||
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||||
@@ -314,5 +325,11 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Content\Pictures\ImagePic_32.png" />
|
<None Include="Content\Pictures\ImagePic_32.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="Content\Pictures\StartPic_Green_16.png" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="Content\Pictures\MailPic_16.png" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||||
</Project>
|
</Project>
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
[*.vb]
|
[*.vb]
|
||||||
# Modifier preferences
|
# 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/>
|
||||||
22
SCrawler.YouTubeDownloader/MainFrame.Designer.vb
generated
@@ -20,9 +20,12 @@ Partial Public Class MainFrame : Inherits SCrawler.DownloadObjects.STDownloader.
|
|||||||
Private Sub InitializeComponent()
|
Private Sub InitializeComponent()
|
||||||
Me.components = New System.ComponentModel.Container()
|
Me.components = New System.ComponentModel.Container()
|
||||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainFrame))
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainFrame))
|
||||||
|
Dim CONTEXT_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||||
Me.TRAY_ICON = New System.Windows.Forms.NotifyIcon(Me.components)
|
Me.TRAY_ICON = New System.Windows.Forms.NotifyIcon(Me.components)
|
||||||
Me.TRAY_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
Me.TRAY_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
||||||
Me.BTT_TRAY_CLOSE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_TRAY_CLOSE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.CONTEXT_BTT_ADD = New PersonalUtilities.Forms.Controls.KeyClick.ToolStripMenuItemKeyClick()
|
||||||
|
CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.TRAY_CONTEXT.SuspendLayout()
|
Me.TRAY_CONTEXT.SuspendLayout()
|
||||||
Me.SuspendLayout()
|
Me.SuspendLayout()
|
||||||
'
|
'
|
||||||
@@ -32,13 +35,13 @@ Partial Public Class MainFrame : Inherits SCrawler.DownloadObjects.STDownloader.
|
|||||||
Me.TRAY_ICON.BalloonTipTitle = "YouTube Downloader"
|
Me.TRAY_ICON.BalloonTipTitle = "YouTube Downloader"
|
||||||
Me.TRAY_ICON.ContextMenuStrip = Me.TRAY_CONTEXT
|
Me.TRAY_ICON.ContextMenuStrip = Me.TRAY_CONTEXT
|
||||||
Me.TRAY_ICON.Icon = CType(resources.GetObject("TRAY_ICON.Icon"), System.Drawing.Icon)
|
Me.TRAY_ICON.Icon = CType(resources.GetObject("TRAY_ICON.Icon"), System.Drawing.Icon)
|
||||||
Me.TRAY_ICON.Text = "YouTube Downloader"
|
Me.TRAY_ICON.Text = "YouTube Downloader" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Ctrl+Click to add download"
|
||||||
'
|
'
|
||||||
'TRAY_CONTEXT
|
'TRAY_CONTEXT
|
||||||
'
|
'
|
||||||
Me.TRAY_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_TRAY_CLOSE})
|
Me.TRAY_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.CONTEXT_BTT_ADD, CONTEXT_SEP_1, Me.BTT_TRAY_CLOSE})
|
||||||
Me.TRAY_CONTEXT.Name = "ContextMenuStrip1"
|
Me.TRAY_CONTEXT.Name = "ContextMenuStrip1"
|
||||||
Me.TRAY_CONTEXT.Size = New System.Drawing.Size(181, 48)
|
Me.TRAY_CONTEXT.Size = New System.Drawing.Size(181, 76)
|
||||||
'
|
'
|
||||||
'BTT_TRAY_CLOSE
|
'BTT_TRAY_CLOSE
|
||||||
'
|
'
|
||||||
@@ -47,6 +50,18 @@ Partial Public Class MainFrame : Inherits SCrawler.DownloadObjects.STDownloader.
|
|||||||
Me.BTT_TRAY_CLOSE.Size = New System.Drawing.Size(180, 22)
|
Me.BTT_TRAY_CLOSE.Size = New System.Drawing.Size(180, 22)
|
||||||
Me.BTT_TRAY_CLOSE.Text = "Close"
|
Me.BTT_TRAY_CLOSE.Text = "Close"
|
||||||
'
|
'
|
||||||
|
'CONTEXT_BTT_ADD
|
||||||
|
'
|
||||||
|
Me.CONTEXT_BTT_ADD.Name = "CONTEXT_BTT_ADD"
|
||||||
|
Me.CONTEXT_BTT_ADD.Size = New System.Drawing.Size(180, 22)
|
||||||
|
Me.CONTEXT_BTT_ADD.Text = "Add"
|
||||||
|
Me.CONTEXT_BTT_ADD.Image = Global.PersonalUtilities.My.Resources.PlusPic_Green_24
|
||||||
|
'
|
||||||
|
'CONTEXT_SEP_1
|
||||||
|
'
|
||||||
|
CONTEXT_SEP_1.Name = "CONTEXT_SEP_1"
|
||||||
|
CONTEXT_SEP_1.Size = New System.Drawing.Size(177, 6)
|
||||||
|
'
|
||||||
'MainFrame
|
'MainFrame
|
||||||
'
|
'
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
@@ -61,4 +76,5 @@ Partial Public Class MainFrame : Inherits SCrawler.DownloadObjects.STDownloader.
|
|||||||
Private WithEvents TRAY_ICON As NotifyIcon
|
Private WithEvents TRAY_ICON As NotifyIcon
|
||||||
Private WithEvents TRAY_CONTEXT As ContextMenuStrip
|
Private WithEvents TRAY_CONTEXT As ContextMenuStrip
|
||||||
Private WithEvents BTT_TRAY_CLOSE As ToolStripMenuItem
|
Private WithEvents BTT_TRAY_CLOSE As ToolStripMenuItem
|
||||||
|
Private WithEvents CONTEXT_BTT_ADD As PersonalUtilities.Forms.Controls.KeyClick.ToolStripMenuItemKeyClick
|
||||||
End Class
|
End Class
|
||||||
@@ -123,6 +123,9 @@
|
|||||||
<metadata name="TRAY_CONTEXT.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="TRAY_CONTEXT.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>425, 17</value>
|
<value>425, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<metadata name="CONTEXT_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
<data name="BTT_TRAY_CLOSE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="BTT_TRAY_CLOSE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
Imports System.ComponentModel
|
Imports System.ComponentModel
|
||||||
Imports SCrawler.API.YouTube
|
Imports SCrawler.API.YouTube
|
||||||
Imports PersonalUtilities.Forms
|
Imports PersonalUtilities.Forms
|
||||||
|
Imports PersonalUtilities.Forms.Controls.KeyClick
|
||||||
Public Class MainFrame
|
Public Class MainFrame
|
||||||
Private WithEvents MyActivator As FormActivator
|
Private WithEvents MyActivator As FormActivator
|
||||||
Public Sub New()
|
Public Sub New()
|
||||||
@@ -66,6 +67,12 @@ CloseResume:
|
|||||||
Private Sub BTT_TRAY_CLOSE_Click(sender As Object, e As EventArgs) Handles BTT_TRAY_CLOSE.Click
|
Private Sub BTT_TRAY_CLOSE_Click(sender As Object, e As EventArgs) Handles BTT_TRAY_CLOSE.Click
|
||||||
If CheckForClose(False) Then _IgnoreCloseConfirm = True : _IgnoreTrayOptions = True : Close()
|
If CheckForClose(False) Then _IgnoreCloseConfirm = True : _IgnoreTrayOptions = True : Close()
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub MyActivator_TrayIconClick(ByVal Sender As Object, ByVal e As KeyClickEventArgs) Handles MyActivator.TrayIconClick
|
||||||
|
If e.MouseButton = MouseButtons.Left And e.Control Then
|
||||||
|
BTT_ADD_KeyClick(Nothing, New KeyClickEventArgs)
|
||||||
|
e.Handled = Not MyYouTubeSettings.ShowFormDownTrayClick
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
Private Function CheckForClose(ByVal _Ignore As Boolean) As Boolean
|
Private Function CheckForClose(ByVal _Ignore As Boolean) As Boolean
|
||||||
If MyYouTubeSettings.ExitConfirm And Not _Ignore Then
|
If MyYouTubeSettings.ExitConfirm And Not _Ignore Then
|
||||||
Return MsgBoxE({"Do you want to close the program?", "Closing the program"}, MsgBoxStyle.YesNo) = MsgBoxResult.Yes
|
Return MsgBoxE({"Do you want to close the program?", "Closing the program"}, MsgBoxStyle.YesNo) = MsgBoxResult.Yes
|
||||||
@@ -77,6 +84,9 @@ CloseResume:
|
|||||||
MyBase.BTT_SETTINGS_Click(sender, e)
|
MyBase.BTT_SETTINGS_Click(sender, e)
|
||||||
TRAY_ICON.Visible = MyYouTubeSettings.CloseToTray
|
TRAY_ICON.Visible = MyYouTubeSettings.CloseToTray
|
||||||
End Sub
|
End Sub
|
||||||
|
Protected Overrides Sub BTT_ADD_KeyClick(ByVal Sender As ToolStripMenuItemKeyClick, ByVal e As KeyClickEventArgs) Handles CONTEXT_BTT_ADD.KeyClick
|
||||||
|
MyBase.BTT_ADD_KeyClick(Sender, e)
|
||||||
|
End Sub
|
||||||
Protected Overrides Sub MyJob_Started(ByVal Sender As Object, ByVal e As EventArgs)
|
Protected Overrides Sub MyJob_Started(ByVal Sender As Object, ByVal e As EventArgs)
|
||||||
TRAY_ICON.Icon = My.Resources.ArrowDownIcon_Orange_24
|
TRAY_ICON.Icon = My.Resources.ArrowDownIcon_Orange_24
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ Imports System.Runtime.InteropServices
|
|||||||
<Assembly: AssemblyDescription("SCrawler YouTube downloader")>
|
<Assembly: AssemblyDescription("SCrawler YouTube downloader")>
|
||||||
<Assembly: AssemblyCompany("AndyProgram")>
|
<Assembly: AssemblyCompany("AndyProgram")>
|
||||||
<Assembly: AssemblyProduct("SCrawler.YouTubeDownloader")>
|
<Assembly: AssemblyProduct("SCrawler.YouTubeDownloader")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2023")>
|
<Assembly: AssemblyCopyright("Copyright © 2024")>
|
||||||
<Assembly: AssemblyTrademark("AndyProgram")>
|
<Assembly: AssemblyTrademark("AndyProgram")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
|||||||
' by using the '*' as shown below:
|
' by using the '*' as shown below:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("2023.4.28.0")>
|
<Assembly: AssemblyVersion("2023.11.24.0")>
|
||||||
<Assembly: AssemblyFileVersion("2023.4.28.0")>
|
<Assembly: AssemblyFileVersion("2023.11.24.0")>
|
||||||
<Assembly: NeutralResourcesLanguage("en")>
|
<Assembly: NeutralResourcesLanguage("en")>
|
||||||
|
|||||||
@@ -123,4 +123,4 @@ insert_final_newline=false
|
|||||||
[*.vb]
|
[*.vb]
|
||||||
# Modifier preferences
|
# Modifier preferences
|
||||||
visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
|
visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
|
||||||
file_header_template = Copyright (C) 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/>
|
||||||
|
|||||||
@@ -6,9 +6,12 @@
|
|||||||
'
|
'
|
||||||
' This program is distributed in the hope that it will be useful,
|
' This program is distributed in the hope that it will be useful,
|
||||||
' but WITHOUT ANY WARRANTY
|
' but WITHOUT ANY WARRANTY
|
||||||
|
Imports PersonalUtilities.Forms
|
||||||
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Namespace API.Base
|
Namespace API.Base
|
||||||
Friend Module Declarations
|
Friend Module Declarations
|
||||||
Friend Const UserLabelName As String = "User"
|
Friend Const UserLabelName As String = "User"
|
||||||
|
Friend Const SearchRequestLabelName As String = "Search request"
|
||||||
Friend ReadOnly LNC As New ListAddParams(LAP.NotContainsOnly)
|
Friend ReadOnly LNC As New ListAddParams(LAP.NotContainsOnly)
|
||||||
Friend ReadOnly UnixDate32Provider As New ADateTime(ADateTime.Formats.Unix32)
|
Friend ReadOnly UnixDate32Provider As New ADateTime(ADateTime.Formats.Unix32)
|
||||||
Friend ReadOnly UnixDate64Provider As New ADateTime(ADateTime.Formats.Unix64)
|
Friend ReadOnly UnixDate64Provider As New ADateTime(ADateTime.Formats.Unix64)
|
||||||
@@ -16,5 +19,58 @@ Namespace API.Base
|
|||||||
Friend ReadOnly TitleHtmlConverter As Func(Of String, String) =
|
Friend ReadOnly TitleHtmlConverter As Func(Of String, String) =
|
||||||
Function(Input) SymbolsConverter.HTML.Decode(SymbolsConverter.Convert(Input, EDP.ReturnValue), EDP.ReturnValue).
|
Function(Input) SymbolsConverter.HTML.Decode(SymbolsConverter.Convert(Input, EDP.ReturnValue), EDP.ReturnValue).
|
||||||
StringRemoveWinForbiddenSymbols().StringTrim()
|
StringRemoveWinForbiddenSymbols().StringTrim()
|
||||||
|
Friend ReadOnly Regex_VideosThumb_OG_IMAGE As RParams = RParams.DMS("meta.property=.og.image..content=""([^""]+)""", 1, EDP.ReturnValue)
|
||||||
|
Friend Class ConcurrentDownloadsProvider : Inherits FieldsCheckerProviderBase
|
||||||
|
Public Overrides Sub Reset()
|
||||||
|
ErrorMessage = String.Empty
|
||||||
|
MyBase.Reset()
|
||||||
|
End Sub
|
||||||
|
Public Overrides Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider,
|
||||||
|
Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object
|
||||||
|
Dim v% = AConvert(Of Integer)(Value, -1)
|
||||||
|
Dim defV% = Settings.MaxUsersJobsCount
|
||||||
|
If v.ValueBetween(1, defV) Then
|
||||||
|
Return Value
|
||||||
|
Else
|
||||||
|
HasError = True
|
||||||
|
If ACheck(Of Integer)(Value) Then
|
||||||
|
ErrorMessage = $"The number of concurrent downloads must be greater than 0 and equal to or less than {defV} (global limit)."
|
||||||
|
Else
|
||||||
|
TypeError = True
|
||||||
|
End If
|
||||||
|
Return Nothing
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
Friend Class TokenRefreshIntervalProvider : Inherits FieldsCheckerProviderBase
|
||||||
|
Public Overrides Sub Reset()
|
||||||
|
ErrorMessage = String.Empty
|
||||||
|
MyBase.Reset()
|
||||||
|
End Sub
|
||||||
|
Public Overrides Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider,
|
||||||
|
Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object
|
||||||
|
Dim v% = AConvert(Of Integer)(Value, -1)
|
||||||
|
If v > 0 Then
|
||||||
|
Return Value
|
||||||
|
ElseIf Not ACheck(Of Integer)(Value) Then
|
||||||
|
TypeError = True
|
||||||
|
Else
|
||||||
|
ErrorMessage = $"The value of [{Name}] field must be greater than or equal to 1"
|
||||||
|
End If
|
||||||
|
HasError = True
|
||||||
|
Return Nothing
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
Friend ReadOnly Property CacheDeletionError(ByVal RootPath As SFile) As ErrorsDescriber
|
||||||
|
Get
|
||||||
|
Return New ErrorsDescriber(EDP.None) With {.Action = Sub(ee, eex, msg, obj) Settings.Cache.AddPath(RootPath)}
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Friend Function ValidateChangeSearchOptions(ByVal User As String, ByVal NewQuery As String, ByVal CurrentQuery As String) As Boolean
|
||||||
|
Return MsgBoxE({$"Are you sure you want to change the query for user '{User}'?{vbCr}" &
|
||||||
|
"It is highly recommended to add a new user with this query instead of changing current one." & vbCr &
|
||||||
|
$"Current query: [{CurrentQuery}]{vbCr}New query: [{NewQuery}]",
|
||||||
|
"Changing a query"}, vbExclamation,,, {"Process", "Cancel"}) = 0
|
||||||
|
End Function
|
||||||
End Module
|
End Module
|
||||||
End Namespace
|
End Namespace
|
||||||
33
SCrawler/API/Base/DeclaredNames.vb
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
' 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 API.Base
|
||||||
|
Friend NotInheritable Class DeclaredNames
|
||||||
|
Friend Const Header_Authorization As String = "authorization"
|
||||||
|
Friend Const Header_CSRFToken As String = "x-csrf-token"
|
||||||
|
|
||||||
|
Friend Const Header_FB_FRIENDLY_NAME As String = "x-fb-friendly-name"
|
||||||
|
|
||||||
|
Friend Const ConcurrentDownloadsCaption As String = "Concurrent downloads"
|
||||||
|
Friend Const ConcurrentDownloadsToolTip As String = "The number of concurrent downloads."
|
||||||
|
Friend Const SavedPostsUserNameCaption As String = "Saved posts user"
|
||||||
|
Friend Const SavedPostsUserNameToolTip As String = "Personal profile username"
|
||||||
|
Friend Const GifsSpecialFolderCaption As String = "GIFs special folder"
|
||||||
|
Friend Const GifsSpecialFolderToolTip As String = "Put the GIFs in a special folder" & vbCr &
|
||||||
|
"This is a folder name, not an absolute path." & vbCr &
|
||||||
|
"This folder(s) will be created relative to the user's root folder." & vbCr &
|
||||||
|
"Examples:" & vbCr & "SomeFolderName" & vbCr & "SomeFolderName\SomeFolderName2"
|
||||||
|
Friend Const GifsPrefixCaption As String = "GIF prefix"
|
||||||
|
Friend Const GifsPrefixToolTip As String = "This prefix will be added to the beginning of the filename"
|
||||||
|
Friend Const GifsDownloadCaption As String = "Download GIFs"
|
||||||
|
Friend Const UseMD5ComparisonCaption As String = "Use MD5 comparison"
|
||||||
|
Friend Const UseMD5ComparisonToolTip As String = "Each image will be checked for existence using MD5"
|
||||||
|
Private Sub New()
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
@@ -66,21 +66,19 @@ Namespace API.Base.GDL
|
|||||||
Return urls
|
Return urls
|
||||||
End Function
|
End Function
|
||||||
End Module
|
End Module
|
||||||
Friend Class GDLBatch : Inherits BatchExecutor
|
Friend Class GDLBatch : Inherits TokenBatch
|
||||||
Friend Property TempPostsList As List(Of String)
|
|
||||||
Friend Const UrlLibStart As String = "[urllib3.connectionpool][debug]"
|
Friend Const UrlLibStart As String = "[urllib3.connectionpool][debug]"
|
||||||
Friend Const UrlTextStart As String = UrlLibStart & " https"
|
Friend Const UrlTextStart As String = UrlLibStart & " https"
|
||||||
Friend Sub New()
|
Friend Sub New(ByVal _Token As Threading.CancellationToken)
|
||||||
MyBase.New(True)
|
MyBase.New(_Token)
|
||||||
|
MainProcessName = "gallery-dl"
|
||||||
ChangeDirectory(Settings.GalleryDLFile.File)
|
ChangeDirectory(Settings.GalleryDLFile.File)
|
||||||
End Sub
|
End Sub
|
||||||
Protected Overrides Async Sub OutputDataReceiver(ByVal Sender As Object, ByVal e As DataReceivedEventArgs)
|
Protected Overrides Async Sub OutputDataReceiver(ByVal Sender As Object, ByVal e As DataReceivedEventArgs)
|
||||||
|
If Not ProcessKilled Then
|
||||||
MyBase.OutputDataReceiver(Sender, e)
|
MyBase.OutputDataReceiver(Sender, e)
|
||||||
Await Validate(e.Data)
|
Await Validate(e.Data)
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Protected Overridable Async Function Validate(ByVal Value As String) As Task
|
|
||||||
If Await Task.Run(Of Boolean)(Function() Not Value.IsEmptyString AndAlso
|
|
||||||
TempPostsList.Exists(Function(v) Value.Contains(v))) Then Kill(EDP.None)
|
|
||||||
End Function
|
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
91
SCrawler/API/Base/IUserData.vb
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
' 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
|
||||||
|
Imports System.Threading
|
||||||
|
Imports SCrawler.Plugin.Hosts
|
||||||
|
Namespace API.Base
|
||||||
|
Friend Interface IUserData : Inherits IComparable(Of UserDataBase), IComparable, IEquatable(Of UserDataBase), IIndexable, IDisposable
|
||||||
|
Event UserUpdated(ByVal User As IUserData)
|
||||||
|
Enum EraseMode As Integer
|
||||||
|
None = 0
|
||||||
|
Data = 1
|
||||||
|
History = 2
|
||||||
|
End Enum
|
||||||
|
ReadOnly Property Site As String
|
||||||
|
ReadOnly Property Name As String
|
||||||
|
Property ID As String
|
||||||
|
Property Options As String
|
||||||
|
Property FriendlyName As String
|
||||||
|
Property Description As String
|
||||||
|
Property Favorite As Boolean
|
||||||
|
Property Temporary As Boolean
|
||||||
|
Property BackColor As Color?
|
||||||
|
Property ForeColor As Color?
|
||||||
|
Sub OpenSite(Optional ByVal e As ErrorsDescriber = Nothing)
|
||||||
|
Sub DownloadData(ByVal Token As CancellationToken)
|
||||||
|
Sub DownloadSingleObject(ByVal Data As YouTube.Objects.IYouTubeMediaContainer, ByVal Token As CancellationToken)
|
||||||
|
Property ParseUserMediaOnly As Boolean
|
||||||
|
ReadOnly Property IsSubscription As Boolean
|
||||||
|
ReadOnly Property IsUser As Boolean
|
||||||
|
#Region "Images"
|
||||||
|
Function GetPicture() As Image
|
||||||
|
Sub SetPicture(ByVal f As SFile)
|
||||||
|
#End Region
|
||||||
|
#Region "Collection support"
|
||||||
|
ReadOnly Property IsCollection As Boolean
|
||||||
|
ReadOnly Property CollectionName As String
|
||||||
|
ReadOnly Property CollectionPath As SFile
|
||||||
|
ReadOnly Property IncludedInCollection As Boolean
|
||||||
|
ReadOnly Property UserModel As UsageModel
|
||||||
|
ReadOnly Property CollectionModel As UsageModel
|
||||||
|
ReadOnly Property IsVirtual As Boolean
|
||||||
|
ReadOnly Property Labels As List(Of String)
|
||||||
|
#End Region
|
||||||
|
Property Exists As Boolean
|
||||||
|
Property Suspended As Boolean
|
||||||
|
Property ReadyForDownload As Boolean
|
||||||
|
Property HOST As SettingsHost
|
||||||
|
Property HostStatic As Boolean
|
||||||
|
Property AccountName As String
|
||||||
|
Property [File] As SFile
|
||||||
|
Property FileExists As Boolean
|
||||||
|
Property DownloadedPictures(ByVal Total As Boolean) As Integer
|
||||||
|
Property DownloadedVideos(ByVal Total As Boolean) As Integer
|
||||||
|
ReadOnly Property DownloadedTotal(Optional ByVal Total As Boolean = True) As Integer
|
||||||
|
ReadOnly Property DownloadedInformation As String
|
||||||
|
Property HasError As Boolean
|
||||||
|
ReadOnly Property FitToAddParams As Boolean
|
||||||
|
ReadOnly Property Key As String
|
||||||
|
Property DownloadImages As Boolean
|
||||||
|
Property DownloadVideos As Boolean
|
||||||
|
Property DownloadMissingOnly As Boolean
|
||||||
|
Property ScriptUse As Boolean
|
||||||
|
Property ScriptData As String
|
||||||
|
Function GetLVI(ByVal Destination As ListView) As ListViewItem
|
||||||
|
Function GetLVIGroup(ByVal Destination As ListView) As ListViewGroup
|
||||||
|
Sub LoadUserInformation()
|
||||||
|
Sub UpdateUserInformation()
|
||||||
|
''' <summary>
|
||||||
|
''' 0 - Nothing removed<br/>
|
||||||
|
''' 1 - User removed<br/>
|
||||||
|
''' 2 - Collection removed<br/>
|
||||||
|
''' 3 - Collection split
|
||||||
|
''' </summary>
|
||||||
|
Function Delete(Optional ByVal Multiple As Boolean = False, Optional ByVal CollectionValue As Integer = -1) As Integer
|
||||||
|
Function EraseData(ByVal Mode As EraseMode) As Boolean
|
||||||
|
Function MoveFiles(ByVal CollectionName As String, ByVal SpecialCollectionPath As SFile) As Boolean
|
||||||
|
Function CopyFiles(ByVal DestinationPath As SFile, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean
|
||||||
|
Sub OpenFolder()
|
||||||
|
Property DownloadTopCount As Integer?
|
||||||
|
Property DownloadDateFrom As Date?
|
||||||
|
Property DownloadDateTo As Date?
|
||||||
|
Sub SetEnvironment(ByRef h As SettingsHost, ByVal u As UserInfo, ByVal _LoadUserInformation As Boolean,
|
||||||
|
Optional ByVal AttachUserInfo As Boolean = True)
|
||||||
|
ReadOnly Property Disposed As Boolean
|
||||||
|
End Interface
|
||||||
|
End Namespace
|
||||||
@@ -33,18 +33,31 @@ Namespace API.Base
|
|||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
Friend Shared Function Download(ByVal URLs As List(Of String), ByVal DestinationFile As SFile, Optional ByVal Responser As Responser = Nothing,
|
Friend Shared Function Download(ByVal URLs As List(Of String), ByVal DestinationFile As SFile, Optional ByVal Responser As Responser = Nothing,
|
||||||
Optional ByVal Token As CancellationToken = Nothing, Optional ByVal Progress As MyProgress = Nothing) As SFile
|
Optional ByVal Token As CancellationToken = Nothing, Optional ByVal Progress As MyProgress = Nothing,
|
||||||
|
Optional ByVal UsePreProgress As Boolean = True, Optional ByVal ExistingCache As CacheKeeper = Nothing) As SFile
|
||||||
Dim Cache As CacheKeeper = Nothing
|
Dim Cache As CacheKeeper = Nothing
|
||||||
|
Using tmpPr As New PreProgress(Progress)
|
||||||
Try
|
Try
|
||||||
If URLs.ListExists Then
|
If URLs.ListExists Then
|
||||||
Dim ConcatFile As SFile = DestinationFile
|
Dim ConcatFile As SFile = DestinationFile
|
||||||
If ConcatFile.Name.IsEmptyString Then ConcatFile.Name = "PlayListFile"
|
If ConcatFile.Name.IsEmptyString Then ConcatFile.Name = "PlayListFile"
|
||||||
ConcatFile.Extension = "mp4"
|
ConcatFile.Extension = "mp4"
|
||||||
|
If ExistingCache Is Nothing Then
|
||||||
Cache = New CacheKeeper($"{DestinationFile.PathWithSeparator}_{TempCacheFolderName}\")
|
Cache = New CacheKeeper($"{DestinationFile.PathWithSeparator}_{TempCacheFolderName}\")
|
||||||
|
Cache.CacheDeleteError = CacheDeletionError(Cache)
|
||||||
|
Else
|
||||||
|
Cache = ExistingCache
|
||||||
|
End If
|
||||||
Dim cache2 As CacheKeeper = Cache.NewInstance
|
Dim cache2 As CacheKeeper = Cache.NewInstance
|
||||||
If cache2.RootDirectory.Exists(SFO.Path) Then
|
If cache2.RootDirectory.Exists(SFO.Path) Then
|
||||||
Dim progressExists As Boolean = Not Progress Is Nothing
|
Dim progressExists As Boolean = Not Progress Is Nothing
|
||||||
If progressExists Then Progress.Maximum += URLs.Count
|
If progressExists Then
|
||||||
|
If UsePreProgress Then
|
||||||
|
tmpPr.ChangeMax(URLs.Count)
|
||||||
|
Else
|
||||||
|
Progress.Maximum += URLs.Count
|
||||||
|
End If
|
||||||
|
End If
|
||||||
Dim p As SFileNumbers = SFileNumbers.Default(ConcatFile.Name)
|
Dim p As SFileNumbers = SFileNumbers.Default(ConcatFile.Name)
|
||||||
ConcatFile = SFile.IndexReindex(ConcatFile,,, p, EDP.ReturnValue)
|
ConcatFile = SFile.IndexReindex(ConcatFile,,, p, EDP.ReturnValue)
|
||||||
Dim i%
|
Dim i%
|
||||||
@@ -52,7 +65,13 @@ Namespace API.Base
|
|||||||
dFile.Extension = "ts"
|
dFile.Extension = "ts"
|
||||||
Using w As New DownloadObjects.WebClient2(Responser)
|
Using w As New DownloadObjects.WebClient2(Responser)
|
||||||
For i = 0 To URLs.Count - 1
|
For i = 0 To URLs.Count - 1
|
||||||
If progressExists Then Progress.Perform()
|
If progressExists Then
|
||||||
|
If UsePreProgress Then
|
||||||
|
tmpPr.Perform()
|
||||||
|
Else
|
||||||
|
Progress.Perform()
|
||||||
|
End If
|
||||||
|
End If
|
||||||
Token.ThrowIfCancellationRequested()
|
Token.ThrowIfCancellationRequested()
|
||||||
dFile.Name = $"ConPart_{i}"
|
dFile.Name = $"ConPart_{i}"
|
||||||
w.DownloadFile(URLs(i), dFile)
|
w.DownloadFile(URLs(i), dFile)
|
||||||
@@ -67,6 +86,7 @@ Namespace API.Base
|
|||||||
Finally
|
Finally
|
||||||
Cache.DisposeIfReady
|
Cache.DisposeIfReady
|
||||||
End Try
|
End Try
|
||||||
|
End Using
|
||||||
End Function
|
End Function
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -12,43 +12,72 @@ Imports PersonalUtilities.Forms.Toolbars
|
|||||||
Imports PDownload = SCrawler.Plugin.ISiteSettings.Download
|
Imports PDownload = SCrawler.Plugin.ISiteSettings.Download
|
||||||
Namespace API.Base
|
Namespace API.Base
|
||||||
Friend NotInheritable Class ProfileSaved
|
Friend NotInheritable Class ProfileSaved
|
||||||
Private ReadOnly Property HOST As SettingsHost
|
Private ReadOnly Property HOST As SettingsHostCollection
|
||||||
Private ReadOnly Property Progress As MyProgress
|
Private ReadOnly Property Progress As MyProgress
|
||||||
Friend Sub New(ByRef h As SettingsHost, ByRef Bar As MyProgress)
|
Private _Unavailable As Integer, _NotReady As Integer, _ErrorCount As Integer
|
||||||
|
Private _TotalImages As Integer, _TotalVideos As Integer
|
||||||
|
Friend Sub New(ByRef h As SettingsHostCollection, ByRef Bar As MyProgress)
|
||||||
HOST = h
|
HOST = h
|
||||||
Progress = Bar
|
Progress = Bar
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub Download(ByVal Token As CancellationToken, ByVal Multiple As Boolean)
|
Friend Overloads Sub Download(ByVal Token As CancellationToken, ByVal Multiple As Boolean)
|
||||||
|
Dim n% = 0
|
||||||
|
Dim c% = HOST.Sum(Function(h) IIf(h.DownloadSavedPosts, 1, 0))
|
||||||
|
_Unavailable = 0
|
||||||
|
_NotReady = 0
|
||||||
|
_ErrorCount = 0
|
||||||
|
_TotalImages = 0
|
||||||
|
_TotalVideos = 0
|
||||||
|
If c > 0 Then
|
||||||
|
For i% = 0 To HOST.Count - 1
|
||||||
|
If HOST(i).DownloadSavedPosts Then n += 1 : Download(HOST(i), n, c, Token, Multiple)
|
||||||
|
Next
|
||||||
|
If c > 1 Then
|
||||||
|
Dim s% = {_Unavailable, _NotReady, _ErrorCount}.Sum
|
||||||
|
Progress.InformationTemporary = $"{HOST.Name} ({c - s}/{c}) Images: {_TotalImages}; Videos: {_TotalVideos}"
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Overloads Sub Download(ByVal Host As SettingsHost, ByVal Number As Integer, ByVal Count As Integer,
|
||||||
|
ByVal Token As CancellationToken, ByVal Multiple As Boolean)
|
||||||
|
Dim aStr$ = String.Empty
|
||||||
|
If Count > 1 Then aStr = $" ({Number}/{Count})"
|
||||||
Try
|
Try
|
||||||
If HOST.Source.ReadyToDownload(PDownload.SavedPosts) Then
|
If Host.Source.ReadyToDownload(PDownload.SavedPosts) Then
|
||||||
If HOST.Available(PDownload.SavedPosts, Multiple) Then
|
If Host.Available(PDownload.SavedPosts, Multiple Or Count > 1) Then
|
||||||
HOST.DownloadStarted(PDownload.SavedPosts)
|
Host.DownloadStarted(PDownload.SavedPosts)
|
||||||
Dim u As New UserInfo With {.Plugin = HOST.Key, .Site = HOST.Name, .SpecialPath = HOST.SavedPostsPath}
|
If Count > 1 Then Progress.Information = $"{Host.Name} - {Host.AccountName.IfNullOrEmpty(SettingsHost.NameAccountNameDefault)}"
|
||||||
Using user As IUserData = HOST.GetInstance(PDownload.SavedPosts, Nothing, False, False)
|
Using user As IUserData = Host.GetInstance(PDownload.SavedPosts, Nothing, False, False)
|
||||||
If Not user Is Nothing Then
|
If Not user Is Nothing Then
|
||||||
With DirectCast(user, UserDataBase)
|
With DirectCast(user, UserDataBase)
|
||||||
|
.HostStatic = True
|
||||||
.IsSavedPosts = True
|
.IsSavedPosts = True
|
||||||
.LoadUserInformation()
|
.LoadUserInformation()
|
||||||
.Progress = Progress
|
.Progress = Progress
|
||||||
If Not .FileExists Then .UpdateUserInformation()
|
If Not .FileExists Then .UpdateUserInformation()
|
||||||
End With
|
End With
|
||||||
HOST.BeforeStartDownload(user, PDownload.SavedPosts)
|
Host.BeforeStartDownload(user, PDownload.SavedPosts)
|
||||||
user.DownloadData(Token)
|
user.DownloadData(Token)
|
||||||
Progress.InformationTemporary = $"{HOST.Name} Images: {user.DownloadedPictures(False)}; Videos: {user.DownloadedVideos(False)}"
|
_TotalImages += user.DownloadedPictures(False)
|
||||||
HOST.AfterDownload(user, PDownload.SavedPosts)
|
_TotalVideos += user.DownloadedVideos(False)
|
||||||
|
Progress.InformationTemporary = $"{Host.Name}{aStr} Images: {user.DownloadedPictures(False)}; Videos: {user.DownloadedVideos(False)}"
|
||||||
|
Host.AfterDownload(user, PDownload.SavedPosts)
|
||||||
End If
|
End If
|
||||||
End Using
|
End Using
|
||||||
Else
|
Else
|
||||||
Progress.InformationTemporary = $"Host [{HOST.Name}] is unavailable"
|
_Unavailable += 1
|
||||||
|
Progress.InformationTemporary = $"Host [{Host.Name}{aStr}] is unavailable"
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
Progress.InformationTemporary = $"Host [{HOST.Name}] is not ready"
|
_NotReady += 1
|
||||||
|
Progress.InformationTemporary = $"Host [{Host.Name}{aStr}] is not ready"
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Progress.InformationTemporary = $"{HOST.Name} downloading error"
|
_ErrorCount += 1
|
||||||
ErrorsDescriber.Execute(EDP.SendToLog, ex, $"[API.Base.ProfileSaved.Download({HOST.Key})]")
|
Progress.InformationTemporary = $"{Host.Name}{aStr} downloading error"
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, $"[API.Base.ProfileSaved.Download({Host.Key}{aStr})]")
|
||||||
Finally
|
Finally
|
||||||
HOST.DownloadDone(PDownload.SavedPosts)
|
Host.DownloadDone(PDownload.SavedPosts)
|
||||||
MainFrameObj.UpdateLogButton()
|
MainFrameObj.UpdateLogButton()
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||
@@ -6,18 +6,61 @@
|
|||||||
'
|
'
|
||||||
' This program is distributed in the hope that it will be useful,
|
' This program is distributed in the hope that it will be useful,
|
||||||
' but WITHOUT ANY WARRANTY
|
' but WITHOUT ANY WARRANTY
|
||||||
|
Imports System.Reflection
|
||||||
Imports SCrawler.Plugin
|
Imports SCrawler.Plugin
|
||||||
|
Imports SCrawler.Plugin.Attributes
|
||||||
|
Imports PersonalUtilities.Tools
|
||||||
|
Imports PersonalUtilities.Tools.Web.Cookies
|
||||||
Imports PersonalUtilities.Tools.Web.Clients
|
Imports PersonalUtilities.Tools.Web.Clients
|
||||||
Imports PersonalUtilities.Functions.RegularExpressions
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Imports Download = SCrawler.Plugin.ISiteSettings.Download
|
Imports Download = SCrawler.Plugin.ISiteSettings.Download
|
||||||
Namespace API.Base
|
Namespace API.Base
|
||||||
Friend MustInherit Class SiteSettingsBase : Implements ISiteSettings, IResponserContainer
|
Friend MustInherit Class SiteSettingsBase : Implements ISiteSettings, IResponserContainer
|
||||||
|
#Region "Declarations"
|
||||||
Friend ReadOnly Property Site As String Implements ISiteSettings.Site
|
Friend ReadOnly Property Site As String Implements ISiteSettings.Site
|
||||||
|
Protected _Icon As Icon = Nothing
|
||||||
Friend Overridable ReadOnly Property Icon As Icon Implements ISiteSettings.Icon
|
Friend Overridable ReadOnly Property Icon As Icon Implements ISiteSettings.Icon
|
||||||
|
Get
|
||||||
|
Return _Icon
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Protected _Image As Image = Nothing
|
||||||
Friend Overridable ReadOnly Property Image As Image Implements ISiteSettings.Image
|
Friend Overridable ReadOnly Property Image As Image Implements ISiteSettings.Image
|
||||||
|
Get
|
||||||
|
Return _Image
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Friend Property AccountName As String Implements ISiteSettings.AccountName
|
||||||
|
Friend Property Temporary As Boolean = False Implements ISiteSettings.Temporary
|
||||||
|
Friend Property DefaultInstance As ISiteSettings = Nothing Implements ISiteSettings.DefaultInstance
|
||||||
|
Protected _AllowUserAgentUpdate As Boolean = True
|
||||||
|
Protected _SubscriptionsAllowed As Boolean = False
|
||||||
|
Friend ReadOnly Property SubscriptionsAllowed As Boolean Implements ISiteSettings.SubscriptionsAllowed
|
||||||
|
Get
|
||||||
|
Return _SubscriptionsAllowed
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
Private Property Logger As ILogProvider = LogConnector Implements ISiteSettings.Logger
|
Private Property Logger As ILogProvider = LogConnector Implements ISiteSettings.Logger
|
||||||
Friend Overridable ReadOnly Property Responser As Responser
|
Friend Overridable ReadOnly Property Responser As Responser
|
||||||
|
Private _UserOptionsExists As Boolean = False
|
||||||
|
Private _UserOptionsType As Type = Nothing
|
||||||
|
Protected Property UserOptionsType As Type
|
||||||
|
Get
|
||||||
|
Return _UserOptionsType
|
||||||
|
End Get
|
||||||
|
Set(ByVal t As Type)
|
||||||
|
_UserOptionsType = t
|
||||||
|
_UserOptionsExists = Not t Is Nothing
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
#End Region
|
||||||
|
#Region "Responser and cookies support"
|
||||||
|
Private _CookiesNetscapeFile As SFile = Nothing
|
||||||
Friend ReadOnly Property CookiesNetscapeFile As SFile
|
Friend ReadOnly Property CookiesNetscapeFile As SFile
|
||||||
|
Get
|
||||||
|
Return _CookiesNetscapeFile
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
Protected CheckNetscapeCookiesOnEndInit As Boolean = False
|
Protected CheckNetscapeCookiesOnEndInit As Boolean = False
|
||||||
Private _UseNetscapeCookies As Boolean = False
|
Private _UseNetscapeCookies As Boolean = False
|
||||||
Protected Property UseNetscapeCookies As Boolean
|
Protected Property UseNetscapeCookies As Boolean
|
||||||
@@ -31,7 +74,7 @@ Namespace API.Base
|
|||||||
Responser.Cookies.ChangedAllowInternalDrop = Not _UseNetscapeCookies
|
Responser.Cookies.ChangedAllowInternalDrop = Not _UseNetscapeCookies
|
||||||
Responser.Cookies.Changed = False
|
Responser.Cookies.Changed = False
|
||||||
End If
|
End If
|
||||||
If b And _UseNetscapeCookies Then Update_SaveCookiesNetscape()
|
If b AndAlso _UseNetscapeCookies AndAlso Not CookiesNetscapeFile.Exists Then Update_SaveCookiesNetscape()
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
Private Property IResponserContainer_Responser As Responser Implements IResponserContainer.Responser
|
Private Property IResponserContainer_Responser As Responser Implements IResponserContainer.Responser
|
||||||
@@ -40,29 +83,53 @@ Namespace API.Base
|
|||||||
End Get
|
End Get
|
||||||
Set : End Set
|
Set : End Set
|
||||||
End Property
|
End Property
|
||||||
Friend MustOverride Function GetInstance(ByVal What As Download) As IPluginContentProvider Implements ISiteSettings.GetInstance
|
Protected Sub UpdateResponserFile()
|
||||||
Friend Sub New(ByVal SiteName As String)
|
Dim acc$ = If(Not AccountName.IsEmptyString, $"_{AccountName}", String.Empty)
|
||||||
Site = SiteName
|
Responser.File = $"{SettingsFolderName}\Responser_{Site}{acc}.xml"
|
||||||
CookiesNetscapeFile = $"{SettingsFolderName}\Responser_{Site}_Cookies_Netscape.txt"
|
_CookiesNetscapeFile = Responser.File
|
||||||
|
_CookiesNetscapeFile.Name &= "_Cookies_Netscape"
|
||||||
|
_CookiesNetscapeFile.Extension = "txt"
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub New(ByVal SiteName As String, ByVal CookiesDomain As String)
|
#End Region
|
||||||
Me.New(SiteName)
|
#Region "GetInstance"
|
||||||
Responser = New Responser($"{SettingsFolderName}\Responser_{Site}.xml") With {.DeclaredError = EDP.ThrowException}
|
Friend MustOverride Function GetInstance(ByVal What As Download) As IPluginContentProvider Implements ISiteSettings.GetInstance
|
||||||
|
#End Region
|
||||||
|
#Region "Initializers"
|
||||||
|
Friend Sub New(ByVal SiteName As String, Optional ByVal __Icon As Icon = Nothing, Optional ByVal __Image As Image = Nothing)
|
||||||
|
Site = SiteName
|
||||||
|
_Icon = __Icon
|
||||||
|
_Image = __Image
|
||||||
|
Responser = New Responser With {.DeclaredError = EDP.ThrowException}
|
||||||
|
UpdateResponserFile()
|
||||||
|
End Sub
|
||||||
|
Friend Sub New(ByVal SiteName As String, ByVal CookiesDomain As String, ByVal AccName As String, ByVal Temp As Boolean,
|
||||||
|
Optional ByVal __Icon As Icon = Nothing, Optional ByVal __Image As Image = Nothing)
|
||||||
|
Me.New(SiteName, __Icon, __Image)
|
||||||
|
Temporary = Temp
|
||||||
|
AccountName = AccName
|
||||||
|
If Temporary Then
|
||||||
|
With Responser
|
||||||
|
.File = Nothing
|
||||||
|
.Cookies.File = Nothing
|
||||||
|
.CookiesDomain = CookiesDomain
|
||||||
|
.CookiesEncryptKey = SettingsCLS.CookieEncryptKey
|
||||||
|
End With
|
||||||
|
_CookiesNetscapeFile = Nothing
|
||||||
|
Else
|
||||||
|
UpdateResponserFile()
|
||||||
With Responser
|
With Responser
|
||||||
.CookiesDomain = CookiesDomain
|
.CookiesDomain = CookiesDomain
|
||||||
.CookiesEncryptKey = SettingsCLS.CookieEncryptKey
|
.CookiesEncryptKey = SettingsCLS.CookieEncryptKey
|
||||||
If .File.Exists Then .LoadSettings() Else .SaveSettings()
|
If .File.Exists Then .LoadSettings() Else .SaveSettings()
|
||||||
End With
|
End With
|
||||||
End Sub
|
End If
|
||||||
#Region "XML"
|
|
||||||
Friend Overridable Sub Load(ByVal XMLValues As IEnumerable(Of KeyValuePair(Of String, String))) Implements ISiteSettings.Load
|
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Initialize"
|
#Region "Initialize"
|
||||||
Friend Overridable Sub BeginInit() Implements ISiteSettings.BeginInit
|
Friend Overridable Sub BeginInit() Implements ISiteSettings.BeginInit
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overridable Sub EndInit() Implements ISiteSettings.EndInit
|
Friend Overridable Sub EndInit() Implements ISiteSettings.EndInit
|
||||||
If Not DefaultUserAgent.IsEmptyString And Not Responser Is Nothing Then Responser.UserAgent = DefaultUserAgent
|
If _AllowUserAgentUpdate And Not DefaultUserAgent.IsEmptyString And Not Responser Is Nothing Then Responser.UserAgent = DefaultUserAgent
|
||||||
If CheckNetscapeCookiesOnEndInit Then Update_SaveCookiesNetscape(, True)
|
If CheckNetscapeCookiesOnEndInit Then Update_SaveCookiesNetscape(, True)
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
@@ -74,18 +141,40 @@ Namespace API.Base
|
|||||||
Protected _SiteEditorFormOpened As Boolean = False
|
Protected _SiteEditorFormOpened As Boolean = False
|
||||||
Friend Overridable Sub BeginEdit() Implements ISiteSettings.BeginEdit
|
Friend Overridable Sub BeginEdit() Implements ISiteSettings.BeginEdit
|
||||||
_SiteEditorFormOpened = True
|
_SiteEditorFormOpened = True
|
||||||
|
If UseNetscapeCookies And CookiesNetscapeFile.Exists Then
|
||||||
|
With Responser.Cookies
|
||||||
|
.Clear()
|
||||||
|
.AddRange(CookieKeeper.ParseNetscapeText(CookiesNetscapeFile.GetText, EDP.SendToLog + EDP.ReturnValue),, EDP.None)
|
||||||
|
End With
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overridable Sub EndEdit() Implements ISiteSettings.EndEdit
|
Friend Overridable Sub EndEdit() Implements ISiteSettings.EndEdit
|
||||||
If _SiteEditorFormOpened Then DomainsReset()
|
If _SiteEditorFormOpened Then DomainsReset()
|
||||||
_SiteEditorFormOpened = False
|
_SiteEditorFormOpened = False
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overridable Sub Update() Implements ISiteSettings.Update
|
Friend Overridable Overloads Sub Update() Implements ISiteSettings.Update
|
||||||
If _SiteEditorFormOpened Then
|
If _SiteEditorFormOpened Then
|
||||||
If UseNetscapeCookies Then Update_SaveCookiesNetscape()
|
If UseNetscapeCookies Then Update_SaveCookiesNetscape()
|
||||||
|
If Not Responser Is Nothing Then
|
||||||
|
With Responser.Headers
|
||||||
|
If .Count > 0 Then .ListDisposeRemove(Function(h) h.Value.IsEmptyString)
|
||||||
|
End With
|
||||||
|
End If
|
||||||
DomainsApply()
|
DomainsApply()
|
||||||
End If
|
End If
|
||||||
If Not Responser Is Nothing Then Responser.SaveSettings()
|
If Not Responser Is Nothing Then Responser.SaveSettings()
|
||||||
End Sub
|
End Sub
|
||||||
|
Friend Overridable Overloads Sub Update(ByVal Source As ISiteSettings) Implements ISiteSettings.Update
|
||||||
|
AccountName = Source.AccountName
|
||||||
|
If Not Responser Is Nothing Then Responser.Copy(DirectCast(Source, SiteSettingsBase).Responser) : UpdateResponserFile() : Responser.SaveSettings()
|
||||||
|
Update_CloneProperties(Source)
|
||||||
|
UpdateImpl(Source)
|
||||||
|
End Sub
|
||||||
|
Protected Overridable Sub Update_CloneProperties(ByVal Source As ISiteSettings)
|
||||||
|
CLONE_PROPERTIES(Source, Me, True)
|
||||||
|
End Sub
|
||||||
|
Protected Overridable Sub UpdateImpl(ByVal Source As ISiteSettings)
|
||||||
|
End Sub
|
||||||
Protected Sub Update_SaveCookiesNetscape(Optional ByVal Force As Boolean = False, Optional ByVal IsInit As Boolean = False)
|
Protected Sub Update_SaveCookiesNetscape(Optional ByVal Force As Boolean = False, Optional ByVal IsInit As Boolean = False)
|
||||||
If Not Responser Is Nothing Then
|
If Not Responser Is Nothing Then
|
||||||
With Responser
|
With Responser
|
||||||
@@ -105,13 +194,32 @@ Namespace API.Base
|
|||||||
#End Region
|
#End Region
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Before and After Download"
|
#Region "Before and After Download"
|
||||||
|
''' <summary>
|
||||||
|
''' PRE<br/>
|
||||||
|
''' DownloadStarted<br/>
|
||||||
|
''' <br/>
|
||||||
|
''' BEFORE<br/>
|
||||||
|
''' Available<br/>
|
||||||
|
''' <br/>
|
||||||
|
''' IN<br/>
|
||||||
|
''' ReadyToDownload<br/>
|
||||||
|
''' BeforeStartDownload<br/>
|
||||||
|
''' AfterDownload<br/>
|
||||||
|
''' <br/>
|
||||||
|
''' AFTER<br/>
|
||||||
|
''' DownloadDone
|
||||||
|
''' </summary>
|
||||||
Friend Overridable Sub DownloadStarted(ByVal What As Download) Implements ISiteSettings.DownloadStarted
|
Friend Overridable Sub DownloadStarted(ByVal What As Download) Implements ISiteSettings.DownloadStarted
|
||||||
End Sub
|
End Sub
|
||||||
|
''' <inheritdoc cref="DownloadStarted(Download)"/>
|
||||||
Friend Overridable Sub BeforeStartDownload(ByVal User As Object, ByVal What As Download) Implements ISiteSettings.BeforeStartDownload
|
Friend Overridable Sub BeforeStartDownload(ByVal User As Object, ByVal What As Download) Implements ISiteSettings.BeforeStartDownload
|
||||||
End Sub
|
End Sub
|
||||||
|
''' <inheritdoc cref="DownloadStarted(Download)"/>
|
||||||
Friend Overridable Sub AfterDownload(ByVal User As Object, ByVal What As Download) Implements ISiteSettings.AfterDownload
|
Friend Overridable Sub AfterDownload(ByVal User As Object, ByVal What As Download) Implements ISiteSettings.AfterDownload
|
||||||
End Sub
|
End Sub
|
||||||
|
''' <inheritdoc cref="DownloadStarted(Download)"/>
|
||||||
Friend Overridable Sub DownloadDone(ByVal What As Download) Implements ISiteSettings.DownloadDone
|
Friend Overridable Sub DownloadDone(ByVal What As Download) Implements ISiteSettings.DownloadDone
|
||||||
|
AvailableText = String.Empty
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "User info"
|
#Region "User info"
|
||||||
@@ -154,27 +262,135 @@ Namespace API.Base
|
|||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Ready, Available"
|
#Region "Ready, Available"
|
||||||
|
Friend Property AvailableText As String Implements ISiteSettings.AvailableText
|
||||||
''' <returns>True</returns>
|
''' <returns>True</returns>
|
||||||
Friend Overridable Function BaseAuthExists() As Boolean
|
Friend Overridable Function BaseAuthExists() As Boolean
|
||||||
Return True
|
Return True
|
||||||
End Function
|
End Function
|
||||||
''' <summary>JOB: leave or remove</summary>
|
|
||||||
''' <returns>Return BaseAuthExists()</returns>
|
''' <returns>Return BaseAuthExists()</returns>
|
||||||
|
''' <inheritdoc cref="DownloadStarted(Download)"/>
|
||||||
Friend Overridable Function Available(ByVal What As Download, ByVal Silent As Boolean) As Boolean Implements ISiteSettings.Available
|
Friend Overridable Function Available(ByVal What As Download, ByVal Silent As Boolean) As Boolean Implements ISiteSettings.Available
|
||||||
Return BaseAuthExists()
|
Return BaseAuthExists()
|
||||||
End Function
|
End Function
|
||||||
''' <summary>'DownloadData': before processing</summary>
|
|
||||||
''' <returns>True</returns>
|
''' <returns>True</returns>
|
||||||
|
''' <inheritdoc cref="DownloadStarted(Download)"/>
|
||||||
Friend Overridable Function ReadyToDownload(ByVal What As Download) As Boolean Implements ISiteSettings.ReadyToDownload
|
Friend Overridable Function ReadyToDownload(ByVal What As Download) As Boolean Implements ISiteSettings.ReadyToDownload
|
||||||
Return True
|
Return True
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
|
Protected Sub CLONE_PROPERTIES(ByVal Source As ISiteSettings, ByVal Destination As ISiteSettings, ByVal IsUpdate As Boolean,
|
||||||
|
Optional ByVal Full As Boolean = True)
|
||||||
|
Dim comparer As New MembersDistinctComparerExtended
|
||||||
|
'0 = update
|
||||||
|
'1 = clone
|
||||||
|
'2 = any
|
||||||
|
Dim filterUC As Func(Of MemberInfo, Byte, Boolean) = Function(ByVal m As MemberInfo, ByVal __mode As Byte) As Boolean
|
||||||
|
If m.GetCustomAttribute(Of DoNotUse) Is Nothing Then
|
||||||
|
Return False
|
||||||
|
Else
|
||||||
|
With m.GetCustomAttribute(Of PClonableAttribute)
|
||||||
|
Return Not .Self Is Nothing AndAlso (__mode = 2 OrElse If(__mode = 0, .Update, .Clone))
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Dim filterAll As Func(Of MemberInfo, Boolean) = Function(m) filterUC.Invoke(m, 2)
|
||||||
|
Dim filterC As Func(Of MemberInfo, Boolean) = Function(m) If(Full, filterAll.Invoke(m), filterUC.Invoke(m, 1))
|
||||||
|
Dim filterU As Func(Of MemberInfo, Boolean) = Function(m) filterUC.Invoke(m, 0)
|
||||||
|
Dim membersSource As IEnumerable(Of MemberInfo) = GetObjectMembers(Source, filterAll,, True, comparer)
|
||||||
|
If membersSource.ListExists Then
|
||||||
|
Dim membersDest As IEnumerable(Of MemberInfo) = GetObjectMembers(Destination, If(IsUpdate, filterU, filterC),, True, comparer)
|
||||||
|
If membersDest.ListExists Then
|
||||||
|
Dim mSource As MemberInfo = Nothing, mDest As MemberInfo = Nothing
|
||||||
|
Dim destIndx%
|
||||||
|
Dim isPropertyValue As Boolean
|
||||||
|
Dim sourceValue As Object
|
||||||
|
For Each mSource In membersSource
|
||||||
|
destIndx = membersDest.ListIndexOf(mSource, comparer, EDP.ReturnValue)
|
||||||
|
If destIndx.ValueBetween(0, membersDest.Count - 1) Then mDest = membersDest(destIndx) Else mDest = Nothing
|
||||||
|
If Not mDest Is Nothing Then
|
||||||
|
sourceValue = mSource.GetMemberValue(Source)
|
||||||
|
If mDest.MemberType = MemberTypes.Property Then
|
||||||
|
isPropertyValue = DirectCast(mDest, PropertyInfo).PropertyType Is GetType(PropertyValue)
|
||||||
|
Else
|
||||||
|
isPropertyValue = DirectCast(mDest, FieldInfo).FieldType Is GetType(PropertyValue)
|
||||||
|
End If
|
||||||
|
If isPropertyValue Then
|
||||||
|
DirectCast(mDest.GetMemberValue(Destination), PropertyValue).Clone(sourceValue)
|
||||||
|
Else
|
||||||
|
mDest.SetMemberValue(Destination, sourceValue)
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Protected Overridable Function CloneGetEmptySettingsInstance() As ISiteSettings
|
||||||
|
Dim _max% = -1
|
||||||
|
Dim c As ConstructorInfo = Nothing
|
||||||
|
With Me.GetType.GetTypeInfo.DeclaredConstructors
|
||||||
|
If .ListExists Then
|
||||||
|
With .Where(Function(m) If(m.GetParameters?.Count, 0).ValueBetween(0, 2))
|
||||||
|
If .ListExists Then
|
||||||
|
_max = .Max(Function(m) If(m.GetParameters?.Count, 0))
|
||||||
|
c = .First(Function(m) If(m.GetParameters?.Count, 0) = _max)
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
Select Case _max
|
||||||
|
Case 2 : Return c.Invoke({String.Empty, True})
|
||||||
|
Case 1 : Return c.Invoke({String.Empty})
|
||||||
|
Case 0 : Return c.Invoke(Nothing)
|
||||||
|
Case Else : Return Activator.CreateInstance(Me.GetType)
|
||||||
|
End Select
|
||||||
|
End With
|
||||||
|
End Function
|
||||||
|
Friend Overridable Function Clone(ByVal Full As Boolean) As ISiteSettings Implements ISiteSettings.Clone
|
||||||
|
Dim obj As ISiteSettings = CloneGetEmptySettingsInstance()
|
||||||
|
CLONE_PROPERTIES(Me, obj, False, Full)
|
||||||
|
Return obj
|
||||||
|
End Function
|
||||||
|
Friend Sub Delete() Implements ISiteSettings.Delete
|
||||||
|
If Not Responser Is Nothing Then
|
||||||
|
With Responser
|
||||||
|
If .File.Exists Then .File.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.None)
|
||||||
|
If .Cookies.File.Exists Then .Cookies.File.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.None)
|
||||||
|
End With
|
||||||
|
If _CookiesNetscapeFile.Exists Then _CookiesNetscapeFile.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.None)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
Friend Overridable Sub Reset() Implements ISiteSettings.Reset
|
Friend Overridable Sub Reset() Implements ISiteSettings.Reset
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overridable Sub UserOptions(ByRef Options As Object, ByVal OpenForm As Boolean) Implements ISiteSettings.UserOptions
|
Friend Overridable Sub UserOptions(ByRef Options As Object, ByVal OpenForm As Boolean) Implements ISiteSettings.UserOptions
|
||||||
|
If _UserOptionsExists Then
|
||||||
|
If Options Is Nothing OrElse Not Options.GetType Is _UserOptionsType Then
|
||||||
|
Options = AConvert(Me, AModes.Var, _UserOptionsType,, True, Nothing)
|
||||||
|
If Options Is Nothing Then Options = Activator.CreateInstance(_UserOptionsType)
|
||||||
|
End If
|
||||||
|
If OpenForm Then
|
||||||
|
Using f As New InternalSettingsForm(Options, Me, False) : f.ShowDialog() : End Using
|
||||||
|
End If
|
||||||
|
Else
|
||||||
Options = Nothing
|
Options = Nothing
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overridable Sub OpenSettingsForm() Implements ISiteSettings.OpenSettingsForm
|
Friend Overridable Sub OpenSettingsForm() Implements ISiteSettings.OpenSettingsForm
|
||||||
End Sub
|
End Sub
|
||||||
|
#Region "IDisposable Support"
|
||||||
|
Protected disposedValue As Boolean = False
|
||||||
|
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
|
||||||
|
If Not disposedValue Then
|
||||||
|
If disposing Then Responser.DisposeIfReady
|
||||||
|
disposedValue = True
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Protected Overrides Sub Finalize()
|
||||||
|
Dispose(False)
|
||||||
|
MyBase.Finalize()
|
||||||
|
End Sub
|
||||||
|
Friend Overloads Sub Dispose() Implements IDisposable.Dispose
|
||||||
|
Dispose(True)
|
||||||
|
GC.SuppressFinalize(Me)
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -12,6 +12,14 @@ Imports PersonalUtilities.Functions.XML.Base
|
|||||||
Imports PersonalUtilities.Functions.RegularExpressions
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Namespace API.Base
|
Namespace API.Base
|
||||||
Friend Module Structures
|
Friend Module Structures
|
||||||
|
Friend Enum SiteModes As Integer
|
||||||
|
User = 0
|
||||||
|
Search = 1
|
||||||
|
Tags = 2
|
||||||
|
Categories = 3
|
||||||
|
Pornstars = 4
|
||||||
|
Playlists = 5
|
||||||
|
End Enum
|
||||||
Friend Structure UserMedia : Implements IUserMedia, IEquatable(Of UserMedia), IEContainerProvider
|
Friend Structure UserMedia : Implements IUserMedia, IEquatable(Of UserMedia), IEContainerProvider
|
||||||
#Region "XML Names"
|
#Region "XML Names"
|
||||||
Friend Const Name_MediaNode As String = "MediaData"
|
Friend Const Name_MediaNode As String = "MediaData"
|
||||||
@@ -182,6 +190,7 @@ Namespace API.Base
|
|||||||
End With
|
End With
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
'TODO: UserMedia.SpecialFolder
|
||||||
SpecialFolder = e.Attribute(Name_SpecialFolder).Value
|
SpecialFolder = e.Attribute(Name_SpecialFolder).Value
|
||||||
If Not SpecialFolder.IsEmptyString Then upath &= $"{SpecialFolder}\"
|
If Not SpecialFolder.IsEmptyString Then upath &= $"{SpecialFolder}\"
|
||||||
If vp.HasValue AndAlso vp.Value Then upath &= $"Video\"
|
If vp.HasValue AndAlso vp.Value Then upath &= $"Video\"
|
||||||
|
|||||||