Compare commits
13 Commits
2024.1.12.
...
2024.2.25.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
09760a6926 | ||
|
|
75039ac4d2 | ||
|
|
03e3a07947 | ||
|
|
d283d9c9f9 | ||
|
|
b9100bd3c1 | ||
|
|
0ea2156ada | ||
|
|
520280b038 | ||
|
|
10516f229b | ||
|
|
c3f0831768 | ||
|
|
74a0404670 | ||
|
|
52a43b9207 | ||
|
|
5bc559c448 | ||
|
|
b37f641582 |
@@ -5,7 +5,12 @@ I welcome requests! Follow these steps to contribute:
|
|||||||
1. Find an [issue](https://github.com/AAndyProgram/SCrawler/issues) that needs assistance.
|
1. Find an [issue](https://github.com/AAndyProgram/SCrawler/issues) that needs assistance.
|
||||||
1. Let me know you are working on it by posting a comment on the issue.
|
1. Let me know you are working on it by posting a comment on the issue.
|
||||||
1. If you find an error in the code, please provide a link to the file and the line number.
|
1. If you find an error in the code, please provide a link to the file and the line number.
|
||||||
1. If you have a code change suggestion, you can post a replacement code block. I also accept pull requests.
|
1. If you have a code change suggestion, you can post a replacement code block.<!-- I also accept pull requests.-->
|
||||||
|
|
||||||
|
# How to report a problem
|
||||||
|
1. Attach a **profile URL** that you cannot download.
|
||||||
|
1. Attach the **LOG** if it exists.
|
||||||
|
1. **Attach information to the issue 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 into the issue).**
|
||||||
|
|
||||||
# How to build from source
|
# How to build from source
|
||||||
1. Delete the `PersonalUtilities` project from the solution.
|
1. Delete the `PersonalUtilities` project from the solution.
|
||||||
|
|||||||
64
Changelog.md
@@ -1,3 +1,67 @@
|
|||||||
|
# 2024.2.25.0
|
||||||
|
|
||||||
|
*2024-02-25*
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- A `Feed` button has been added to notifications
|
||||||
|
- Feed:
|
||||||
|
- ability to merge multiple special feeds into one
|
||||||
|
- ability to select all/none media
|
||||||
|
- ability to add to a special feed(s) with removal from the current one
|
||||||
|
- the name of the loaded feed is now displayed in the form title
|
||||||
|
- `Refresh` button now refreshes the loaded feed
|
||||||
|
- ability to move/copy media
|
||||||
|
- Scheduler: the ability to move tasks (higher, lower) *(just a view attribute, doesn't affect the scheduler)*
|
||||||
|
- YouTube (standalone app): add `Open file` to the context menu
|
||||||
|
- YouTube (standalone app): **the ability to edit each playlist item**
|
||||||
|
- YouTube (standalone app): **embed thumbnail in the audio/video as cover art** (Settings: `Defaults Audio` - `Embed thumbnail`; `Defaults Video` - `Embed thumbnail (video)`)
|
||||||
|
- Instagram: the `csrftoken` can now be automatically extracted from cookies
|
||||||
|
- Instagram: remove `x-ig-www-claim` from settings
|
||||||
|
- Threads: the `csrftoken` can now be automatically extracted from cookies
|
||||||
|
- Threads: simplify 500 error when updating tokens
|
||||||
|
- Facebook: simplify token update errors
|
||||||
|
- OnlyFans: handle 500 error
|
||||||
|
- Plugins: added `ReplaceInternalPluginAttribute` attribute
|
||||||
|
- Other improvements
|
||||||
|
- Fixed
|
||||||
|
- Main window: incorrect sorting of profiles and collections
|
||||||
|
- Standalone downloader: url array form doesn't show scrollbars
|
||||||
|
- Feed: image rendering bug
|
||||||
|
- YouTube (standalone app): audio codec does not change when changing audio/video in the video options form
|
||||||
|
- Instagram: error downloading single post
|
||||||
|
- TikTok: files with long names aren't downloaded
|
||||||
|
- Minor bugs
|
||||||
|
|
||||||
|
# 2024.1.26.0
|
||||||
|
|
||||||
|
*2024-01-26*
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- YouTube (standalone app): **the ability to reduce video FPS**
|
||||||
|
- TikTok: the ability to use a regex to clean the title
|
||||||
|
- YouTube (SCrawler): the ability to ignore community errors
|
||||||
|
- Fixed
|
||||||
|
- Instagram: stories (user) downloading with the wrong aspect ratio for some users
|
||||||
|
- Minor bugs
|
||||||
|
|
||||||
|
# 2024.1.20.0
|
||||||
|
|
||||||
|
*2024-01-20*
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- Instagram: **the ability to download reels**
|
||||||
|
- LPSG: handle 404 error
|
||||||
|
|
||||||
|
# 2024.1.18.0
|
||||||
|
|
||||||
|
*2024-01-18*
|
||||||
|
|
||||||
|
- Fixed
|
||||||
|
- Main window: incorrect collection sorting
|
||||||
|
- xHamster: some user videos were not downloaded
|
||||||
|
- YouTube (standalone app): URL array form doesn't show scrollbars
|
||||||
|
- Minor bugs
|
||||||
|
|
||||||
# 2024.1.12.1
|
# 2024.1.12.1
|
||||||
|
|
||||||
*2024-01-12*
|
*2024-01-12*
|
||||||
|
|||||||
19
FAQ.md
@@ -14,8 +14,6 @@ Any other questions I will keep in this file.
|
|||||||
|
|
||||||
A: https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-set-up-cookies
|
A: https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-set-up-cookies
|
||||||
|
|
||||||
<!---**ATTENTION! If you need to use cookies but cannot import them, I highly recommend that you don't use SCrawler and use another program. Don't create issues, discussions, or write to me on Discord. Any issue or discussion about cookies will be deleted immediately without a response. Any user who asks me about cookies on Discord will be banned.**--->
|
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
#### Q: **Does this program have GUI or CLI.**
|
#### Q: **Does this program have GUI or CLI.**
|
||||||
@@ -41,13 +39,16 @@ A: NO.
|
|||||||
|
|
||||||
A: Check your credentials and **[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)**. If all settings are set, but nothing works, go to [create a new issue](https://github.com/AAndyProgram/SCrawler/issues). Don't forget to attach the LOG.
|
A: Check your credentials and **[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)**. If all settings are set, but nothing works, go to [create a new issue](https://github.com/AAndyProgram/SCrawler/issues). Don't forget to attach the LOG.
|
||||||
|
|
||||||
|
**You also can join our Discord server**: https://discord.gg/uFNUXvFFmg
|
||||||
|
<br/>*You can get help faster there!*
|
||||||
|
|
||||||
**ATTENTION! Issues without URLs will be closed without a response!**
|
**ATTENTION! Issues without URLs will be closed without a response!**
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
#### Q: **I have set credentials but still nothing is downloading**
|
#### Q: **I have set credentials but still nothing is downloading**
|
||||||
|
|
||||||
A: Click the ```Start downloading``` button
|
A: Click the `Start downloading` button or press `F5`
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -59,7 +60,7 @@ A: https://github.com/AAndyProgram/SCrawler/releases/latest
|
|||||||
|
|
||||||
#### Q: **How to run the program?**
|
#### Q: **How to run the program?**
|
||||||
|
|
||||||
A: Double-click ```SCrawler.exe```
|
A: Double-click `SCrawler.exe`
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -77,19 +78,19 @@ A: The program stored posts IDs in users' folders. For the first time, the progr
|
|||||||
|
|
||||||
#### Q: **How to redownload all data**
|
#### Q: **How to redownload all data**
|
||||||
|
|
||||||
A: Double-click on the user you want to redownload. In the opened window open folder setting. Delete the files ending with ```_Data.xml``` and ```_Posts.txt```. Restart SCrawler. Download this user again.
|
A: https://github.com/AAndyProgram/SCrawler/wiki#redownload-user
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
#### Q: **How to remove the label**
|
#### Q: **How to remove the label**
|
||||||
|
|
||||||
A: There is no functionality to remove an individual label. You can open the ```Labels.txt``` file in the program settings folder and delete any label you want. You also can delete this file (```Labels.txt```). In this case, when the program starts, the list of labels list will be updated with only existing labels (from the user data files).
|
A: There is no functionality to remove an individual label. You can open the `Labels.txt` file in the program settings folder and delete any label you want. You also can delete this file (`Labels.txt`). In this case, when the program starts, the list of labels list will be updated with only existing labels (from the user data files).
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
#### Q: **How to remove a user from the blacklist**
|
#### Q: **How to remove a user from the blacklist**
|
||||||
|
|
||||||
A: Just add that user back to the program. In the dialog box that opens, click on the ```Add and remove from blacklist``` button.
|
A: Just add that user back to the program. In the dialog box that opens, click on the `Add and remove from blacklist` button.
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -113,8 +114,8 @@ A: I can only [suggest](#q-you-lost-me-your-program-is-too-complicated) you find
|
|||||||
|
|
||||||
#### Q: **Can you add a step-by-step guide or video on how to use the program?**
|
#### Q: **Can you add a step-by-step guide or video on how to use the program?**
|
||||||
|
|
||||||
A: **NO! NEVER!** The guide fully covers all the functionality of SCrawler! If you don't respect my work, I don't waste my time. If you want, you can create a video tutorial and send it to me. Then I add it. All options and what each option does described on the wiki. The wiki also contains a description of all settings and how-to configure them. For complex settings, there is a steep-by-steep guide. Read the [main](README.md) information and [GUIDE](https://github.com/AAndyProgram/SCrawler/wiki/) and you won't have any problems. I have developed a program with an intuitive interface. There is a Settings button, download buttons, a context menu that drops down when a user is clicked, and other controls. Anyone can use it.
|
A: **NO!** The guide fully covers all the functionality of SCrawler! If you don't respect my work, I don't waste my time. If you want, you can create a video tutorial and send it to me. Then I add it. All options and what each option does described on the wiki. The wiki also contains a description of all settings and how-to configure them. For complex settings, there is a steep-by-steep guide. Read the [main](README.md) information and [GUIDE](https://github.com/AAndyProgram/SCrawler/wiki/) and you won't have any problems. I have developed a program with an intuitive interface. There is a Settings button, download buttons, a context menu that drops down when a user is clicked, and other controls. Anyone can use it.
|
||||||
|
|
||||||
**The following video shows how to add credentials:**
|
**The following video was recorded by a user who loves SCrawler and demonstrates how to add credentials using Instagram as an example:**
|
||||||
|
|
||||||
[](https://www.youtube.com/watch?v=XDn7zG4I700)
|
[](https://www.youtube.com/watch?v=XDn7zG4I700)
|
||||||
@@ -2,6 +2,8 @@ You can create a plugin for any site you want. **To create a plugin, read [this
|
|||||||
|
|
||||||
If you've created a plugin, you can create a [new issue](https://github.com/AAndyProgram/SCrawler/issues/new?assignees=&labels=New+Plugin&projects=&template=plugin_add.md&title=%5BNEW+PLUGIN%5D) and I'll add your plugin to the list below.
|
If you've created a plugin, you can create a [new issue](https://github.com/AAndyProgram/SCrawler/issues/new?assignees=&labels=New+Plugin&projects=&template=plugin_add.md&title=%5BNEW+PLUGIN%5D) and I'll add your plugin to the list below.
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
List of available plugins:
|
List of available plugins:
|
||||||
|
|
||||||
Tools:
|
Tools:
|
||||||
|
|||||||
BIN
ProgramScreenshots/FeedMoveCopyTo.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 491 KiB After Width: | Height: | Size: 472 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 35 KiB |
BIN
ProgramScreenshots/SettingsSiteInstagramData.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 21 KiB |
18
README.md
@@ -15,6 +15,10 @@
|
|||||||
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).
|
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)**
|
||||||
|
|
||||||
|
**Join our Discord server**: https://discord.gg/uFNUXvFFmg
|
||||||
|
<br/>*If you have problems using the program, you can get help faster on our Discord server!*
|
||||||
|
|
||||||
<!---Do you like this program? Consider adding to my coffee fund by making a donation to show your support. :blush:
|
<!---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
|
||||||
@@ -74,12 +78,12 @@ A program to download photo and video from [any site](#supported-sites) (e.g. Yo
|
|||||||
- **YouTube Music**
|
- **YouTube Music**
|
||||||
- **Reddit**
|
- **Reddit**
|
||||||
- **Twitter**
|
- **Twitter**
|
||||||
- **OnlyFans**
|
- **OnlyFans** *(partial support)*[^1]
|
||||||
- **Mastodon**
|
- **Mastodon**
|
||||||
- **Instagram**
|
- **Instagram**
|
||||||
- **Threads**
|
- **Threads**
|
||||||
- **Facebook**
|
- **Facebook**
|
||||||
- JustForFans
|
- JustForFans *(partial support)*[^1]
|
||||||
- TikTok
|
- TikTok
|
||||||
- RedGifs
|
- RedGifs
|
||||||
- Pinterest
|
- Pinterest
|
||||||
@@ -155,9 +159,15 @@ First, the program downloads the full profile. After the program downloads only
|
|||||||
|
|
||||||
**Don't put program in the ```Program Files``` system folder (this is portable program and program settings are stored in the program folder)**
|
**Don't put program in the ```Program Files``` system folder (this is portable program and program settings are stored in the program folder)**
|
||||||
|
|
||||||
|
**I highly doubt you can run SCrawler on Linux or Mac. SCrawler is a program that is heavily dependent on Windows.**
|
||||||
|
|
||||||
# Updating
|
# Updating
|
||||||
|
|
||||||
Just download [latest](https://github.com/AAndyProgram/SCrawler/releases/latest) version and unpack it into the program folder. **Before starting a new version, I recommend making a backup copy of the program settings folder.**
|
Just download [latest](https://github.com/AAndyProgram/SCrawler/releases/latest) version and unpack it into the program folder. **Before launching a new version, I recommend making a backup copy of the program settings folder and user settings/data files.**
|
||||||
|
|
||||||
|
**You can also use the updater included in the release package.**
|
||||||
|
|
||||||
|
# [How to report a problem](CONTRIBUTING.md#how-to-report-a-problem)
|
||||||
|
|
||||||
# [How to build from source](CONTRIBUTING.md#how-to-build-from-source)
|
# [How to build from source](CONTRIBUTING.md#how-to-build-from-source)
|
||||||
|
|
||||||
@@ -216,3 +226,5 @@ Discord server: https://discord.gg/uFNUXvFFmg
|
|||||||
|
|
||||||
[Wire](https://account.wire.com/user-profile/?id=93985052-cf2c-4b72-ac75-bbe3231cf544): @andyprogram
|
[Wire](https://account.wire.com/user-profile/?id=93985052-cf2c-4b72-ac75-bbe3231cf544): @andyprogram
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
[^1]: Partial support means that I don't have personal accounts on paid porn sites because I don't pay for porn. If this site has stopped downloading and you want me to fix it, please be ready to give me access to an account with at least one active subscription. Otherwise, the download from this site will not be fixed.
|
||||||
@@ -188,4 +188,13 @@ Namespace Plugin.Attributes
|
|||||||
Repository = RepoName
|
Repository = RepoName
|
||||||
End Sub
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
|
''' <summary>Replace internal plugin with the current one</summary>
|
||||||
|
<AttributeUsage(AttributeTargets.Class, AllowMultiple:=False, Inherited:=False)> Public NotInheritable Class ReplaceInternalPluginAttribute : Inherits Attribute
|
||||||
|
Public ReadOnly SiteName As String
|
||||||
|
Public ReadOnly PluginKey As String
|
||||||
|
Public Sub New(ByVal PluginKey As String, Optional ByVal SiteName As String = Nothing)
|
||||||
|
Me.PluginKey = PluginKey
|
||||||
|
Me.SiteName = SiteName
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -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.11.24.0")>
|
<Assembly: AssemblyVersion("2024.2.25.0")>
|
||||||
<Assembly: AssemblyFileVersion("2023.11.24.0")>
|
<Assembly: AssemblyFileVersion("2024.2.25.0")>
|
||||||
<Assembly: NeutralResourcesLanguage("en")>
|
<Assembly: NeutralResourcesLanguage("en")>
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ Imports PersonalUtilities.Forms
|
|||||||
Imports PersonalUtilities.Functions.XML
|
Imports PersonalUtilities.Functions.XML
|
||||||
Imports PersonalUtilities.Functions.XML.Base
|
Imports PersonalUtilities.Functions.XML.Base
|
||||||
Imports PersonalUtilities.Functions.XML.Objects
|
Imports PersonalUtilities.Functions.XML.Objects
|
||||||
|
Imports PersonalUtilities.Functions.XML.Attributes
|
||||||
Imports PersonalUtilities.Functions.XML.Attributes.Specialized
|
Imports PersonalUtilities.Functions.XML.Attributes.Specialized
|
||||||
Imports PersonalUtilities.Tools
|
Imports PersonalUtilities.Tools
|
||||||
Imports PersonalUtilities.Tools.Grid.Base
|
Imports PersonalUtilities.Tools.Grid.Base
|
||||||
@@ -272,9 +273,77 @@ 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"}, False), Category("Defaults Video"), DisplayName("Embed thumbnail (video)"),
|
||||||
|
Description("Embed thumbnail in the video as cover art. Default: true.")>
|
||||||
|
Public ReadOnly Property DefaultVideoEmbedThumbnail As XMLValue(Of Boolean)
|
||||||
<Browsable(True), GridVisible, XMLVN({"DefaultsVideo"}), Category("Defaults Video"), DisplayName("Include zero size formats"),
|
<Browsable(True), GridVisible, XMLVN({"DefaultsVideo"}), Category("Defaults Video"), DisplayName("Include zero size formats"),
|
||||||
Description("Include formats with zero size (or undefined size).")>
|
Description("Include formats with zero size (or undefined size).")>
|
||||||
Public ReadOnly Property DefaultVideoIncludeNullSize As XMLValue(Of Boolean)
|
Public ReadOnly Property DefaultVideoIncludeNullSize As XMLValue(Of Boolean)
|
||||||
|
<Browsable(False), XMLV("DefaultVideoFPS", {"DefaultsVideo"}, -1)>
|
||||||
|
Private ReadOnly Property DefaultVideoFPS_XML As XMLValue(Of Double)
|
||||||
|
<Browsable(True), GridVisible, Category("Defaults Video"), DisplayName("Default video FPS"),
|
||||||
|
Description("Set default video FPS (only to reduce video FPS). Default: -1 (disabled)."),
|
||||||
|
TypeConverter(GetType(FieldsTypeConverter)), GridFormatProvider(GetType(FpsFormatProvider))>
|
||||||
|
Public Property DefaultVideoFPS As Double
|
||||||
|
Get
|
||||||
|
Return DefaultVideoFPS_XML
|
||||||
|
End Get
|
||||||
|
Set(ByVal fps As Double)
|
||||||
|
DefaultVideoFPS_XML.Value = fps
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Function ShouldSerializeDefaultVideoFPS() As Boolean
|
||||||
|
Return DefaultVideoFPS <> DefaultVideoFPS_XML.Value
|
||||||
|
End Function
|
||||||
|
Private Sub ResetDefaultVideoFPS()
|
||||||
|
DefaultVideoFPS = -1
|
||||||
|
End Sub
|
||||||
|
Friend Class FpsFormatProvider : Implements IGridConversionProvider
|
||||||
|
Private Property Converter As TypeConverter Implements IGridConversionProvider.Converter
|
||||||
|
Private Property Context As ITypeDescriptorContext Implements IGridConversionProvider.Context
|
||||||
|
Private Property DataType As Type Implements IGridConversionProvider.DataType
|
||||||
|
Private Property Instance As Object Implements IGridConversionProvider.Instance
|
||||||
|
Friend Shared ReadOnly Property MyProviderDefault As ANumbers
|
||||||
|
Get
|
||||||
|
Return New ANumbers(ANumbers.Cultures.Primitive) With {.DecimalDigits = 5, .TrimDecimalDigits = True}
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Friend Const ErrorMessageDefault As String = "The fps value must be a number"
|
||||||
|
Private ReadOnly MyProvider As ANumbers = MyProviderDefault
|
||||||
|
Friend Function ToObject(ByVal Context As ITypeDescriptorContext, ByVal Culture As CultureInfo, ByVal Value As Object) As Object Implements IGridConversionProvider.ToObject
|
||||||
|
Return AConvert(Of Double)(Value, MyProvider, -1)
|
||||||
|
End Function
|
||||||
|
Friend Overloads Function ToString(ByVal Context As ITypeDescriptorContext, ByVal Culture As CultureInfo, ByVal Value As Object,
|
||||||
|
ByVal DestinationType As Type) As Object Implements IGridConversionProvider.ToString
|
||||||
|
If ACheck(Of Double)(Value, AModes.Var, MyProvider) Then
|
||||||
|
Return Value.ToString
|
||||||
|
Else
|
||||||
|
Return -1
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Friend Function CreateInstance(ByVal Context As ITypeDescriptorContext, ByVal NewValue As Object, ByRef RefreshGrid As Boolean) As Object Implements IGridConversionProvider.CreateInstance
|
||||||
|
If ACheck(Of Double)(NewValue, AModes.Var, MyProvider) Then
|
||||||
|
Return NewValue
|
||||||
|
Else
|
||||||
|
RefreshGrid = True
|
||||||
|
Return -1
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Friend Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider,
|
||||||
|
Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert
|
||||||
|
Return AConvert(Value, AModes.Var, DestinationType,, True, -1, MyProvider, EDP.ReturnValue)
|
||||||
|
End Function
|
||||||
|
Friend Function IsValid(ByVal Context As ITypeDescriptorContext, ByVal Value As Object, ByVal DestinationType As Type) As Boolean Implements IGridValidator.IsValid
|
||||||
|
If ACheck(Of Double)(Value, AModes.Var, MyProvider) Then
|
||||||
|
Return True
|
||||||
|
Else
|
||||||
|
Throw New FormatException(ErrorMessageDefault)
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat
|
||||||
|
Throw New NotImplementedException("'GetFormat' is not available in 'FpsFormatProvider'")
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
#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"),
|
||||||
@@ -294,6 +363,9 @@ Namespace API.YouTube.Base
|
|||||||
TypeConverter(GetType(ValueCollectionConverter)),
|
TypeConverter(GetType(ValueCollectionConverter)),
|
||||||
Description("Additional audio format for downloading videos. This means that the audio will be extracted and saved as a separate file in these formats.")>
|
Description("Additional audio format for downloading videos. This means that the audio will be extracted and saved as a separate file in these formats.")>
|
||||||
Public ReadOnly Property DefaultAudioCodecAddit As XMLValuesCollection(Of String)
|
Public ReadOnly Property DefaultAudioCodecAddit As XMLValuesCollection(Of String)
|
||||||
|
<Browsable(True), GridVisible, XMLVN({"DefaultsAudio"}, True), Category("Defaults Audio"), DisplayName("Embed thumbnail"),
|
||||||
|
Description("Embed thumbnail in the audio as cover art. Default: true.")>
|
||||||
|
Public ReadOnly Property DefaultAudioEmbedThumbnail As XMLValue(Of Boolean)
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Defaults Subtitles"
|
#Region "Defaults Subtitles"
|
||||||
<XMLVN({"DefaultsSubtitles"}, {"en"}, CollectionMode:=IXMLValuesCollection.Modes.String)>
|
<XMLVN({"DefaultsSubtitles"}, {"en"}, CollectionMode:=IXMLValuesCollection.Modes.String)>
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TXT_URLS.MaxLength = 2147483647
|
Me.TXT_URLS.MaxLength = 2147483647
|
||||||
Me.TXT_URLS.Multiline = True
|
Me.TXT_URLS.Multiline = True
|
||||||
Me.TXT_URLS.Name = "TXT_URLS"
|
Me.TXT_URLS.Name = "TXT_URLS"
|
||||||
|
Me.TXT_URLS.ScrollBars = System.Windows.Forms.ScrollBars.Both
|
||||||
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
|
||||||
'
|
'
|
||||||
|
|||||||
134
SCrawler.YouTube/Controls/VideoOptionsForm.Designer.vb
generated
@@ -50,6 +50,7 @@ Namespace API.YouTube.Controls
|
|||||||
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()
|
Dim ActionButton10 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim ActionButton11 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
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()
|
||||||
@@ -71,6 +72,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.CMB_FORMAT = New System.Windows.Forms.ComboBox()
|
Me.CMB_FORMAT = New System.Windows.Forms.ComboBox()
|
||||||
Me.CMB_AUDIO_CODEC = New System.Windows.Forms.ComboBox()
|
Me.CMB_AUDIO_CODEC = New System.Windows.Forms.ComboBox()
|
||||||
Me.NUM_RES = New System.Windows.Forms.NumericUpDown()
|
Me.NUM_RES = New System.Windows.Forms.NumericUpDown()
|
||||||
|
Me.TXT_FPS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.TP_CONTROLS = New System.Windows.Forms.TableLayoutPanel()
|
Me.TP_CONTROLS = New System.Windows.Forms.TableLayoutPanel()
|
||||||
Me.TXT_SUBS_ADDIT = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_SUBS_ADDIT = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_EXTRA_AUDIO_FORMATS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
@@ -105,6 +107,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TP_MAIN.SuspendLayout()
|
Me.TP_MAIN.SuspendLayout()
|
||||||
Me.TP_OPTIONS.SuspendLayout()
|
Me.TP_OPTIONS.SuspendLayout()
|
||||||
CType(Me.NUM_RES, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.NUM_RES, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.TXT_FPS, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
CType(Me.TXT_SUBS_ADDIT, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.TXT_SUBS_ADDIT, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
CType(Me.TXT_EXTRA_AUDIO_FORMATS, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.TXT_EXTRA_AUDIO_FORMATS, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
Me.SuspendLayout()
|
Me.SuspendLayout()
|
||||||
@@ -123,7 +126,7 @@ Namespace API.YouTube.Controls
|
|||||||
TP_HEADER.Name = "TP_HEADER"
|
TP_HEADER.Name = "TP_HEADER"
|
||||||
TP_HEADER.RowCount = 1
|
TP_HEADER.RowCount = 1
|
||||||
TP_HEADER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
TP_HEADER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
TP_HEADER.Size = New System.Drawing.Size(599, 63)
|
TP_HEADER.Size = New System.Drawing.Size(719, 63)
|
||||||
TP_HEADER.TabIndex = 0
|
TP_HEADER.TabIndex = 0
|
||||||
'
|
'
|
||||||
'ICON_VIDEO
|
'ICON_VIDEO
|
||||||
@@ -152,7 +155,7 @@ Namespace API.YouTube.Controls
|
|||||||
TP_HEADER_INFO.RowCount = 2
|
TP_HEADER_INFO.RowCount = 2
|
||||||
TP_HEADER_INFO.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
TP_HEADER_INFO.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
TP_HEADER_INFO.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
TP_HEADER_INFO.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
TP_HEADER_INFO.Size = New System.Drawing.Size(469, 63)
|
TP_HEADER_INFO.Size = New System.Drawing.Size(589, 63)
|
||||||
TP_HEADER_INFO.TabIndex = 0
|
TP_HEADER_INFO.TabIndex = 0
|
||||||
'
|
'
|
||||||
'LBL_TITLE
|
'LBL_TITLE
|
||||||
@@ -161,7 +164,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.LBL_TITLE.Font = New System.Drawing.Font("Arial", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(204, Byte))
|
Me.LBL_TITLE.Font = New System.Drawing.Font("Arial", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(204, Byte))
|
||||||
Me.LBL_TITLE.Location = New System.Drawing.Point(3, 0)
|
Me.LBL_TITLE.Location = New System.Drawing.Point(3, 0)
|
||||||
Me.LBL_TITLE.Name = "LBL_TITLE"
|
Me.LBL_TITLE.Name = "LBL_TITLE"
|
||||||
Me.LBL_TITLE.Size = New System.Drawing.Size(463, 31)
|
Me.LBL_TITLE.Size = New System.Drawing.Size(583, 31)
|
||||||
Me.LBL_TITLE.TabIndex = 0
|
Me.LBL_TITLE.TabIndex = 0
|
||||||
Me.LBL_TITLE.Text = "Video title"
|
Me.LBL_TITLE.Text = "Video title"
|
||||||
Me.LBL_TITLE.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
|
Me.LBL_TITLE.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
|
||||||
@@ -183,7 +186,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TP_HEADER_INFO_2.Name = "TP_HEADER_INFO_2"
|
Me.TP_HEADER_INFO_2.Name = "TP_HEADER_INFO_2"
|
||||||
Me.TP_HEADER_INFO_2.RowCount = 1
|
Me.TP_HEADER_INFO_2.RowCount = 1
|
||||||
Me.TP_HEADER_INFO_2.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
Me.TP_HEADER_INFO_2.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
Me.TP_HEADER_INFO_2.Size = New System.Drawing.Size(469, 32)
|
Me.TP_HEADER_INFO_2.Size = New System.Drawing.Size(589, 32)
|
||||||
Me.TP_HEADER_INFO_2.TabIndex = 1
|
Me.TP_HEADER_INFO_2.TabIndex = 1
|
||||||
'
|
'
|
||||||
'ICON_CLOCK
|
'ICON_CLOCK
|
||||||
@@ -230,7 +233,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.LBL_URL.LinkColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(192, Byte), Integer))
|
Me.LBL_URL.LinkColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(192, Byte), Integer))
|
||||||
Me.LBL_URL.Location = New System.Drawing.Point(115, 0)
|
Me.LBL_URL.Location = New System.Drawing.Point(115, 0)
|
||||||
Me.LBL_URL.Name = "LBL_URL"
|
Me.LBL_URL.Name = "LBL_URL"
|
||||||
Me.LBL_URL.Size = New System.Drawing.Size(351, 32)
|
Me.LBL_URL.Size = New System.Drawing.Size(471, 32)
|
||||||
Me.LBL_URL.TabIndex = 1
|
Me.LBL_URL.TabIndex = 1
|
||||||
Me.LBL_URL.TabStop = True
|
Me.LBL_URL.TabStop = True
|
||||||
Me.LBL_URL.Text = "https://www.youtube.com/watch?v=abcdefghijk"
|
Me.LBL_URL.Text = "https://www.youtube.com/watch?v=abcdefghijk"
|
||||||
@@ -250,7 +253,7 @@ Namespace API.YouTube.Controls
|
|||||||
TP_FOOTER.RowCount = 2
|
TP_FOOTER.RowCount = 2
|
||||||
TP_FOOTER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
TP_FOOTER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
TP_FOOTER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
TP_FOOTER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
TP_FOOTER.Size = New System.Drawing.Size(589, 52)
|
TP_FOOTER.Size = New System.Drawing.Size(709, 52)
|
||||||
TP_FOOTER.TabIndex = 5
|
TP_FOOTER.TabIndex = 5
|
||||||
'
|
'
|
||||||
'TP_DESTINATION
|
'TP_DESTINATION
|
||||||
@@ -266,7 +269,7 @@ Namespace API.YouTube.Controls
|
|||||||
TP_DESTINATION.Name = "TP_DESTINATION"
|
TP_DESTINATION.Name = "TP_DESTINATION"
|
||||||
TP_DESTINATION.RowCount = 1
|
TP_DESTINATION.RowCount = 1
|
||||||
TP_DESTINATION.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
TP_DESTINATION.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
TP_DESTINATION.Size = New System.Drawing.Size(589, 26)
|
TP_DESTINATION.Size = New System.Drawing.Size(709, 26)
|
||||||
TP_DESTINATION.TabIndex = 0
|
TP_DESTINATION.TabIndex = 0
|
||||||
'
|
'
|
||||||
'TXT_FILE
|
'TXT_FILE
|
||||||
@@ -290,14 +293,14 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TXT_FILE.Location = New System.Drawing.Point(1, 1)
|
Me.TXT_FILE.Location = New System.Drawing.Point(1, 1)
|
||||||
Me.TXT_FILE.Margin = New System.Windows.Forms.Padding(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(507, 22)
|
Me.TXT_FILE.Size = New System.Drawing.Size(627, 22)
|
||||||
Me.TXT_FILE.TabIndex = 0
|
Me.TXT_FILE.TabIndex = 0
|
||||||
Me.TXT_FILE.TextBoxBorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
|
Me.TXT_FILE.TextBoxBorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
|
||||||
'
|
'
|
||||||
'BTT_BROWSE
|
'BTT_BROWSE
|
||||||
'
|
'
|
||||||
Me.BTT_BROWSE.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.BTT_BROWSE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.BTT_BROWSE.Location = New System.Drawing.Point(512, 2)
|
Me.BTT_BROWSE.Location = New System.Drawing.Point(632, 2)
|
||||||
Me.BTT_BROWSE.Margin = New System.Windows.Forms.Padding(3, 2, 3, 2)
|
Me.BTT_BROWSE.Margin = New System.Windows.Forms.Padding(3, 2, 3, 2)
|
||||||
Me.BTT_BROWSE.Name = "BTT_BROWSE"
|
Me.BTT_BROWSE.Name = "BTT_BROWSE"
|
||||||
Me.BTT_BROWSE.Size = New System.Drawing.Size(74, 22)
|
Me.BTT_BROWSE.Size = New System.Drawing.Size(74, 22)
|
||||||
@@ -321,13 +324,13 @@ Namespace API.YouTube.Controls
|
|||||||
TP_OK_CANCEL.RowCount = 1
|
TP_OK_CANCEL.RowCount = 1
|
||||||
TP_OK_CANCEL.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
TP_OK_CANCEL.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
TP_OK_CANCEL.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26.0!))
|
TP_OK_CANCEL.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26.0!))
|
||||||
TP_OK_CANCEL.Size = New System.Drawing.Size(589, 26)
|
TP_OK_CANCEL.Size = New System.Drawing.Size(709, 26)
|
||||||
TP_OK_CANCEL.TabIndex = 1
|
TP_OK_CANCEL.TabIndex = 1
|
||||||
'
|
'
|
||||||
'BTT_DOWN
|
'BTT_DOWN
|
||||||
'
|
'
|
||||||
Me.BTT_DOWN.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.BTT_DOWN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.BTT_DOWN.Location = New System.Drawing.Point(432, 2)
|
Me.BTT_DOWN.Location = New System.Drawing.Point(552, 2)
|
||||||
Me.BTT_DOWN.Margin = New System.Windows.Forms.Padding(3, 2, 3, 2)
|
Me.BTT_DOWN.Margin = New System.Windows.Forms.Padding(3, 2, 3, 2)
|
||||||
Me.BTT_DOWN.Name = "BTT_DOWN"
|
Me.BTT_DOWN.Name = "BTT_DOWN"
|
||||||
Me.BTT_DOWN.Size = New System.Drawing.Size(74, 22)
|
Me.BTT_DOWN.Size = New System.Drawing.Size(74, 22)
|
||||||
@@ -339,7 +342,7 @@ Namespace API.YouTube.Controls
|
|||||||
'
|
'
|
||||||
Me.BTT_CANCEL.DialogResult = System.Windows.Forms.DialogResult.Cancel
|
Me.BTT_CANCEL.DialogResult = System.Windows.Forms.DialogResult.Cancel
|
||||||
Me.BTT_CANCEL.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.BTT_CANCEL.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.BTT_CANCEL.Location = New System.Drawing.Point(512, 2)
|
Me.BTT_CANCEL.Location = New System.Drawing.Point(632, 2)
|
||||||
Me.BTT_CANCEL.Margin = New System.Windows.Forms.Padding(3, 2, 3, 2)
|
Me.BTT_CANCEL.Margin = New System.Windows.Forms.Padding(3, 2, 3, 2)
|
||||||
Me.BTT_CANCEL.Name = "BTT_CANCEL"
|
Me.BTT_CANCEL.Name = "BTT_CANCEL"
|
||||||
Me.BTT_CANCEL.Size = New System.Drawing.Size(74, 22)
|
Me.BTT_CANCEL.Size = New System.Drawing.Size(74, 22)
|
||||||
@@ -354,7 +357,7 @@ Namespace API.YouTube.Controls
|
|||||||
LB_SEP_1.Location = New System.Drawing.Point(6, 179)
|
LB_SEP_1.Location = New System.Drawing.Point(6, 179)
|
||||||
LB_SEP_1.Margin = New System.Windows.Forms.Padding(6, 0, 6, 0)
|
LB_SEP_1.Margin = New System.Windows.Forms.Padding(6, 0, 6, 0)
|
||||||
LB_SEP_1.Name = "LB_SEP_1"
|
LB_SEP_1.Name = "LB_SEP_1"
|
||||||
LB_SEP_1.Size = New System.Drawing.Size(589, 1)
|
LB_SEP_1.Size = New System.Drawing.Size(709, 1)
|
||||||
LB_SEP_1.TabIndex = 3
|
LB_SEP_1.TabIndex = 3
|
||||||
'
|
'
|
||||||
'LB_SEP_2
|
'LB_SEP_2
|
||||||
@@ -364,7 +367,7 @@ Namespace API.YouTube.Controls
|
|||||||
LB_SEP_2.Location = New System.Drawing.Point(6, 209)
|
LB_SEP_2.Location = New System.Drawing.Point(6, 209)
|
||||||
LB_SEP_2.Margin = New System.Windows.Forms.Padding(6, 0, 6, 0)
|
LB_SEP_2.Margin = New System.Windows.Forms.Padding(6, 0, 6, 0)
|
||||||
LB_SEP_2.Name = "LB_SEP_2"
|
LB_SEP_2.Name = "LB_SEP_2"
|
||||||
LB_SEP_2.Size = New System.Drawing.Size(589, 1)
|
LB_SEP_2.Size = New System.Drawing.Size(709, 1)
|
||||||
LB_SEP_2.TabIndex = 5
|
LB_SEP_2.TabIndex = 5
|
||||||
'
|
'
|
||||||
'TP_WHAT
|
'TP_WHAT
|
||||||
@@ -436,7 +439,7 @@ Namespace API.YouTube.Controls
|
|||||||
'
|
'
|
||||||
LBL_SUBS_FORMAT.AutoSize = True
|
LBL_SUBS_FORMAT.AutoSize = True
|
||||||
LBL_SUBS_FORMAT.Dock = System.Windows.Forms.DockStyle.Fill
|
LBL_SUBS_FORMAT.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
LBL_SUBS_FORMAT.Location = New System.Drawing.Point(432, 0)
|
LBL_SUBS_FORMAT.Location = New System.Drawing.Point(552, 0)
|
||||||
LBL_SUBS_FORMAT.Name = "LBL_SUBS_FORMAT"
|
LBL_SUBS_FORMAT.Name = "LBL_SUBS_FORMAT"
|
||||||
LBL_SUBS_FORMAT.Size = New System.Drawing.Size(74, 28)
|
LBL_SUBS_FORMAT.Size = New System.Drawing.Size(74, 28)
|
||||||
LBL_SUBS_FORMAT.TabIndex = 2
|
LBL_SUBS_FORMAT.TabIndex = 2
|
||||||
@@ -448,7 +451,7 @@ Namespace API.YouTube.Controls
|
|||||||
'
|
'
|
||||||
Me.LBL_AUDIO_CODEC.AutoSize = True
|
Me.LBL_AUDIO_CODEC.AutoSize = True
|
||||||
Me.LBL_AUDIO_CODEC.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.LBL_AUDIO_CODEC.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.LBL_AUDIO_CODEC.Location = New System.Drawing.Point(432, 0)
|
Me.LBL_AUDIO_CODEC.Location = New System.Drawing.Point(552, 0)
|
||||||
Me.LBL_AUDIO_CODEC.Name = "LBL_AUDIO_CODEC"
|
Me.LBL_AUDIO_CODEC.Name = "LBL_AUDIO_CODEC"
|
||||||
Me.LBL_AUDIO_CODEC.Size = New System.Drawing.Size(74, 28)
|
Me.LBL_AUDIO_CODEC.Size = New System.Drawing.Size(74, 28)
|
||||||
Me.LBL_AUDIO_CODEC.TabIndex = 5
|
Me.LBL_AUDIO_CODEC.TabIndex = 5
|
||||||
@@ -470,7 +473,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TP_HEADER_BASE.RowCount = 1
|
Me.TP_HEADER_BASE.RowCount = 1
|
||||||
Me.TP_HEADER_BASE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
Me.TP_HEADER_BASE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
Me.TP_HEADER_BASE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 64.0!))
|
Me.TP_HEADER_BASE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 64.0!))
|
||||||
Me.TP_HEADER_BASE.Size = New System.Drawing.Size(601, 65)
|
Me.TP_HEADER_BASE.Size = New System.Drawing.Size(721, 65)
|
||||||
Me.TP_HEADER_BASE.TabIndex = 6
|
Me.TP_HEADER_BASE.TabIndex = 6
|
||||||
'
|
'
|
||||||
'TP_SUBS
|
'TP_SUBS
|
||||||
@@ -488,7 +491,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TP_SUBS.Name = "TP_SUBS"
|
Me.TP_SUBS.Name = "TP_SUBS"
|
||||||
Me.TP_SUBS.RowCount = 1
|
Me.TP_SUBS.RowCount = 1
|
||||||
Me.TP_SUBS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
Me.TP_SUBS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
Me.TP_SUBS.Size = New System.Drawing.Size(589, 28)
|
Me.TP_SUBS.Size = New System.Drawing.Size(709, 28)
|
||||||
Me.TP_SUBS.TabIndex = 2
|
Me.TP_SUBS.TabIndex = 2
|
||||||
'
|
'
|
||||||
'TXT_SUBS
|
'TXT_SUBS
|
||||||
@@ -516,7 +519,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TXT_SUBS.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TXT_SUBS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TXT_SUBS.Location = New System.Drawing.Point(3, 3)
|
Me.TXT_SUBS.Location = New System.Drawing.Point(3, 3)
|
||||||
Me.TXT_SUBS.Name = "TXT_SUBS"
|
Me.TXT_SUBS.Name = "TXT_SUBS"
|
||||||
Me.TXT_SUBS.Size = New System.Drawing.Size(423, 22)
|
Me.TXT_SUBS.Size = New System.Drawing.Size(543, 22)
|
||||||
Me.TXT_SUBS.TabIndex = 0
|
Me.TXT_SUBS.TabIndex = 0
|
||||||
Me.TXT_SUBS.TextBoxReadOnly = True
|
Me.TXT_SUBS.TextBoxReadOnly = True
|
||||||
'
|
'
|
||||||
@@ -525,7 +528,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.CMB_SUBS_FORMAT.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.CMB_SUBS_FORMAT.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.CMB_SUBS_FORMAT.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
|
Me.CMB_SUBS_FORMAT.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
|
||||||
Me.CMB_SUBS_FORMAT.FormattingEnabled = True
|
Me.CMB_SUBS_FORMAT.FormattingEnabled = True
|
||||||
Me.CMB_SUBS_FORMAT.Location = New System.Drawing.Point(512, 3)
|
Me.CMB_SUBS_FORMAT.Location = New System.Drawing.Point(632, 3)
|
||||||
Me.CMB_SUBS_FORMAT.Name = "CMB_SUBS_FORMAT"
|
Me.CMB_SUBS_FORMAT.Name = "CMB_SUBS_FORMAT"
|
||||||
Me.CMB_SUBS_FORMAT.Size = New System.Drawing.Size(74, 21)
|
Me.CMB_SUBS_FORMAT.Size = New System.Drawing.Size(74, 21)
|
||||||
Me.CMB_SUBS_FORMAT.TabIndex = 1
|
Me.CMB_SUBS_FORMAT.TabIndex = 1
|
||||||
@@ -557,31 +560,33 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 5.0!))
|
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 5.0!))
|
||||||
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 58.0!))
|
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 58.0!))
|
||||||
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle())
|
Me.TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle())
|
||||||
Me.TP_MAIN.Size = New System.Drawing.Size(601, 271)
|
Me.TP_MAIN.Size = New System.Drawing.Size(721, 271)
|
||||||
Me.TP_MAIN.TabIndex = 0
|
Me.TP_MAIN.TabIndex = 0
|
||||||
'
|
'
|
||||||
'TP_OPTIONS
|
'TP_OPTIONS
|
||||||
'
|
'
|
||||||
Me.TP_OPTIONS.ColumnCount = 6
|
Me.TP_OPTIONS.ColumnCount = 7
|
||||||
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
||||||
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
||||||
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
||||||
|
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 120.0!))
|
||||||
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
||||||
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
Me.TP_OPTIONS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
|
||||||
Me.TP_OPTIONS.Controls.Add(LBL_FORMAT, 1, 0)
|
Me.TP_OPTIONS.Controls.Add(LBL_FORMAT, 1, 0)
|
||||||
Me.TP_OPTIONS.Controls.Add(TP_WHAT, 0, 0)
|
Me.TP_OPTIONS.Controls.Add(TP_WHAT, 0, 0)
|
||||||
Me.TP_OPTIONS.Controls.Add(Me.CMB_FORMAT, 2, 0)
|
Me.TP_OPTIONS.Controls.Add(Me.CMB_FORMAT, 2, 0)
|
||||||
Me.TP_OPTIONS.Controls.Add(Me.LBL_AUDIO_CODEC, 4, 0)
|
Me.TP_OPTIONS.Controls.Add(Me.LBL_AUDIO_CODEC, 5, 0)
|
||||||
Me.TP_OPTIONS.Controls.Add(Me.CMB_AUDIO_CODEC, 5, 0)
|
Me.TP_OPTIONS.Controls.Add(Me.CMB_AUDIO_CODEC, 6, 0)
|
||||||
Me.TP_OPTIONS.Controls.Add(Me.NUM_RES, 3, 0)
|
Me.TP_OPTIONS.Controls.Add(Me.NUM_RES, 3, 0)
|
||||||
|
Me.TP_OPTIONS.Controls.Add(Me.TXT_FPS, 4, 0)
|
||||||
Me.TP_OPTIONS.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.TP_OPTIONS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.TP_OPTIONS.Location = New System.Drawing.Point(6, 65)
|
Me.TP_OPTIONS.Location = New System.Drawing.Point(6, 65)
|
||||||
Me.TP_OPTIONS.Margin = New System.Windows.Forms.Padding(6, 0, 6, 0)
|
Me.TP_OPTIONS.Margin = New System.Windows.Forms.Padding(6, 0, 6, 0)
|
||||||
Me.TP_OPTIONS.Name = "TP_OPTIONS"
|
Me.TP_OPTIONS.Name = "TP_OPTIONS"
|
||||||
Me.TP_OPTIONS.RowCount = 1
|
Me.TP_OPTIONS.RowCount = 1
|
||||||
Me.TP_OPTIONS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
Me.TP_OPTIONS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
Me.TP_OPTIONS.Size = New System.Drawing.Size(589, 28)
|
Me.TP_OPTIONS.Size = New System.Drawing.Size(709, 28)
|
||||||
Me.TP_OPTIONS.TabIndex = 1
|
Me.TP_OPTIONS.TabIndex = 1
|
||||||
'
|
'
|
||||||
'CMB_FORMAT
|
'CMB_FORMAT
|
||||||
@@ -599,7 +604,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.CMB_AUDIO_CODEC.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.CMB_AUDIO_CODEC.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.CMB_AUDIO_CODEC.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
|
Me.CMB_AUDIO_CODEC.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
|
||||||
Me.CMB_AUDIO_CODEC.FormattingEnabled = True
|
Me.CMB_AUDIO_CODEC.FormattingEnabled = True
|
||||||
Me.CMB_AUDIO_CODEC.Location = New System.Drawing.Point(512, 3)
|
Me.CMB_AUDIO_CODEC.Location = New System.Drawing.Point(632, 3)
|
||||||
Me.CMB_AUDIO_CODEC.Name = "CMB_AUDIO_CODEC"
|
Me.CMB_AUDIO_CODEC.Name = "CMB_AUDIO_CODEC"
|
||||||
Me.CMB_AUDIO_CODEC.Size = New System.Drawing.Size(74, 21)
|
Me.CMB_AUDIO_CODEC.Size = New System.Drawing.Size(74, 21)
|
||||||
Me.CMB_AUDIO_CODEC.TabIndex = 3
|
Me.CMB_AUDIO_CODEC.TabIndex = 3
|
||||||
@@ -616,6 +621,24 @@ Namespace API.YouTube.Controls
|
|||||||
Me.NUM_RES.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
|
Me.NUM_RES.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
|
||||||
Me.NUM_RES.Value = New Decimal(New Integer() {1080, 0, 0, 0})
|
Me.NUM_RES.Value = New Decimal(New Integer() {1080, 0, 0, 0})
|
||||||
'
|
'
|
||||||
|
'TXT_FPS
|
||||||
|
'
|
||||||
|
ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton5.Name = "Clear"
|
||||||
|
ActionButton5.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
Me.TXT_FPS.Buttons.Add(ActionButton5)
|
||||||
|
Me.TXT_FPS.CaptionText = "FPS"
|
||||||
|
Me.TXT_FPS.CaptionToolTipEnabled = True
|
||||||
|
Me.TXT_FPS.CaptionToolTipText = "You can reduce the video FPS by setting the FPS value in this field."
|
||||||
|
Me.TXT_FPS.CaptionWidth = 30.0R
|
||||||
|
Me.TXT_FPS.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_FPS.Location = New System.Drawing.Point(432, 2)
|
||||||
|
Me.TXT_FPS.Margin = New System.Windows.Forms.Padding(3, 2, 3, 3)
|
||||||
|
Me.TXT_FPS.Name = "TXT_FPS"
|
||||||
|
Me.TXT_FPS.Size = New System.Drawing.Size(114, 22)
|
||||||
|
Me.TXT_FPS.TabIndex = 6
|
||||||
|
Me.TXT_FPS.TextBoxWidthMinimal = 30
|
||||||
|
'
|
||||||
'TP_CONTROLS
|
'TP_CONTROLS
|
||||||
'
|
'
|
||||||
Me.TP_CONTROLS.ColumnCount = 1
|
Me.TP_CONTROLS.ColumnCount = 1
|
||||||
@@ -626,29 +649,29 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TP_CONTROLS.Name = "TP_CONTROLS"
|
Me.TP_CONTROLS.Name = "TP_CONTROLS"
|
||||||
Me.TP_CONTROLS.RowCount = 1
|
Me.TP_CONTROLS.RowCount = 1
|
||||||
Me.TP_CONTROLS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
Me.TP_CONTROLS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
Me.TP_CONTROLS.Size = New System.Drawing.Size(595, 25)
|
Me.TP_CONTROLS.Size = New System.Drawing.Size(715, 25)
|
||||||
Me.TP_CONTROLS.TabIndex = 0
|
Me.TP_CONTROLS.TabIndex = 0
|
||||||
'
|
'
|
||||||
'TXT_SUBS_ADDIT
|
'TXT_SUBS_ADDIT
|
||||||
'
|
'
|
||||||
ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image)
|
|
||||||
ActionButton5.Enabled = False
|
|
||||||
ActionButton5.Name = "Open"
|
|
||||||
ActionButton5.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
|
||||||
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 = "Refresh"
|
ActionButton6.Name = "Open"
|
||||||
ActionButton6.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
ActionButton6.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
||||||
ActionButton6.ToolTipText = "Fill in additional formats from the defaults"
|
ActionButton6.ToolTipText = "Choose additional formats"
|
||||||
ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image)
|
ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton7.Enabled = False
|
ActionButton7.Enabled = False
|
||||||
ActionButton7.Name = "Clear"
|
ActionButton7.Name = "Refresh"
|
||||||
ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
||||||
ActionButton7.ToolTipText = "Remove all additional formats"
|
ActionButton7.ToolTipText = "Fill in additional formats from the defaults"
|
||||||
Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton5)
|
ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton8.Enabled = False
|
||||||
|
ActionButton8.Name = "Clear"
|
||||||
|
ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton8.ToolTipText = "Remove all additional formats"
|
||||||
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.Buttons.Add(ActionButton7)
|
||||||
|
Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton8)
|
||||||
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
|
||||||
@@ -659,31 +682,31 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TXT_SUBS_ADDIT.Location = New System.Drawing.Point(6, 124)
|
Me.TXT_SUBS_ADDIT.Location = New System.Drawing.Point(6, 124)
|
||||||
Me.TXT_SUBS_ADDIT.Margin = New System.Windows.Forms.Padding(6, 3, 6, 3)
|
Me.TXT_SUBS_ADDIT.Margin = New System.Windows.Forms.Padding(6, 3, 6, 3)
|
||||||
Me.TXT_SUBS_ADDIT.Name = "TXT_SUBS_ADDIT"
|
Me.TXT_SUBS_ADDIT.Name = "TXT_SUBS_ADDIT"
|
||||||
Me.TXT_SUBS_ADDIT.Size = New System.Drawing.Size(589, 22)
|
Me.TXT_SUBS_ADDIT.Size = New System.Drawing.Size(709, 22)
|
||||||
Me.TXT_SUBS_ADDIT.TabIndex = 3
|
Me.TXT_SUBS_ADDIT.TabIndex = 3
|
||||||
Me.TXT_SUBS_ADDIT.Tag = "s"
|
Me.TXT_SUBS_ADDIT.Tag = "s"
|
||||||
Me.TXT_SUBS_ADDIT.TextBoxReadOnly = True
|
Me.TXT_SUBS_ADDIT.TextBoxReadOnly = True
|
||||||
'
|
'
|
||||||
'TXT_EXTRA_AUDIO_FORMATS
|
'TXT_EXTRA_AUDIO_FORMATS
|
||||||
'
|
'
|
||||||
ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image)
|
|
||||||
ActionButton8.Enabled = False
|
|
||||||
ActionButton8.Name = "Open"
|
|
||||||
ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
|
||||||
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 = "Refresh"
|
ActionButton9.Name = "Open"
|
||||||
ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
|
||||||
ActionButton9.ToolTipText = "Fill in additional formats from the defaults"
|
ActionButton9.ToolTipText = "Choose additional formats"
|
||||||
ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image)
|
ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image)
|
||||||
ActionButton10.Enabled = False
|
ActionButton10.Enabled = False
|
||||||
ActionButton10.Name = "Clear"
|
ActionButton10.Name = "Refresh"
|
||||||
ActionButton10.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
ActionButton10.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
|
||||||
ActionButton10.ToolTipText = "Choose additional formats"
|
ActionButton10.ToolTipText = "Fill in additional formats from the defaults"
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton8)
|
ActionButton11.BackgroundImage = CType(resources.GetObject("ActionButton11.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton11.Enabled = False
|
||||||
|
ActionButton11.Name = "Clear"
|
||||||
|
ActionButton11.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton11.ToolTipText = "Choose additional formats"
|
||||||
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.Buttons.Add(ActionButton10)
|
||||||
|
Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton11)
|
||||||
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
|
||||||
@@ -693,7 +716,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TXT_EXTRA_AUDIO_FORMATS.Location = New System.Drawing.Point(6, 152)
|
Me.TXT_EXTRA_AUDIO_FORMATS.Location = New System.Drawing.Point(6, 152)
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.Margin = New System.Windows.Forms.Padding(6, 3, 6, 3)
|
Me.TXT_EXTRA_AUDIO_FORMATS.Margin = New System.Windows.Forms.Padding(6, 3, 6, 3)
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.Name = "TXT_EXTRA_AUDIO_FORMATS"
|
Me.TXT_EXTRA_AUDIO_FORMATS.Name = "TXT_EXTRA_AUDIO_FORMATS"
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.Size = New System.Drawing.Size(589, 22)
|
Me.TXT_EXTRA_AUDIO_FORMATS.Size = New System.Drawing.Size(709, 22)
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.TabIndex = 4
|
Me.TXT_EXTRA_AUDIO_FORMATS.TabIndex = 4
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.Tag = "a"
|
Me.TXT_EXTRA_AUDIO_FORMATS.Tag = "a"
|
||||||
Me.TXT_EXTRA_AUDIO_FORMATS.TextBoxReadOnly = True
|
Me.TXT_EXTRA_AUDIO_FORMATS.TextBoxReadOnly = True
|
||||||
@@ -704,13 +727,14 @@ Namespace API.YouTube.Controls
|
|||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
Me.CancelButton = Me.BTT_CANCEL
|
Me.CancelButton = Me.BTT_CANCEL
|
||||||
Me.ClientSize = New System.Drawing.Size(601, 271)
|
Me.ClientSize = New System.Drawing.Size(721, 271)
|
||||||
Me.Controls.Add(Me.TP_MAIN)
|
Me.Controls.Add(Me.TP_MAIN)
|
||||||
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
||||||
Me.Icon = Global.SCrawler.My.Resources.SiteYouTube.YouTubeIcon_32
|
Me.Icon = Global.SCrawler.My.Resources.SiteYouTube.YouTubeIcon_32
|
||||||
Me.KeyPreview = True
|
Me.KeyPreview = True
|
||||||
Me.MaximizeBox = False
|
Me.MaximizeBox = False
|
||||||
Me.MinimizeBox = False
|
Me.MinimizeBox = False
|
||||||
|
Me.MinimumSize = New System.Drawing.Size(737, 310)
|
||||||
Me.Name = "VideoOptionsForm"
|
Me.Name = "VideoOptionsForm"
|
||||||
Me.ShowInTaskbar = False
|
Me.ShowInTaskbar = False
|
||||||
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
||||||
@@ -736,6 +760,7 @@ Namespace API.YouTube.Controls
|
|||||||
Me.TP_OPTIONS.ResumeLayout(False)
|
Me.TP_OPTIONS.ResumeLayout(False)
|
||||||
Me.TP_OPTIONS.PerformLayout()
|
Me.TP_OPTIONS.PerformLayout()
|
||||||
CType(Me.NUM_RES, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.NUM_RES, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
CType(Me.TXT_FPS, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
CType(Me.TXT_SUBS_ADDIT, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.TXT_SUBS_ADDIT, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
CType(Me.TXT_EXTRA_AUDIO_FORMATS, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.TXT_EXTRA_AUDIO_FORMATS, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
Me.ResumeLayout(False)
|
Me.ResumeLayout(False)
|
||||||
@@ -765,5 +790,6 @@ Namespace API.YouTube.Controls
|
|||||||
Private WithEvents BTT_DOWN As Button
|
Private WithEvents BTT_DOWN As Button
|
||||||
Private WithEvents BTT_CANCEL As Button
|
Private WithEvents BTT_CANCEL As Button
|
||||||
Private WithEvents TP_HEADER_INFO_2 As TableLayoutPanel
|
Private WithEvents TP_HEADER_INFO_2 As TableLayoutPanel
|
||||||
|
Private WithEvents TXT_FPS As PersonalUtilities.Forms.Controls.TextBoxExtended
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -289,6 +289,14 @@
|
|||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton5.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<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>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
@@ -299,7 +307,7 @@
|
|||||||
cMaRN0UdBBkAAAAASUVORK5CYII=
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
</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/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
||||||
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
||||||
@@ -315,7 +323,7 @@
|
|||||||
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
||||||
</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
|
||||||
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
|
||||||
@@ -323,7 +331,7 @@
|
|||||||
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
|
||||||
</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/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
@@ -334,7 +342,7 @@
|
|||||||
cMaRN0UdBBkAAAAASUVORK5CYII=
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
</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/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
|
||||||
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE
|
||||||
@@ -350,7 +358,7 @@
|
|||||||
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg==
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActionButton10.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="ActionButton11.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
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ Namespace API.YouTube.Controls
|
|||||||
Friend Class VideoOptionsForm : Implements IDesignXMLContainer
|
Friend Class VideoOptionsForm : Implements IDesignXMLContainer
|
||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
Private MyView As FormView
|
Private MyView As FormView
|
||||||
|
Private ReadOnly MyFieldsChecker As FieldsChecker
|
||||||
Friend Property DesignXML As EContainer Implements IDesignXMLContainer.DesignXML
|
Friend Property DesignXML As EContainer Implements IDesignXMLContainer.DesignXML
|
||||||
Private Property DesignXMLNodes As String() Implements IDesignXMLContainer.DesignXMLNodes
|
Private Property DesignXMLNodes As String() Implements IDesignXMLContainer.DesignXMLNodes
|
||||||
Private Property DesignXMLNodeName As String Implements IDesignXMLContainer.DesignXMLNodeName
|
Private Property DesignXMLNodeName As String Implements IDesignXMLContainer.DesignXMLNodeName
|
||||||
@@ -29,14 +30,34 @@ Namespace API.YouTube.Controls
|
|||||||
Private ReadOnly Property CNT_PROCESSOR As TableControlsProcessor
|
Private ReadOnly Property CNT_PROCESSOR As TableControlsProcessor
|
||||||
Friend Property MyContainer As YouTubeMediaContainerBase
|
Friend Property MyContainer As YouTubeMediaContainerBase
|
||||||
Private Initialization As Boolean = True
|
Private Initialization As Boolean = True
|
||||||
Private ReadOnly IsSavedObject As Boolean
|
Private ReadOnly InheritsFromContainer As Boolean
|
||||||
|
Private Class FpsFieldChecker : Inherits FieldsCheckerProviderBase
|
||||||
|
Private ReadOnly MyProvider As ANumbers = YouTubeSettings.FpsFormatProvider.MyProviderDefault
|
||||||
|
Public Overrides Property ErrorMessage As String
|
||||||
|
Get
|
||||||
|
Return IIf(HasError, YouTubeSettings.FpsFormatProvider.ErrorMessageDefault, String.Empty)
|
||||||
|
End Get
|
||||||
|
Set : End Set
|
||||||
|
End Property
|
||||||
|
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
|
||||||
|
If ACheck(Of Double)(Value, AModes.Var, MyProvider) Then
|
||||||
|
Return Value
|
||||||
|
Else
|
||||||
|
HasError = True
|
||||||
|
TypeError = True
|
||||||
|
Return Nothing
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Initializers"
|
#Region "Initializers"
|
||||||
Friend Sub New(ByVal Container As YouTubeMediaContainerBase, Optional ByVal IsSavedObject As Boolean = False)
|
Friend Sub New(ByVal Container As YouTubeMediaContainerBase, Optional ByVal InheritsFromContainer As Boolean = False)
|
||||||
InitializeComponent()
|
InitializeComponent()
|
||||||
MyContainer = Container
|
MyContainer = Container
|
||||||
CNT_PROCESSOR = New TableControlsProcessor(TP_CONTROLS)
|
CNT_PROCESSOR = New TableControlsProcessor(TP_CONTROLS)
|
||||||
Me.IsSavedObject = IsSavedObject
|
Me.InheritsFromContainer = InheritsFromContainer
|
||||||
|
MyFieldsChecker = New FieldsChecker
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Form handlers"
|
#Region "Form handlers"
|
||||||
@@ -68,8 +89,8 @@ Namespace API.YouTube.Controls
|
|||||||
If Not .PlaylistTitle.IsEmptyString Or Not .Title.IsEmptyString Then Text &= $" - { .PlaylistTitle.IfNullOrEmpty(.Title)}"
|
If Not .PlaylistTitle.IsEmptyString Or Not .Title.IsEmptyString Then Text &= $" - { .PlaylistTitle.IfNullOrEmpty(.Title)}"
|
||||||
TP_MAIN.Controls.Remove(TP_HEADER_BASE)
|
TP_MAIN.Controls.Remove(TP_HEADER_BASE)
|
||||||
TP_MAIN.RowStyles(0).Height = 0
|
TP_MAIN.RowStyles(0).Height = 0
|
||||||
Dim def% = If(IsSavedObject, .ArrayMaxResolution, MyYouTubeSettings.DefaultVideoDefinition.Value)
|
Dim def% = If(InheritsFromContainer, .ArrayMaxResolution, MyYouTubeSettings.DefaultVideoDefinition.Value)
|
||||||
If IsSavedObject Then
|
If InheritsFromContainer Then
|
||||||
__audioOnly = def = -2
|
__audioOnly = def = -2
|
||||||
If def <= 0 Then def = MyYouTubeSettings.DefaultVideoDefinition
|
If def <= 0 Then def = MyYouTubeSettings.DefaultVideoDefinition
|
||||||
Else
|
Else
|
||||||
@@ -98,7 +119,7 @@ Namespace API.YouTube.Controls
|
|||||||
LBL_URL.Text = .URL
|
LBL_URL.Text = .URL
|
||||||
End If
|
End If
|
||||||
|
|
||||||
If .IsMusic Or __audioOnly Then
|
If .IsMusic Or __audioOnly Or (InheritsFromContainer And .IsAudioSelected) Then
|
||||||
OPT_AUDIO.Checked = True
|
OPT_AUDIO.Checked = True
|
||||||
Else
|
Else
|
||||||
OPT_VIDEO.Checked = True
|
OPT_VIDEO.Checked = True
|
||||||
@@ -107,7 +128,7 @@ Namespace API.YouTube.Controls
|
|||||||
|
|
||||||
arr = AvailableVideoFormats
|
arr = AvailableVideoFormats
|
||||||
CMB_FORMAT.Items.AddRange(arr)
|
CMB_FORMAT.Items.AddRange(arr)
|
||||||
If IsSavedObject Then
|
If InheritsFromContainer Then
|
||||||
__optionValue = .OutputVideoExtension.IfNullOrEmpty(MyYouTubeSettings.DefaultVideoFormat.Value)
|
__optionValue = .OutputVideoExtension.IfNullOrEmpty(MyYouTubeSettings.DefaultVideoFormat.Value)
|
||||||
Else
|
Else
|
||||||
__optionValue = MyYouTubeSettings.DefaultVideoFormat.Value
|
__optionValue = MyYouTubeSettings.DefaultVideoFormat.Value
|
||||||
@@ -116,7 +137,7 @@ Namespace API.YouTube.Controls
|
|||||||
|
|
||||||
arr = AvailableAudioFormats
|
arr = AvailableAudioFormats
|
||||||
CMB_AUDIO_CODEC.Items.AddRange(arr)
|
CMB_AUDIO_CODEC.Items.AddRange(arr)
|
||||||
If IsSavedObject Then
|
If InheritsFromContainer Then
|
||||||
__optionValue = .OutputAudioCodec.IfNullOrEmpty(IIf(.IsMusic, MyYouTubeSettings.DefaultAudioCodecMusic.Value, MyYouTubeSettings.DefaultAudioCodec.Value))
|
__optionValue = .OutputAudioCodec.IfNullOrEmpty(IIf(.IsMusic, MyYouTubeSettings.DefaultAudioCodecMusic.Value, MyYouTubeSettings.DefaultAudioCodec.Value))
|
||||||
Else
|
Else
|
||||||
__optionValue = IIf(.IsMusic, MyYouTubeSettings.DefaultAudioCodecMusic.Value, MyYouTubeSettings.DefaultAudioCodec.Value)
|
__optionValue = IIf(.IsMusic, MyYouTubeSettings.DefaultAudioCodecMusic.Value, MyYouTubeSettings.DefaultAudioCodec.Value)
|
||||||
@@ -125,13 +146,20 @@ Namespace API.YouTube.Controls
|
|||||||
|
|
||||||
arr = AvailableSubtitlesFormats
|
arr = AvailableSubtitlesFormats
|
||||||
CMB_SUBS_FORMAT.Items.AddRange(arr)
|
CMB_SUBS_FORMAT.Items.AddRange(arr)
|
||||||
If IsSavedObject Then
|
If InheritsFromContainer Then
|
||||||
__optionValue = .OutputSubtitlesFormat.IfNullOrEmpty(IIf(.IsMusic, "LRC", MyYouTubeSettings.DefaultSubtitlesFormat.Value))
|
__optionValue = .OutputSubtitlesFormat.IfNullOrEmpty(IIf(.IsMusic, "LRC", MyYouTubeSettings.DefaultSubtitlesFormat.Value))
|
||||||
Else
|
Else
|
||||||
__optionValue = IIf(.IsMusic, "LRC", MyYouTubeSettings.DefaultSubtitlesFormat.Value)
|
__optionValue = IIf(.IsMusic, "LRC", MyYouTubeSettings.DefaultSubtitlesFormat.Value)
|
||||||
End If
|
End If
|
||||||
setDef(CMB_SUBS_FORMAT, __optionValue)
|
setDef(CMB_SUBS_FORMAT, __optionValue)
|
||||||
|
|
||||||
|
If InheritsFromContainer Then
|
||||||
|
If .OutputVideoFPS > 0 Then TXT_FPS.Text = .OutputVideoFPS
|
||||||
|
Else
|
||||||
|
If MyYouTubeSettings.DefaultVideoFPS > 0 Then TXT_FPS.Text = MyYouTubeSettings.DefaultVideoFPS
|
||||||
|
End If
|
||||||
|
MyFieldsChecker.AddControl(Of Double)(TXT_FPS, TXT_FPS.CaptionText, True, New FpsFieldChecker)
|
||||||
|
MyFieldsChecker.EndLoaderOperations()
|
||||||
TP_SUBS.Enabled = .Subtitles.Count > 0
|
TP_SUBS.Enabled = .Subtitles.Count > 0
|
||||||
TXT_SUBS_ADDIT.Enabled = .Subtitles.Count > 0
|
TXT_SUBS_ADDIT.Enabled = .Subtitles.Count > 0
|
||||||
RefillTextBoxes()
|
RefillTextBoxes()
|
||||||
@@ -151,6 +179,7 @@ Namespace API.YouTube.Controls
|
|||||||
End Sub
|
End Sub
|
||||||
Private Sub VideoOptionsForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
|
Private Sub VideoOptionsForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
|
||||||
MyView.DisposeIfReady()
|
MyView.DisposeIfReady()
|
||||||
|
MyFieldsChecker.DisposeIfReady()
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Refill"
|
#Region "Refill"
|
||||||
@@ -183,7 +212,7 @@ Namespace API.YouTube.Controls
|
|||||||
Dim data As IEnumerable(Of Control)
|
Dim data As IEnumerable(Of Control)
|
||||||
|
|
||||||
If .HasElements Then
|
If .HasElements Then
|
||||||
data = .Elements.Select(Function(ee) New MediaItem(ee) With {.Dock = DockStyle.Fill, .Checked = ee.Checked, .IgnoreDownloadState = True})
|
data = .Elements.Select(Function(ee) New MediaItem(ee, True) With {.Dock = DockStyle.Fill, .Checked = ee.Checked})
|
||||||
Else
|
Else
|
||||||
data = (From m As MediaObject In .Self.MediaObjects
|
data = (From m As MediaObject In .Self.MediaObjects
|
||||||
Where m.Type = __contentType
|
Where m.Type = __contentType
|
||||||
@@ -204,6 +233,8 @@ Namespace API.YouTube.Controls
|
|||||||
If MyContainer.HasElements Then
|
If MyContainer.HasElements Then
|
||||||
With DirectCast(d, MediaItem)
|
With DirectCast(d, MediaItem)
|
||||||
AddHandler .CheckedChanged, AddressOf MediaItem_CheckedChanged
|
AddHandler .CheckedChanged, AddressOf MediaItem_CheckedChanged
|
||||||
|
AddHandler .BeforeOpenEditor, AddressOf MediaItem_BeforeOpenEditor
|
||||||
|
AddHandler .BeforeOpenEditorFull, AddressOf MediaItem_BeforeOpenEditorFull
|
||||||
AddHandler .Click, AddressOf CNT_PROCESSOR.MediaItem_Click
|
AddHandler .Click, AddressOf CNT_PROCESSOR.MediaItem_Click
|
||||||
AddHandler .KeyDown, AddressOf CNT_PROCESSOR.MediaItem_KeyDown
|
AddHandler .KeyDown, AddressOf CNT_PROCESSOR.MediaItem_KeyDown
|
||||||
End With
|
End With
|
||||||
@@ -271,10 +302,33 @@ Namespace API.YouTube.Controls
|
|||||||
Private Sub MediaItem_CheckedChanged(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
Private Sub MediaItem_CheckedChanged(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
||||||
ControlInvokeFast(TP_CONTROLS, Sub() Container.Checked = Sender.Checked, EDP.None)
|
ControlInvokeFast(TP_CONTROLS, Sub() Container.Checked = Sender.Checked, EDP.None)
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub MediaItem_BeforeOpenEditor(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
||||||
|
MediaItem_BeforeOpenEditorImpl(Sender, Container, False)
|
||||||
|
End Sub
|
||||||
|
Private Sub MediaItem_BeforeOpenEditorFull(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer)
|
||||||
|
MediaItem_BeforeOpenEditorImpl(Sender, Container, True)
|
||||||
|
End Sub
|
||||||
|
Private Sub MediaItem_BeforeOpenEditorImpl(ByVal Sender As MediaItem, ByVal Container As IYouTubeMediaContainer, ByVal Full As Boolean)
|
||||||
|
If MyContainer.HasElements Then
|
||||||
|
ControlInvokeFast(TP_CONTROLS, Sub()
|
||||||
|
With DirectCast(Container, YouTubeMediaContainerBase)
|
||||||
|
.File = $"{TXT_FILE.Text.CSFilePS}{ .File.File}"
|
||||||
|
If Full Then
|
||||||
|
.OutputVideoExtension = CMB_FORMAT.Text.StringToLower
|
||||||
|
.OutputVideoFPS = AConvert(Of Double)(TXT_FPS.Text, YouTubeSettings.FpsFormatProvider.MyProviderDefault, -1)
|
||||||
|
.OutputAudioCodec = CMB_AUDIO_CODEC.Text.StringToLower
|
||||||
|
.OutputSubtitlesFormat = CMB_SUBS_FORMAT.Text.StringToLower
|
||||||
|
.IsAudioSelected = OPT_AUDIO.Checked
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End Sub, EDP.None)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "OK, Cancel"
|
#Region "OK, Cancel"
|
||||||
Private Sub BTT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_DOWN.Click
|
Private Sub BTT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_DOWN.Click
|
||||||
Try
|
Try
|
||||||
|
If Not MyFieldsChecker.AllParamsOK Then Exit Sub
|
||||||
Dim f As SFile
|
Dim f As SFile
|
||||||
If MyContainer.HasElements Then
|
If MyContainer.HasElements Then
|
||||||
f = TXT_FILE.Text.CSFileP
|
f = TXT_FILE.Text.CSFileP
|
||||||
@@ -284,6 +338,7 @@ Namespace API.YouTube.Controls
|
|||||||
If f.IsEmptyString Then Throw New ArgumentNullException("File", "The output file cannot be null")
|
If f.IsEmptyString Then Throw New ArgumentNullException("File", "The output file cannot be null")
|
||||||
With MyContainer
|
With MyContainer
|
||||||
.OutputVideoExtension = CMB_FORMAT.Text.StringToLower
|
.OutputVideoExtension = CMB_FORMAT.Text.StringToLower
|
||||||
|
.OutputVideoFPS = AConvert(Of Double)(TXT_FPS.Text, YouTubeSettings.FpsFormatProvider.MyProviderDefault, -1)
|
||||||
.OutputAudioCodec = CMB_AUDIO_CODEC.Text.StringToLower
|
.OutputAudioCodec = CMB_AUDIO_CODEC.Text.StringToLower
|
||||||
.OutputSubtitlesFormat = CMB_SUBS_FORMAT.Text.StringToLower
|
.OutputSubtitlesFormat = CMB_SUBS_FORMAT.Text.StringToLower
|
||||||
|
|
||||||
@@ -346,6 +401,19 @@ Namespace API.YouTube.Controls
|
|||||||
Private Sub OPT_VIDEO_AUDIO_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_VIDEO.CheckedChanged, OPT_AUDIO.CheckedChanged
|
Private Sub OPT_VIDEO_AUDIO_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_VIDEO.CheckedChanged, OPT_AUDIO.CheckedChanged
|
||||||
If Not Initialization Then
|
If Not Initialization Then
|
||||||
CMB_FORMAT.Enabled = OPT_VIDEO.Checked
|
CMB_FORMAT.Enabled = OPT_VIDEO.Checked
|
||||||
|
Dim upFormat As Action(Of String) = Sub(ByVal format As String)
|
||||||
|
If Not format.IsEmptyString Then
|
||||||
|
format = format.ToLower
|
||||||
|
Dim fIndex% = CMB_AUDIO_CODEC.Items.Cast(Of String).ListIndexOf(Function(f) f.ToLower = format)
|
||||||
|
If fIndex >= 0 Then CMB_AUDIO_CODEC.SelectedIndex = fIndex
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
If OPT_VIDEO.Checked Then
|
||||||
|
upFormat(MyYouTubeSettings.DefaultAudioCodec)
|
||||||
|
Else
|
||||||
|
upFormat(MyYouTubeSettings.DefaultAudioCodecMusic)
|
||||||
|
End If
|
||||||
|
|
||||||
If MyContainer.HasElements Then
|
If MyContainer.HasElements Then
|
||||||
NUM_RES.Enabled = OPT_VIDEO.Checked
|
NUM_RES.Enabled = OPT_VIDEO.Checked
|
||||||
Else
|
Else
|
||||||
|
|||||||
59
SCrawler.YouTube/Downloader/MediaItem.Designer.vb
generated
@@ -30,11 +30,16 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.BTT_DOWN = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_DOWN = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.SEP_DOWN = New System.Windows.Forms.ToolStripSeparator()
|
Me.SEP_DOWN = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.BTT_OPEN_FOLDER = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_OPEN_FOLDER = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_OPEN_FILE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.SEP_FOLDER = New System.Windows.Forms.ToolStripSeparator()
|
Me.SEP_FOLDER = New System.Windows.Forms.ToolStripSeparator()
|
||||||
|
Me.BTT_PLS_ITEM_EDIT = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_PLS_ITEM_EDIT_FULL = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.SEP_PLS_ITEM_EDIT = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.BTT_COPY_LINK = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_COPY_LINK = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_OPEN_IN_BROWSER = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_OPEN_IN_BROWSER = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.SEP_DOWN_AGAIN = New System.Windows.Forms.ToolStripSeparator()
|
Me.SEP_DOWN_AGAIN = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.BTT_DOWN_AGAIN = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_DOWN_AGAIN = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_VIEW_SETTINGS = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.SEP_DEL = New System.Windows.Forms.ToolStripSeparator()
|
Me.SEP_DEL = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.BTT_REMOVE_FROM_LIST = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_REMOVE_FROM_LIST = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_DELETE_FILE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_DELETE_FILE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
@@ -42,7 +47,6 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.TP_CHECKED_TITLE = New System.Windows.Forms.TableLayoutPanel()
|
Me.TP_CHECKED_TITLE = New System.Windows.Forms.TableLayoutPanel()
|
||||||
Me.LBL_TITLE = New System.Windows.Forms.Label()
|
Me.LBL_TITLE = New System.Windows.Forms.Label()
|
||||||
Me.CH_CHECKED = New System.Windows.Forms.CheckBox()
|
Me.CH_CHECKED = New System.Windows.Forms.CheckBox()
|
||||||
Me.BTT_VIEW_SETTINGS = New System.Windows.Forms.ToolStripMenuItem()
|
|
||||||
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
||||||
TP_MAIN.SuspendLayout()
|
TP_MAIN.SuspendLayout()
|
||||||
CType(Me.ICON_VIDEO, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.ICON_VIDEO, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
@@ -83,10 +87,10 @@ Namespace DownloadObjects.STDownloader
|
|||||||
'
|
'
|
||||||
'CONTEXT_MAIN
|
'CONTEXT_MAIN
|
||||||
'
|
'
|
||||||
Me.CONTEXT_MAIN.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_DOWN, Me.SEP_DOWN, Me.BTT_OPEN_FOLDER, Me.SEP_FOLDER, Me.BTT_COPY_LINK, Me.BTT_OPEN_IN_BROWSER, Me.SEP_DOWN_AGAIN, Me.BTT_DOWN_AGAIN, Me.BTT_VIEW_SETTINGS, Me.SEP_DEL, Me.BTT_REMOVE_FROM_LIST, Me.BTT_DELETE_FILE})
|
Me.CONTEXT_MAIN.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_DOWN, Me.SEP_DOWN, Me.BTT_OPEN_FOLDER, Me.BTT_OPEN_FILE, Me.SEP_FOLDER, Me.BTT_PLS_ITEM_EDIT, Me.BTT_PLS_ITEM_EDIT_FULL, Me.SEP_PLS_ITEM_EDIT, Me.BTT_COPY_LINK, Me.BTT_OPEN_IN_BROWSER, Me.SEP_DOWN_AGAIN, Me.BTT_DOWN_AGAIN, Me.BTT_VIEW_SETTINGS, Me.SEP_DEL, Me.BTT_REMOVE_FROM_LIST, Me.BTT_DELETE_FILE})
|
||||||
Me.CONTEXT_MAIN.Name = "CONTEXT_MAIN"
|
Me.CONTEXT_MAIN.Name = "CONTEXT_MAIN"
|
||||||
Me.CONTEXT_MAIN.ShowItemToolTips = False
|
Me.CONTEXT_MAIN.ShowItemToolTips = False
|
||||||
Me.CONTEXT_MAIN.Size = New System.Drawing.Size(185, 226)
|
Me.CONTEXT_MAIN.Size = New System.Drawing.Size(185, 298)
|
||||||
'
|
'
|
||||||
'BTT_DOWN
|
'BTT_DOWN
|
||||||
'
|
'
|
||||||
@@ -107,11 +111,42 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.BTT_OPEN_FOLDER.Size = New System.Drawing.Size(184, 22)
|
Me.BTT_OPEN_FOLDER.Size = New System.Drawing.Size(184, 22)
|
||||||
Me.BTT_OPEN_FOLDER.Text = "Open folder"
|
Me.BTT_OPEN_FOLDER.Text = "Open folder"
|
||||||
'
|
'
|
||||||
|
'BTT_OPEN_FILE
|
||||||
|
'
|
||||||
|
Me.BTT_OPEN_FILE.Image = CType(resources.GetObject("BTT_OPEN_FILE.Image"), System.Drawing.Image)
|
||||||
|
Me.BTT_OPEN_FILE.Name = "BTT_OPEN_FILE"
|
||||||
|
Me.BTT_OPEN_FILE.Size = New System.Drawing.Size(184, 22)
|
||||||
|
Me.BTT_OPEN_FILE.Text = "Open file"
|
||||||
|
'
|
||||||
'SEP_FOLDER
|
'SEP_FOLDER
|
||||||
'
|
'
|
||||||
Me.SEP_FOLDER.Name = "SEP_FOLDER"
|
Me.SEP_FOLDER.Name = "SEP_FOLDER"
|
||||||
Me.SEP_FOLDER.Size = New System.Drawing.Size(181, 6)
|
Me.SEP_FOLDER.Size = New System.Drawing.Size(181, 6)
|
||||||
'
|
'
|
||||||
|
'BTT_PLS_ITEM_EDIT
|
||||||
|
'
|
||||||
|
Me.BTT_PLS_ITEM_EDIT.Image = CType(resources.GetObject("BTT_PLS_ITEM_EDIT.Image"), System.Drawing.Image)
|
||||||
|
Me.BTT_PLS_ITEM_EDIT.Name = "BTT_PLS_ITEM_EDIT"
|
||||||
|
Me.BTT_PLS_ITEM_EDIT.Size = New System.Drawing.Size(184, 22)
|
||||||
|
Me.BTT_PLS_ITEM_EDIT.Text = "Edit"
|
||||||
|
Me.BTT_PLS_ITEM_EDIT.Visible = False
|
||||||
|
'
|
||||||
|
'BTT_PLS_ITEM_EDIT_FULL
|
||||||
|
'
|
||||||
|
Me.BTT_PLS_ITEM_EDIT_FULL.AutoToolTip = True
|
||||||
|
Me.BTT_PLS_ITEM_EDIT_FULL.Image = CType(resources.GetObject("BTT_PLS_ITEM_EDIT_FULL.Image"), System.Drawing.Image)
|
||||||
|
Me.BTT_PLS_ITEM_EDIT_FULL.Name = "BTT_PLS_ITEM_EDIT_FULL"
|
||||||
|
Me.BTT_PLS_ITEM_EDIT_FULL.Size = New System.Drawing.Size(184, 22)
|
||||||
|
Me.BTT_PLS_ITEM_EDIT_FULL.Text = "Edit (inherit settings)"
|
||||||
|
Me.BTT_PLS_ITEM_EDIT_FULL.ToolTipText = "Inherit settings selected in the form"
|
||||||
|
Me.BTT_PLS_ITEM_EDIT_FULL.Visible = False
|
||||||
|
'
|
||||||
|
'SEP_PLS_ITEM_EDIT
|
||||||
|
'
|
||||||
|
Me.SEP_PLS_ITEM_EDIT.Name = "SEP_PLS_ITEM_EDIT"
|
||||||
|
Me.SEP_PLS_ITEM_EDIT.Size = New System.Drawing.Size(181, 6)
|
||||||
|
Me.SEP_PLS_ITEM_EDIT.Visible = False
|
||||||
|
'
|
||||||
'BTT_COPY_LINK
|
'BTT_COPY_LINK
|
||||||
'
|
'
|
||||||
Me.BTT_COPY_LINK.Image = Global.SCrawler.My.Resources.Resources.LinkPic_32
|
Me.BTT_COPY_LINK.Image = Global.SCrawler.My.Resources.Resources.LinkPic_32
|
||||||
@@ -138,6 +173,13 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.BTT_DOWN_AGAIN.Size = New System.Drawing.Size(184, 22)
|
Me.BTT_DOWN_AGAIN.Size = New System.Drawing.Size(184, 22)
|
||||||
Me.BTT_DOWN_AGAIN.Text = "Download again"
|
Me.BTT_DOWN_AGAIN.Text = "Download again"
|
||||||
'
|
'
|
||||||
|
'BTT_VIEW_SETTINGS
|
||||||
|
'
|
||||||
|
Me.BTT_VIEW_SETTINGS.Image = Global.SCrawler.My.Resources.Resources.SettingsPic_16
|
||||||
|
Me.BTT_VIEW_SETTINGS.Name = "BTT_VIEW_SETTINGS"
|
||||||
|
Me.BTT_VIEW_SETTINGS.Size = New System.Drawing.Size(184, 22)
|
||||||
|
Me.BTT_VIEW_SETTINGS.Text = "View settings"
|
||||||
|
'
|
||||||
'SEP_DEL
|
'SEP_DEL
|
||||||
'
|
'
|
||||||
Me.SEP_DEL.Name = "SEP_DEL"
|
Me.SEP_DEL.Name = "SEP_DEL"
|
||||||
@@ -212,13 +254,6 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.CH_CHECKED.TabIndex = 0
|
Me.CH_CHECKED.TabIndex = 0
|
||||||
Me.CH_CHECKED.UseVisualStyleBackColor = True
|
Me.CH_CHECKED.UseVisualStyleBackColor = True
|
||||||
'
|
'
|
||||||
'BTT_VIEW_SETTINGS
|
|
||||||
'
|
|
||||||
Me.BTT_VIEW_SETTINGS.Image = Global.SCrawler.My.Resources.Resources.SettingsPic_16
|
|
||||||
Me.BTT_VIEW_SETTINGS.Name = "BTT_VIEW_SETTINGS"
|
|
||||||
Me.BTT_VIEW_SETTINGS.Size = New System.Drawing.Size(184, 22)
|
|
||||||
Me.BTT_VIEW_SETTINGS.Text = "View settings"
|
|
||||||
'
|
|
||||||
'MediaItem
|
'MediaItem
|
||||||
'
|
'
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
@@ -253,5 +288,9 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Private WithEvents SEP_DOWN_AGAIN As ToolStripSeparator
|
Private WithEvents SEP_DOWN_AGAIN As ToolStripSeparator
|
||||||
Private WithEvents SEP_DEL As ToolStripSeparator
|
Private WithEvents SEP_DEL As ToolStripSeparator
|
||||||
Private WithEvents BTT_VIEW_SETTINGS As ToolStripMenuItem
|
Private WithEvents BTT_VIEW_SETTINGS As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_OPEN_FILE As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_PLS_ITEM_EDIT As ToolStripMenuItem
|
||||||
|
Private WithEvents SEP_PLS_ITEM_EDIT As ToolStripSeparator
|
||||||
|
Private WithEvents BTT_PLS_ITEM_EDIT_FULL As ToolStripMenuItem
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -138,6 +138,138 @@
|
|||||||
PNWfb/GWbyQQ2Z/pgjaJ9XsI91sIjr1H+fgUVeYh/KVrFs8Itp6O1B2RR+fAdhzupEHDXnw3U3GVpuAq
|
PNWfb/GWbyQQ2Z/pgjaJ9XsI91sIjr1H+fgUVeYh/KVrFs8Itp6O1B2RR+fAdhzupEHDXnw3U3GVpuAq
|
||||||
+w/y3l2wnHCNxMrhGIGMcp2WpkyYWeqcC30Co5OYu0gvwZIRtc4b606cpoUYtF9y3BgvNkFSmhcSO25a
|
+w/y3l2wnHCNxMrhGIGMcp2WpkyYWeqcC30Co5OYu0gvwZIRtc4b606cpoUYtF9y3BgvNkFSmhcSO25a
|
||||||
TGCkk99shOQwl9bXawAAAABJRU5ErkJggg==
|
TGCkk99shOQwl9bXawAAAABJRU5ErkJggg==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BTT_OPEN_FILE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
|
wwAADsMBx2+oZAAAAk9JREFUOE+Nk0tIVGEUgKcWZlZWEK1aZEmZUlmpEQUtrF1Q0WNfUUgtCqKZLMXQ
|
||||||
|
UPJRmuY4TYYKmbPJcVSCAkuFQislzCx7rSo3Oc5T7zzu17njdZosxMXH/bn/+b97zn/ONfBjAJoPQctR
|
||||||
|
sB2bH1rsw8OEvnVj0BbUbdNJ19HW2+fmbgZO4wIR2MRm3irIQcsO2RA0Qe3mf9EOajGRuEycuXEiaDky
|
||||||
|
vdlXTfjrc0Kfu1BfVkJjtqR68G80cfRDIrgSL4Km/fCinFC/GU9JEs7CTUy25hAafYIy8hhl2IEy2Iwy
|
||||||
|
0IzacRaq1kNNClizdEHjPhiw4nFcRClKFLukWZvG1PWVuI0GPMVr8LYb8XZcRvX/gqEH0HZSskmPEbyu
|
||||||
|
w9N+CaV41bS9/Qx86oQPdhh1EOwuwesw4bGdY7LvPoHhNgIlq5nIS5gl0DLoyIF3LfgbDjBhFap348uL
|
||||||
|
Q5EDyrVEgvZT+Htv4ytYiit/WYzAfh6lIgl1bBB/xQYmi1YQqkomVJmMapbLswhN2ajfX+ErW8dU+Vpc
|
||||||
|
eUtiBRcIPDpBoKcU99V4uJf1p2Va+2q3QE8hSvcN3PkJUL9r5g6kXW8sUoKRqSE7vlupBCUTrJl6u3SB
|
||||||
|
PNWfb/GWbyQQ2Z/pgjaJ9XsI91sIjr1H+fgUVeYh/KVrFs8Itp6O1B2RR+fAdhzupEHDXnw3U3GVpuAq
|
||||||
|
+w/y3l2wnHCNxMrhGIGMcp2WpkyYWeqcC30Co5OYu0gvwZIRtc4b606cpoUYtF9y3BgvNkFSmhcSO25a
|
||||||
|
TGCkk99shOQwl9bXawAAAABJRU5ErkJggg==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BTT_PLS_ITEM_EDIT.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
|
AAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BTT_PLS_ITEM_EDIT_FULL.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
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
|
||||||
|
AAAASUVORK5CYII=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BTT_OPEN_IN_BROWSER.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="BTT_OPEN_IN_BROWSER.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Public Event DownloadAgain As MediaItemEventHandler
|
Public Event DownloadAgain As MediaItemEventHandler
|
||||||
Public Event DownloadRequested As MediaItemEventHandler
|
Public Event DownloadRequested As MediaItemEventHandler
|
||||||
Public Event CheckedChanged As MediaItemEventHandler
|
Public Event CheckedChanged As MediaItemEventHandler
|
||||||
|
Public Event BeforeOpenEditor As MediaItemEventHandler
|
||||||
|
Public Event BeforeOpenEditorFull As MediaItemEventHandler
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
#Region "Controls"
|
#Region "Controls"
|
||||||
@@ -51,8 +53,8 @@ Namespace DownloadObjects.STDownloader
|
|||||||
ControlInvokeFast(CH_CHECKED, Sub() CH_CHECKED.Checked = _Checked, EDP.None)
|
ControlInvokeFast(CH_CHECKED, Sub() CH_CHECKED.Checked = _Checked, EDP.None)
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
<Browsable(False)> Public Property IgnoreDownloadState As Boolean = False
|
|
||||||
Private ReadOnly FileOption As SFO = SFO.File
|
Private ReadOnly FileOption As SFO = SFO.File
|
||||||
|
Private ReadOnly ContainerHasElements As Boolean = False
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Initializers"
|
#Region "Initializers"
|
||||||
Public Sub New()
|
Public Sub New()
|
||||||
@@ -111,16 +113,18 @@ Namespace DownloadObjects.STDownloader
|
|||||||
.ContextMenuStrip = CONTEXT_MAIN
|
.ContextMenuStrip = CONTEXT_MAIN
|
||||||
}
|
}
|
||||||
End Sub
|
End Sub
|
||||||
Public Sub New(ByVal Container As IYouTubeMediaContainer)
|
Public Sub New(ByVal Container As IYouTubeMediaContainer, Optional ByVal HasElements As Boolean = False)
|
||||||
Me.New
|
Me.New
|
||||||
Const d$ = " " & ChrW(183) & " "
|
Const d$ = " " & ChrW(183) & " "
|
||||||
MyContainer = Container
|
MyContainer = Container
|
||||||
|
ContainerHasElements = HasElements
|
||||||
With MyContainer
|
With MyContainer
|
||||||
.Progress = MyProgress
|
.Progress = MyProgress
|
||||||
|
If HasElements Then BTT_PLS_ITEM_EDIT.Visible = True : BTT_PLS_ITEM_EDIT_FULL.Visible = True : SEP_PLS_ITEM_EDIT.Visible = True
|
||||||
If .HasElements Then FileOption = SFO.Path Else FileOption = SFO.File
|
If .HasElements Then FileOption = SFO.Path Else FileOption = SFO.File
|
||||||
If .DownloadState = Plugin.UserMediaStates.Downloaded AndAlso
|
If .DownloadState = Plugin.UserMediaStates.Downloaded AndAlso
|
||||||
(.ObjectType = Base.YouTubeMediaType.Channel Or .ObjectType = Base.YouTubeMediaType.PlayList) AndAlso FileOption = SFO.File 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
|
Not .File.Exists AndAlso .File.Exists(SFO.Path, False) Then FileOption = SFO.Path : BTT_OPEN_FILE.Visible = False
|
||||||
If Not .SiteKey = YouTubeSiteKey Then
|
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
|
||||||
@@ -224,11 +228,17 @@ Namespace DownloadObjects.STDownloader
|
|||||||
.Controls.Clear()
|
.Controls.Clear()
|
||||||
.ColumnStyles.Clear()
|
.ColumnStyles.Clear()
|
||||||
.ColumnCount = 0
|
.ColumnCount = 0
|
||||||
If IgnoreDownloadState Or MyContainer.MediaState = Plugin.UserMediaStates.Downloaded Then
|
If ContainerHasElements Or MyContainer.MediaState = Plugin.UserMediaStates.Downloaded Then
|
||||||
If Not MyContainer.SiteKey = YouTubeSiteKey Then UpdateMediaIcon()
|
If Not MyContainer.SiteKey = YouTubeSiteKey Then UpdateMediaIcon()
|
||||||
If IgnoreDownloadState Then
|
If ContainerHasElements Then
|
||||||
BTT_OPEN_FOLDER.Visible = False
|
BTT_OPEN_FOLDER.Visible = False
|
||||||
|
BTT_OPEN_FILE.Visible = False
|
||||||
SEP_FOLDER.Visible = False
|
SEP_FOLDER.Visible = False
|
||||||
|
If Not ContainerHasElements Then
|
||||||
|
BTT_PLS_ITEM_EDIT.Visible = False
|
||||||
|
BTT_PLS_ITEM_EDIT_FULL.Visible = False
|
||||||
|
SEP_PLS_ITEM_EDIT.Visible = False
|
||||||
|
End If
|
||||||
BTT_DOWN_AGAIN.Visible = False
|
BTT_DOWN_AGAIN.Visible = False
|
||||||
SEP_DOWN_AGAIN.Visible = False
|
SEP_DOWN_AGAIN.Visible = False
|
||||||
BTT_REMOVE_FROM_LIST.Visible = False
|
BTT_REMOVE_FROM_LIST.Visible = False
|
||||||
@@ -369,7 +379,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
ICON_WHAT.DoubleClick, LBL_TIME.DoubleClick, ICON_SIZE.DoubleClick, LBL_INFO.DoubleClick,
|
ICON_WHAT.DoubleClick, LBL_TIME.DoubleClick, ICON_SIZE.DoubleClick, LBL_INFO.DoubleClick,
|
||||||
LBL_PROGRESS.DoubleClick, PR_MAIN.DoubleClick
|
LBL_PROGRESS.DoubleClick, PR_MAIN.DoubleClick
|
||||||
Controls_Click(sender, e)
|
Controls_Click(sender, e)
|
||||||
If Not IgnoreDownloadState AndAlso Not MyDownloaderSettings.OnItemDoubleClick = DoubleClickBehavior.None Then
|
If Not ContainerHasElements AndAlso Not MyDownloaderSettings.OnItemDoubleClick = DoubleClickBehavior.None Then
|
||||||
Dim m As New MMessage("The specified path was not found.", "Open file/folder",, vbExclamation)
|
Dim m As New MMessage("The specified path was not found.", "Open file/folder",, vbExclamation)
|
||||||
If MyDownloaderSettings.OnItemDoubleClick = DoubleClickBehavior.File Then
|
If MyDownloaderSettings.OnItemDoubleClick = DoubleClickBehavior.File Then
|
||||||
If FileOption = SFO.File And MyContainer.File.Exists(SFO.File, False) Then
|
If FileOption = SFO.File And MyContainer.File.Exists(SFO.File, False) Then
|
||||||
@@ -405,6 +415,27 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Private Sub BTT_OPEN_FOLDER_Click(sender As Object, e As EventArgs) Handles BTT_OPEN_FOLDER.Click
|
Private Sub BTT_OPEN_FOLDER_Click(sender As Object, e As EventArgs) Handles BTT_OPEN_FOLDER.Click
|
||||||
If MyContainer.File.Exists(FileOption, False) Then GlobalOpenPath(MyContainer.File)
|
If MyContainer.File.Exists(FileOption, False) Then GlobalOpenPath(MyContainer.File)
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub BTT_OPEN_FILE_Click(sender As Object, e As EventArgs) Handles BTT_OPEN_FILE.Click
|
||||||
|
If MyContainer.File.Exists(SFO.File) Then MyContainer.File.Open(,, EDP.ShowAllMsg)
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_PLS_ITEM_EDIT_Click(sender As Object, e As EventArgs) Handles BTT_PLS_ITEM_EDIT.Click, BTT_PLS_ITEM_EDIT_FULL.Click
|
||||||
|
If ContainerHasElements Then
|
||||||
|
With DirectCast(MyContainer, YouTubeMediaContainerBase)
|
||||||
|
Dim initProtected As Boolean = .Protected
|
||||||
|
Dim isFull As Boolean = sender Is BTT_PLS_ITEM_EDIT_FULL
|
||||||
|
.Protected = False
|
||||||
|
If isFull Then
|
||||||
|
RaiseEvent BeforeOpenEditorFull(Me, MyContainer)
|
||||||
|
Else
|
||||||
|
RaiseEvent BeforeOpenEditor(Me, MyContainer)
|
||||||
|
End If
|
||||||
|
Using f As New VideoOptionsForm(MyContainer, initProtected Or isFull)
|
||||||
|
f.ShowDialog()
|
||||||
|
.Protected = IIf(f.DialogResult = DialogResult.OK, True, initProtected)
|
||||||
|
End Using
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
Private Sub BTT_COPY_LINK_Click(sender As Object, e As EventArgs) Handles BTT_COPY_LINK.Click
|
Private Sub BTT_COPY_LINK_Click(sender As Object, e As EventArgs) Handles BTT_COPY_LINK.Click
|
||||||
If Not MyContainer.URL.IsEmptyString Then
|
If Not MyContainer.URL.IsEmptyString Then
|
||||||
BufferText = MyContainer.URL
|
BufferText = MyContainer.URL
|
||||||
|
|||||||
@@ -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.12.14.0")>
|
<Assembly: AssemblyVersion("2024.2.25.0")>
|
||||||
<Assembly: AssemblyFileVersion("2023.12.14.0")>
|
<Assembly: AssemblyFileVersion("2024.2.25.0")>
|
||||||
<Assembly: NeutralResourcesLanguage("en")>
|
<Assembly: NeutralResourcesLanguage("en")>
|
||||||
|
|||||||
@@ -139,11 +139,14 @@ Namespace API.YouTube.Objects
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Data info"
|
#Region "Data info"
|
||||||
Friend ReadOnly Property MediaObjects As List(Of MediaObject) Implements IYouTubeMediaContainer.MediaObjects
|
Friend ReadOnly Property MediaObjects As List(Of MediaObject) Implements IYouTubeMediaContainer.MediaObjects
|
||||||
|
Friend Property [Protected] As Boolean = False
|
||||||
|
Friend Property IsAudioSelected As Boolean = False
|
||||||
#Region "Array"
|
#Region "Array"
|
||||||
''' <summary>[-10] = disabled; [-1] = max; [-2] = audio only</summary>
|
''' <summary>[-10] = disabled; [-1] = max; [-2] = audio only</summary>
|
||||||
<XMLEC> Friend Property ArrayMaxResolution As Integer = -10
|
<XMLEC> Friend Property ArrayMaxResolution As Integer = -10
|
||||||
''' <param name="Value">[-1] = max; [-2] = audio only</param>
|
''' <param name="Value">[-1] = max; [-2] = audio only</param>
|
||||||
Friend Sub SetMaxResolution(ByVal Value As Integer)
|
Friend Sub SetMaxResolution(ByVal Value As Integer)
|
||||||
|
If Not [Protected] Then
|
||||||
ArrayMaxResolution = Value
|
ArrayMaxResolution = Value
|
||||||
SelectedVideoIndex = -1
|
SelectedVideoIndex = -1
|
||||||
If MediaObjects.Count > 0 And Value <> -2 Then
|
If MediaObjects.Count > 0 And Value <> -2 Then
|
||||||
@@ -155,6 +158,7 @@ Namespace API.YouTube.Objects
|
|||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
If HasElements Then Elements.ForEach(Sub(e As YouTubeMediaContainerBase) e.SetMaxResolution(Value))
|
If HasElements Then Elements.ForEach(Sub(e As YouTubeMediaContainerBase) e.SetMaxResolution(Value))
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Thumbnails"
|
#Region "Thumbnails"
|
||||||
@@ -213,8 +217,22 @@ Namespace API.YouTube.Objects
|
|||||||
Return _OutputVideoExtension
|
Return _OutputVideoExtension
|
||||||
End Get
|
End Get
|
||||||
Set(ByVal _OutputVideoExtension As String)
|
Set(ByVal _OutputVideoExtension As String)
|
||||||
|
If Not [Protected] Then
|
||||||
Me._OutputVideoExtension = _OutputVideoExtension
|
Me._OutputVideoExtension = _OutputVideoExtension
|
||||||
If HasElements Then Elements.ForEach(Sub(e) e.OutputVideoExtension = _OutputVideoExtension)
|
If HasElements Then Elements.ForEach(Sub(e) e.OutputVideoExtension = _OutputVideoExtension)
|
||||||
|
End If
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
<XMLEC("OutputVideoFPS")> Protected _OutputVideoFPS As Double = -1
|
||||||
|
Friend Property OutputVideoFPS As Double
|
||||||
|
Get
|
||||||
|
Return _OutputVideoFPS
|
||||||
|
End Get
|
||||||
|
Set(ByVal fps As Double)
|
||||||
|
If Not [Protected] Then
|
||||||
|
_OutputVideoFPS = fps
|
||||||
|
If HasElements Then Elements.ForEach(Sub(elem) DirectCast(elem, YouTubeMediaContainerBase).OutputVideoFPS = fps)
|
||||||
|
End If
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
#End Region
|
#End Region
|
||||||
@@ -231,8 +249,10 @@ Namespace API.YouTube.Objects
|
|||||||
Return _OutputAudioCodec
|
Return _OutputAudioCodec
|
||||||
End Get
|
End Get
|
||||||
Set(ByVal _OutputAudioCodec As String)
|
Set(ByVal _OutputAudioCodec As String)
|
||||||
|
If Not [Protected] Then
|
||||||
Me._OutputAudioCodec = _OutputAudioCodec
|
Me._OutputAudioCodec = _OutputAudioCodec
|
||||||
If HasElements Then Elements.ForEach(Sub(e) e.OutputAudioCodec = _OutputAudioCodec)
|
If HasElements Then Elements.ForEach(Sub(e) e.OutputAudioCodec = _OutputAudioCodec)
|
||||||
|
End If
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
<XMLEC(CollectionMode:=CollectionModes.String)>
|
<XMLEC(CollectionMode:=CollectionModes.String)>
|
||||||
@@ -272,8 +292,10 @@ Namespace API.YouTube.Objects
|
|||||||
Return _OutputSubtitlesFormat
|
Return _OutputSubtitlesFormat
|
||||||
End Get
|
End Get
|
||||||
Set(ByVal _OutputSubtitlesFormat As String)
|
Set(ByVal _OutputSubtitlesFormat As String)
|
||||||
|
If Not [Protected] Then
|
||||||
Me._OutputSubtitlesFormat = _OutputSubtitlesFormat
|
Me._OutputSubtitlesFormat = _OutputSubtitlesFormat
|
||||||
If HasElements Then Elements.ForEach(Sub(e) e.OutputSubtitlesFormat = _OutputSubtitlesFormat)
|
If HasElements Then Elements.ForEach(Sub(e) e.OutputSubtitlesFormat = _OutputSubtitlesFormat)
|
||||||
|
End If
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
<XMLEC(CollectionMode:=CollectionModes.String)>
|
<XMLEC(CollectionMode:=CollectionModes.String)>
|
||||||
@@ -555,8 +577,10 @@ Namespace API.YouTube.Objects
|
|||||||
Return _AbsolutePath
|
Return _AbsolutePath
|
||||||
End Get
|
End Get
|
||||||
Set(ByVal ap As Boolean)
|
Set(ByVal ap As Boolean)
|
||||||
|
If Not [Protected] Then
|
||||||
_AbsolutePath = ap
|
_AbsolutePath = ap
|
||||||
If Elements.Count > 0 Then Elements.ForEach(Sub(e As YouTubeMediaContainerBase) e.AbsolutePath = ap)
|
If Elements.Count > 0 Then Elements.ForEach(Sub(e As YouTubeMediaContainerBase) e.AbsolutePath = ap)
|
||||||
|
End If
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
Public Overridable Property File As SFile Implements IYouTubeMediaContainer.File
|
Public Overridable Property File As SFile Implements IYouTubeMediaContainer.File
|
||||||
@@ -564,6 +588,7 @@ Namespace API.YouTube.Objects
|
|||||||
Return _File
|
Return _File
|
||||||
End Get
|
End Get
|
||||||
Set(ByVal f As SFile)
|
Set(ByVal f As SFile)
|
||||||
|
If Not [Protected] Then
|
||||||
Select Case ObjectType
|
Select Case ObjectType
|
||||||
Case YouTubeMediaType.Channel : _File = f.Path
|
Case YouTubeMediaType.Channel : _File = f.Path
|
||||||
Case YouTubeMediaType.PlayList
|
Case YouTubeMediaType.PlayList
|
||||||
@@ -586,6 +611,7 @@ Namespace API.YouTube.Objects
|
|||||||
End Select
|
End Select
|
||||||
GenerateFileName()
|
GenerateFileName()
|
||||||
If HasElements Then Elements.ForEach(Sub(e) e.File = _File)
|
If HasElements Then Elements.ForEach(Sub(e) e.File = _File)
|
||||||
|
End If
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
Public Property FileSettings As SFile
|
Public Property FileSettings As SFile
|
||||||
@@ -614,6 +640,7 @@ Namespace API.YouTube.Objects
|
|||||||
If Not File.IsEmptyString Then
|
If Not File.IsEmptyString Then
|
||||||
If File.Exists Then File = SFile.IndexReindex(File)
|
If File.Exists Then File = SFile.IndexReindex(File)
|
||||||
Dim cmd$ = String.Empty, formats$ = String.Empty, subs$ = String.Empty, remux$ = String.Empty
|
Dim cmd$ = String.Empty, formats$ = String.Empty, subs$ = String.Empty, remux$ = String.Empty
|
||||||
|
Dim embedThumbArgAdded As Boolean = False
|
||||||
_Size = 0
|
_Size = 0
|
||||||
Height = 0
|
Height = 0
|
||||||
Bitrate = 0
|
Bitrate = 0
|
||||||
@@ -626,6 +653,10 @@ Namespace API.YouTube.Objects
|
|||||||
_MediaType = UMTypes.Video
|
_MediaType = UMTypes.Video
|
||||||
Height = SelectedVideo.Height
|
Height = SelectedVideo.Height
|
||||||
_File.Extension = OutputVideoExtension
|
_File.Extension = OutputVideoExtension
|
||||||
|
If Not embedThumbArgAdded And MyYouTubeSettings.DefaultVideoEmbedThumbnail Then
|
||||||
|
formats.StringAppend("--embed-thumbnail", " ")
|
||||||
|
embedThumbArgAdded = True
|
||||||
|
End If
|
||||||
Else
|
Else
|
||||||
formats.StringAppend("--extract-audio", " ")
|
formats.StringAppend("--extract-audio", " ")
|
||||||
_MediaType = UMTypes.Audio
|
_MediaType = UMTypes.Audio
|
||||||
@@ -643,7 +674,13 @@ Namespace API.YouTube.Objects
|
|||||||
formats.StringAppend($"--audio-format {OutputAudioCodec.StringToLower}", " ")
|
formats.StringAppend($"--audio-format {OutputAudioCodec.StringToLower}", " ")
|
||||||
atCodec = OutputAudioCodec.StringToLower
|
atCodec = OutputAudioCodec.StringToLower
|
||||||
End If
|
End If
|
||||||
If SelectedVideoIndex = -1 Then formats.StringAppend("--add-metadata", " ")
|
If SelectedVideoIndex = -1 Then
|
||||||
|
formats.StringAppend("--add-metadata", " ")
|
||||||
|
If Not embedThumbArgAdded And MyYouTubeSettings.DefaultAudioEmbedThumbnail Then
|
||||||
|
formats.StringAppend("--embed-thumbnail", " ")
|
||||||
|
embedThumbArgAdded = True
|
||||||
|
End If
|
||||||
|
End If
|
||||||
_Size += SelectedAudio.Size
|
_Size += SelectedAudio.Size
|
||||||
If _MediaType = UMTypes.Undefined Then _MediaType = UMTypes.Audio
|
If _MediaType = UMTypes.Undefined Then _MediaType = UMTypes.Audio
|
||||||
Bitrate = SelectedAudio.Bitrate
|
Bitrate = SelectedAudio.Bitrate
|
||||||
@@ -1026,6 +1063,16 @@ Namespace API.YouTube.Objects
|
|||||||
If fAacAudio.Exists And Not aacRequested Then fAacAudio.Delete()
|
If fAacAudio.Exists And Not aacRequested Then fAacAudio.Delete()
|
||||||
If fAc3Audio.Exists And Not ac3Requested And SelectedVideoIndex >= 0 Then fAc3Audio.Delete()
|
If fAc3Audio.Exists And Not ac3Requested And SelectedVideoIndex >= 0 Then fAc3Audio.Delete()
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
If SelectedVideoIndex >= 0 AndAlso OutputVideoFPS > 0 AndAlso SelectedVideo.Bitrate > OutputVideoFPS Then
|
||||||
|
f = File
|
||||||
|
f.Name &= "tmp00"
|
||||||
|
.Execute($"ffmpeg -i ""{File}"" -filter:v fps={OutputVideoFPS.ToString.Replace(",", ".")} -c:a copy ""{f}""")
|
||||||
|
If f.Exists Then
|
||||||
|
File.Delete()
|
||||||
|
SFile.Rename(f, File,, EDP.LogMessageValue)
|
||||||
|
End If
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
|
|||||||
@@ -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.12.14.0")>
|
<Assembly: AssemblyVersion("2024.2.25.0")>
|
||||||
<Assembly: AssemblyFileVersion("2023.12.14.0")>
|
<Assembly: AssemblyFileVersion("2024.2.25.0")>
|
||||||
<Assembly: NeutralResourcesLanguage("en")>
|
<Assembly: NeutralResourcesLanguage("en")>
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ Imports PersonalUtilities.Tools.Web.Clients
|
|||||||
Imports PersonalUtilities.Tools.ImageRenderer
|
Imports PersonalUtilities.Tools.ImageRenderer
|
||||||
Imports UStates = SCrawler.API.Base.UserMedia.States
|
Imports UStates = SCrawler.API.Base.UserMedia.States
|
||||||
Imports UTypes = SCrawler.API.Base.UserMedia.Types
|
Imports UTypes = SCrawler.API.Base.UserMedia.Types
|
||||||
|
Imports CookieUpdateModes = PersonalUtilities.Tools.Web.Cookies.CookieKeeper.UpdateModes
|
||||||
Namespace API.Base
|
Namespace API.Base
|
||||||
Friend MustInherit Class UserDataBase : Implements IUserData, IPluginContentProvider, IThrower
|
Friend MustInherit Class UserDataBase : Implements IUserData, IPluginContentProvider, IThrower
|
||||||
Friend Const UserFileAppender As String = "User"
|
Friend Const UserFileAppender As String = "User"
|
||||||
@@ -1150,6 +1151,8 @@ BlockNullPicture:
|
|||||||
Private _EnvirChanged As Boolean = False
|
Private _EnvirChanged As Boolean = False
|
||||||
Private _PictureExists As Boolean
|
Private _PictureExists As Boolean
|
||||||
Private _EnvirInvokeUserUpdated As Boolean = False
|
Private _EnvirInvokeUserUpdated As Boolean = False
|
||||||
|
Protected _ResponserAutoUpdateCookies As Boolean = False
|
||||||
|
Protected _ResponserAddResponseReceivedHandler As Boolean = False
|
||||||
Protected Sub EnvirDownloadSet()
|
Protected Sub EnvirDownloadSet()
|
||||||
TokenPersonal = Nothing
|
TokenPersonal = Nothing
|
||||||
ProgressPre.Reset()
|
ProgressPre.Reset()
|
||||||
@@ -1191,7 +1194,14 @@ BlockNullPicture:
|
|||||||
If Not Responser Is Nothing Then Responser.Dispose()
|
If Not Responser Is Nothing Then Responser.Dispose()
|
||||||
Responser = New Responser
|
Responser = New Responser
|
||||||
If Not HOST.Responser Is Nothing Then Responser.Copy(HOST.Responser)
|
If Not HOST.Responser Is Nothing Then Responser.Copy(HOST.Responser)
|
||||||
|
If Not Responser Is Nothing And _ResponserAutoUpdateCookies Then
|
||||||
|
If _ResponserAutoUpdateCookies Then
|
||||||
|
Responser.CookiesUpdateMode = CookieUpdateModes.ReplaceByNameAll
|
||||||
|
Responser.CookiesExtractMode = Responser.CookiesExtractModes.Any
|
||||||
|
Responser.CookiesExtractedAutoSave = False
|
||||||
|
End If
|
||||||
|
If _ResponserAddResponseReceivedHandler Then AddHandler Responser.ResponseReceived, AddressOf Responser_ResponseReceived
|
||||||
|
End If
|
||||||
Responser.DecodersError = New ErrorsDescriber(EDP.SendToLog + EDP.ReturnValue) With {
|
Responser.DecodersError = New ErrorsDescriber(EDP.SendToLog + EDP.ReturnValue) With {
|
||||||
.DeclaredMessage = New MMessage($"SymbolsConverter error: [{ToStringForLog()}]", ToStringForLog())}
|
.DeclaredMessage = New MMessage($"SymbolsConverter error: [{ToStringForLog()}]", ToStringForLog())}
|
||||||
|
|
||||||
@@ -1284,9 +1294,9 @@ BlockNullPicture:
|
|||||||
Catch exit_ex As ExitException
|
Catch exit_ex As ExitException
|
||||||
If Not exit_ex.Silent Then
|
If Not exit_ex.Silent Then
|
||||||
If exit_ex.SimpleLogLine Then
|
If exit_ex.SimpleLogLine Then
|
||||||
MyMainLOG = $"{ToStringForLog()}: downloading canceled (exit) ({exit_ex.Message})"
|
MyMainLOG = $"{ToStringForLog()}: downloading interrupted (exit) ({exit_ex.Message})"
|
||||||
Else
|
Else
|
||||||
ErrorsDescriber.Execute(EDP.SendToLog, exit_ex, $"{ToStringForLog()}: downloading canceled (exit)")
|
ErrorsDescriber.Execute(EDP.SendToLog, exit_ex, $"{ToStringForLog()}: downloading interrupted (exit)")
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
Canceled = True
|
Canceled = True
|
||||||
@@ -1311,6 +1321,7 @@ BlockNullPicture:
|
|||||||
ProgressPre.Done()
|
ProgressPre.Done()
|
||||||
__DOWNLOAD_IN_PROGRESS = False
|
__DOWNLOAD_IN_PROGRESS = False
|
||||||
OnUserDownloadStateChanged(False)
|
OnUserDownloadStateChanged(False)
|
||||||
|
If _ResponserAddResponseReceivedHandler Then Responser_ResponseReceived_RemoveHandler()
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Protected Sub UpdateDataFiles()
|
Protected Sub UpdateDataFiles()
|
||||||
@@ -1333,6 +1344,13 @@ BlockNullPicture:
|
|||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Protected MustOverride Sub DownloadDataF(ByVal Token As CancellationToken)
|
Protected MustOverride Sub DownloadDataF(ByVal Token As CancellationToken)
|
||||||
|
Protected Overridable Sub Responser_ResponseReceived(ByVal Sender As Object, ByVal e As EventArguments.WebDataResponse)
|
||||||
|
End Sub
|
||||||
|
Protected Sub Responser_ResponseReceived_RemoveHandler()
|
||||||
|
If Not Responser Is Nothing And _ResponserAddResponseReceivedHandler And Not Disposed Then
|
||||||
|
Try : RemoveHandler Responser.ResponseReceived, AddressOf Responser_ResponseReceived : Catch : End Try
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
Protected Function CreateCache() As CacheKeeper
|
Protected Function CreateCache() As CacheKeeper
|
||||||
Dim Cache As New CacheKeeper($"{DownloadContentDefault_GetRootDir()}\_tCache\")
|
Dim Cache As New CacheKeeper($"{DownloadContentDefault_GetRootDir()}\_tCache\")
|
||||||
Cache.CacheDeleteError = CacheDeletionError(Cache)
|
Cache.CacheDeleteError = CacheDeletionError(Cache)
|
||||||
@@ -2057,7 +2075,7 @@ BlockNullPicture:
|
|||||||
End Function
|
End Function
|
||||||
Private Class FilesCopyingException : Inherits ErrorsDescriberException
|
Private Class FilesCopyingException : Inherits ErrorsDescriberException
|
||||||
Friend Sub New(ByVal User As IUserData, ByVal Msg As String, ByVal Path As SFile)
|
Friend Sub New(ByVal User As IUserData, ByVal Msg As String, ByVal Path As SFile)
|
||||||
SendInLogOnlyMessage = True
|
SendToLogOnlyMessage = True
|
||||||
If User.IncludedInCollection Then _MainMessage = $"[{User.CollectionName}] - "
|
If User.IncludedInCollection Then _MainMessage = $"[{User.CollectionName}] - "
|
||||||
_MainMessage &= $"[{User.Site}] - [{User.Name}]. {Msg}: {Path.Path}."
|
_MainMessage &= $"[{User.Site}] - [{User.Name}]. {Msg}: {Path.Path}."
|
||||||
End Sub
|
End Sub
|
||||||
@@ -2181,18 +2199,20 @@ BlockNullPicture:
|
|||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "IComparable Support"
|
#Region "IComparable Support"
|
||||||
Friend Overridable Function CompareTo(ByVal Other As UserDataBase) As Integer Implements IComparable(Of UserDataBase).CompareTo
|
Friend Overridable Overloads Function CompareTo(ByVal Other As UserDataBase) As Integer Implements IComparable(Of UserDataBase).CompareTo
|
||||||
If IsCollection Then
|
If TypeOf Other Is UserDataBind Then
|
||||||
|
Return 1
|
||||||
|
ElseIf IsCollection Then
|
||||||
Return Name.CompareTo(Other.Name)
|
Return Name.CompareTo(Other.Name)
|
||||||
Else
|
Else
|
||||||
Return FriendlyName.IfNullOrEmpty(Name).StringTrim.CompareTo(Other.FriendlyName.IfNullOrEmpty(Other.Name).StringTrim)
|
Return FriendlyName.IfNullOrEmpty(Name).StringTrim.CompareTo(Other.FriendlyName.IfNullOrEmpty(Other.Name).StringTrim)
|
||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
Friend Overridable Function CompareTo(ByVal Obj As Object) As Integer Implements IComparable.CompareTo
|
Friend Overridable Overloads Function CompareTo(ByVal Obj As Object) As Integer Implements IComparable.CompareTo
|
||||||
If Not Obj Is Nothing AndAlso TypeOf Obj Is UserDataBase Then
|
If Not Obj Is Nothing AndAlso TypeOf Obj Is UserDataBase Then
|
||||||
Return CompareTo(DirectCast(Obj, UserDataBase))
|
Return CompareTo(DirectCast(Obj, UserDataBase))
|
||||||
Else
|
Else
|
||||||
Return False
|
Return 0
|
||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
@@ -2200,7 +2220,7 @@ BlockNullPicture:
|
|||||||
Friend Overridable Overloads Function Equals(ByVal Other As UserDataBase) As Boolean Implements IEquatable(Of UserDataBase).Equals
|
Friend Overridable Overloads Function Equals(ByVal Other As UserDataBase) As Boolean Implements IEquatable(Of UserDataBase).Equals
|
||||||
Return LVIKey = Other.LVIKey And IsSavedPosts = Other.IsSavedPosts
|
Return LVIKey = Other.LVIKey And IsSavedPosts = Other.IsSavedPosts
|
||||||
End Function
|
End Function
|
||||||
Public Overrides Function Equals(ByVal Obj As Object) As Boolean
|
Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean
|
||||||
If Not Obj Is Nothing AndAlso TypeOf Obj Is UserDataBase Then
|
If Not Obj Is Nothing AndAlso TypeOf Obj Is UserDataBase Then
|
||||||
Return Equals(DirectCast(Obj, UserDataBase))
|
Return Equals(DirectCast(Obj, UserDataBase))
|
||||||
Else
|
Else
|
||||||
|
|||||||
@@ -107,7 +107,23 @@ Namespace API.Facebook
|
|||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "Initializer"
|
||||||
|
Friend Sub New()
|
||||||
|
_ResponserAutoUpdateCookies = True
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
#Region "Download functions"
|
#Region "Download functions"
|
||||||
|
Private Class TokensException : Inherits Plugin.ExitException
|
||||||
|
Friend ReadOnly Property BasicTokens As Boolean
|
||||||
|
Public Sub New(ByVal Message As String, ByVal _BasicTokens As Boolean)
|
||||||
|
MyBase.New(Message)
|
||||||
|
BasicTokens = _BasicTokens
|
||||||
|
End Sub
|
||||||
|
Friend Shared Sub SendToLog(ByVal Source As UserData, ByVal ex As TokensException, ByVal f As String)
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, New ErrorsDescriberException($"{Source.ToStringForLog()} ({f}): {ex.Message}",,, ex) With {
|
||||||
|
.SendToLogOnlyMessage = True, .ReplaceMainMessage = True})
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
Private Token_dtsg As String = String.Empty
|
Private Token_dtsg As String = String.Empty
|
||||||
Private Token_lsd As String = String.Empty
|
Private Token_lsd As String = String.Empty
|
||||||
Private Token_Photosby As String = String.Empty
|
Private Token_Photosby As String = String.Empty
|
||||||
@@ -149,7 +165,7 @@ Namespace API.Facebook
|
|||||||
Dim pid As PostKV
|
Dim pid As PostKV
|
||||||
|
|
||||||
ValidateBaseTokens()
|
ValidateBaseTokens()
|
||||||
If Token_Photosby.IsEmptyString Then Throw New ArgumentNullException("Token_Photosby", "Unable to obtain token")
|
If Token_Photosby.IsEmptyString Then Throw New TokensException("Unable to obtain token 'Token_Photosby'", False)
|
||||||
|
|
||||||
URL = String.Format(Graphql_UrlPattern, Token_lsd, DocID_Photo, Header_fb_fr_name_Photo,
|
URL = String.Format(Graphql_UrlPattern, Token_lsd, DocID_Photo, Header_fb_fr_name_Photo,
|
||||||
SymbolsConverter.ASCII.EncodeSymbolsOnly(Token_dtsg),
|
SymbolsConverter.ASCII.EncodeSymbolsOnly(Token_dtsg),
|
||||||
@@ -199,6 +215,8 @@ Namespace API.Facebook
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
If newPostsDetected And Not nextCursor.IsEmptyString Then DownloadData_Photo(nextCursor, Token)
|
If newPostsDetected And Not nextCursor.IsEmptyString Then DownloadData_Photo(nextCursor, Token)
|
||||||
|
Catch tex As TokensException When Not tex.BasicTokens
|
||||||
|
TokensException.SendToLog(Me, tex, "data (photo)")
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ProcessException(ex, Token, $"data (photo) downloading error [{URL}]",, Responser)
|
ProcessException(ex, Token, $"data (photo) downloading error [{URL}]",, Responser)
|
||||||
End Try
|
End Try
|
||||||
@@ -212,7 +230,7 @@ Namespace API.Facebook
|
|||||||
Dim pid As PostKV
|
Dim pid As PostKV
|
||||||
|
|
||||||
If VideoPageID.IsEmptyString Then GetVideoPageID(Token)
|
If VideoPageID.IsEmptyString Then GetVideoPageID(Token)
|
||||||
If VideoPageID.IsEmptyString Then Throw New ArgumentNullException("VideoPageID", "Unable to obtain VideoPageID")
|
If VideoPageID.IsEmptyString Then Throw New TokensException("Unable to obtain 'VideoPageID'", False)
|
||||||
ValidateBaseTokens()
|
ValidateBaseTokens()
|
||||||
|
|
||||||
URL = String.Format(Graphql_UrlPattern, Token_lsd, DocID_Video, Header_fb_fr_name_Video,
|
URL = String.Format(Graphql_UrlPattern, Token_lsd, DocID_Video, Header_fb_fr_name_Video,
|
||||||
@@ -252,6 +270,8 @@ Namespace API.Facebook
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
If newPostsDetected And Not nextCursor.IsEmptyString Then DownloadData_Video(nextCursor, Token)
|
If newPostsDetected And Not nextCursor.IsEmptyString Then DownloadData_Video(nextCursor, Token)
|
||||||
|
Catch tex As TokensException When Not tex.BasicTokens
|
||||||
|
TokensException.SendToLog(Me, tex, "data (video)")
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ProcessException(ex, Token, $"data (video) downloading error [{URL}]",, Responser)
|
ProcessException(ex, Token, $"data (video) downloading error [{URL}]",, Responser)
|
||||||
End Try
|
End Try
|
||||||
@@ -266,7 +286,7 @@ Namespace API.Facebook
|
|||||||
Dim postDate As Date?
|
Dim postDate As Date?
|
||||||
|
|
||||||
ValidateBaseTokens()
|
ValidateBaseTokens()
|
||||||
If StoryBucket.IsEmptyString Then Throw New ArgumentNullException("StoryBucket", "Unable to obtain StoryBucket")
|
If StoryBucket.IsEmptyString Then Throw New TokensException("Unable to obtain 'StoryBucket'", False)
|
||||||
|
|
||||||
URL = String.Format(Graphql_UrlPattern, Token_lsd, DocID_Stories, Header_fb_fr_name_Stories,
|
URL = String.Format(Graphql_UrlPattern, Token_lsd, DocID_Stories, Header_fb_fr_name_Stories,
|
||||||
SymbolsConverter.ASCII.EncodeSymbolsOnly(Token_dtsg),
|
SymbolsConverter.ASCII.EncodeSymbolsOnly(Token_dtsg),
|
||||||
@@ -320,6 +340,8 @@ Namespace API.Facebook
|
|||||||
End If
|
End If
|
||||||
End Using
|
End Using
|
||||||
End If
|
End If
|
||||||
|
Catch tex As TokensException When Not tex.BasicTokens
|
||||||
|
TokensException.SendToLog(Me, tex, "data (stories)")
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ProcessException(ex, Token, $"data (stories) downloading error [{URL}]",, Responser)
|
ProcessException(ex, Token, $"data (stories) downloading error [{URL}]",, Responser)
|
||||||
End Try
|
End Try
|
||||||
@@ -467,8 +489,10 @@ Namespace API.Facebook
|
|||||||
#Region "ValidateBaseTokens, GetVideoPageID, GetUserTokens"
|
#Region "ValidateBaseTokens, GetVideoPageID, GetUserTokens"
|
||||||
''' <exception cref="ArgumentNullException"></exception>
|
''' <exception cref="ArgumentNullException"></exception>
|
||||||
Private Sub ValidateBaseTokens()
|
Private Sub ValidateBaseTokens()
|
||||||
If Token_dtsg.IsEmptyString Then Throw New ArgumentNullException("Token_dtsg", "Unable to obtain token")
|
Dim tokens$ = String.Empty
|
||||||
If Token_lsd.IsEmptyString Then Throw New ArgumentNullException("Token_lsd", "Unable to obtain token")
|
If Token_dtsg.IsEmptyString Then tokens.StringAppend("Token_dtsg")
|
||||||
|
If Token_lsd.IsEmptyString Then tokens.StringAppend("Token_lsd")
|
||||||
|
If Not tokens.IsEmptyString Then Throw New TokensException($"Unable to obtain token(s) ({tokens}){vbCr}Your credentials may have expired.", True)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub GetVideoPageID(ByVal Token As CancellationToken)
|
Private Sub GetVideoPageID(ByVal Token As CancellationToken)
|
||||||
Dim URL$ = $"{GetProfileUrl()}\videos"
|
Dim URL$ = $"{GetProfileUrl()}\videos"
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ Namespace API.Instagram
|
|||||||
Friend Const InstagramSite As String = "Instagram"
|
Friend Const InstagramSite As String = "Instagram"
|
||||||
Friend Const InstagramSiteKey As String = "AndyProgram_Instagram"
|
Friend Const InstagramSiteKey As String = "AndyProgram_Instagram"
|
||||||
Friend ReadOnly FilesPattern As RParams = RParams.DMS(".+?([^/\?]+?\.[\w\d]{3,4})(?=(\?|\Z))", 1, EDP.ReturnValue)
|
Friend ReadOnly FilesPattern As RParams = RParams.DMS(".+?([^/\?]+?\.[\w\d]{3,4})(?=(\?|\Z))", 1, EDP.ReturnValue)
|
||||||
|
Friend ReadOnly ObtainMedia_SizeFuncPic_RegexP As RParams = RParams.DMS("_p(\d+)x(\d+)", 1, EDP.ReturnValue)
|
||||||
|
Friend ReadOnly ObtainMedia_SizeFuncPic_RegexS As RParams = RParams.DMS("_s(\d+)x(\d+)", 1, EDP.ReturnValue)
|
||||||
|
Friend Const PageTokenRegexPatternDefault As String = "\[\],{""token"":""(.*?)""},\d+\]"
|
||||||
Friend Sub UpdateResponser(ByVal Source As IResponse, ByRef Destination As Responser)
|
Friend Sub UpdateResponser(ByVal Source As IResponse, ByRef Destination As Responser)
|
||||||
Const r_wwwClaimName$ = "x-ig-set-www-claim"
|
Const r_wwwClaimName$ = "x-ig-set-www-claim"
|
||||||
Const r_tokenName$ = SiteSettings.Header_CSRF_TOKEN_COOKIE
|
Const r_tokenName$ = SiteSettings.Header_CSRF_TOKEN_COOKIE
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ Namespace API.Instagram
|
|||||||
Friend Class EditorExchangeOptions
|
Friend Class EditorExchangeOptions
|
||||||
<PSetting(Caption:="Get timeline", ToolTip:="Download user timeline")>
|
<PSetting(Caption:="Get timeline", ToolTip:="Download user timeline")>
|
||||||
Friend Property GetTimeline As Boolean
|
Friend Property GetTimeline As Boolean
|
||||||
|
<PSetting(Caption:="Get reels", ToolTip:="Download user reels")>
|
||||||
|
Friend Property GetReels As Boolean
|
||||||
<PSetting(Caption:="Get stories", ToolTip:="Download user stories (pinned)")>
|
<PSetting(Caption:="Get stories", ToolTip:="Download user stories (pinned)")>
|
||||||
Friend Property GetStories As Boolean
|
Friend Property GetStories As Boolean
|
||||||
<PSetting(Caption:="Get stories: user", ToolTip:="Download user stories")>
|
<PSetting(Caption:="Get stories: user", ToolTip:="Download user stories")>
|
||||||
@@ -20,6 +22,7 @@ Namespace API.Instagram
|
|||||||
Friend Sub New(ByVal u As UserData)
|
Friend Sub New(ByVal u As UserData)
|
||||||
With u
|
With u
|
||||||
GetTimeline = .GetTimeline
|
GetTimeline = .GetTimeline
|
||||||
|
GetReels = .GetReels
|
||||||
GetStories = .GetStories
|
GetStories = .GetStories
|
||||||
GetStoriesUser = .GetStoriesUser
|
GetStoriesUser = .GetStoriesUser
|
||||||
GetTagged = .GetTaggedData
|
GetTagged = .GetTaggedData
|
||||||
@@ -28,6 +31,7 @@ Namespace API.Instagram
|
|||||||
Friend Sub New(ByVal s As SiteSettings)
|
Friend Sub New(ByVal s As SiteSettings)
|
||||||
With s
|
With s
|
||||||
GetTimeline = CBool(.GetTimeline.Value)
|
GetTimeline = CBool(.GetTimeline.Value)
|
||||||
|
GetReels = CBool(.GetReels.Value)
|
||||||
GetStories = CBool(.GetStories.Value)
|
GetStories = CBool(.GetStories.Value)
|
||||||
GetStoriesUser = CBool(.GetStoriesUser.Value)
|
GetStoriesUser = CBool(.GetStoriesUser.Value)
|
||||||
GetTagged = CBool(.GetTagged.Value)
|
GetTagged = CBool(.GetTagged.Value)
|
||||||
|
|||||||
@@ -63,13 +63,14 @@ Namespace API.Instagram
|
|||||||
Friend Const Header_Browser As String = "Sec-Ch-Ua"
|
Friend Const Header_Browser As String = "Sec-Ch-Ua"
|
||||||
Friend Const Header_BrowserExt As String = "Sec-Ch-Ua-Full-Version-List"
|
Friend Const Header_BrowserExt As String = "Sec-Ch-Ua-Full-Version-List"
|
||||||
Friend Const Header_Platform As String = "Sec-Ch-Ua-Platform-Version"
|
Friend Const Header_Platform As String = "Sec-Ch-Ua-Platform-Version"
|
||||||
<PropertyOption(ControlText:="x-csrftoken", IsAuth:=True, AllowNull:=False), ControlNumber(2), PClonable(Clone:=False)>
|
<PropertyOption(ControlText:="x-csrftoken", ControlToolTip:="Can be automatically extracted from cookies", IsAuth:=True, AllowNull:=True), ControlNumber(2), PClonable(Clone:=False)>
|
||||||
Friend ReadOnly Property HH_CSRF_TOKEN As PropertyValue
|
Friend ReadOnly Property HH_CSRF_TOKEN As PropertyValue
|
||||||
<PropertyOption(ControlText:="x-ig-app-id", IsAuth:=True, AllowNull:=False), ControlNumber(3), PClonable(Clone:=False)>
|
<PropertyOption(ControlText:="x-ig-app-id", IsAuth:=True, AllowNull:=False), ControlNumber(3), PClonable(Clone:=False)>
|
||||||
Friend Property HH_IG_APP_ID As PropertyValue
|
Friend Property HH_IG_APP_ID As PropertyValue
|
||||||
<PropertyOption(ControlText:="x-asbd-id", IsAuth:=True, AllowNull:=True), ControlNumber(4), PClonable(Clone:=False)>
|
<PropertyOption(ControlText:="x-asbd-id", IsAuth:=True, AllowNull:=True), ControlNumber(4), PClonable(Clone:=False)>
|
||||||
Friend Property HH_ASBD_ID As PropertyValue
|
Friend Property HH_ASBD_ID As PropertyValue
|
||||||
<PropertyOption(ControlText:="x-ig-www-claim", IsAuth:=True, AllowNull:=True), ControlNumber(5), PClonable(Clone:=False)>
|
'PropertyOption(ControlText:="x-ig-www-claim", IsAuth:=True, AllowNull:=True)
|
||||||
|
<ControlNumber(5), PClonable(Clone:=False)>
|
||||||
Friend Property HH_IG_WWW_CLAIM As PropertyValue
|
Friend Property HH_IG_WWW_CLAIM As PropertyValue
|
||||||
<PropertyOption(ControlText:="sec-ch-ua", IsAuth:=True, AllowNull:=True), ControlNumber(6), PClonable>
|
<PropertyOption(ControlText:="sec-ch-ua", IsAuth:=True, AllowNull:=True), ControlNumber(6), PClonable>
|
||||||
Private Property HH_BROWSER As PropertyValue
|
Private Property HH_BROWSER As PropertyValue
|
||||||
@@ -121,11 +122,13 @@ Namespace API.Instagram
|
|||||||
Private ReadOnly Property SleepTimerOnPostsLimitProvider As IFormatProvider
|
Private ReadOnly Property SleepTimerOnPostsLimitProvider As IFormatProvider
|
||||||
<PropertyOption(ControlText:="Get timeline", ControlToolTip:="Default value for new users"), PXML, ControlNumber(23), PClonable>
|
<PropertyOption(ControlText:="Get timeline", ControlToolTip:="Default value for new users"), PXML, ControlNumber(23), PClonable>
|
||||||
Friend ReadOnly Property GetTimeline As PropertyValue
|
Friend ReadOnly Property GetTimeline As PropertyValue
|
||||||
<PropertyOption(ControlText:="Get stories", ControlToolTip:="Default value for new users"), PXML, ControlNumber(24), PClonable>
|
<PropertyOption(ControlText:="Get reels", ControlToolTip:="Default value for new users"), PXML, ControlNumber(24), PClonable>
|
||||||
|
Friend ReadOnly Property GetReels As PropertyValue
|
||||||
|
<PropertyOption(ControlText:="Get stories", ControlToolTip:="Default value for new users"), PXML, ControlNumber(25), PClonable>
|
||||||
Friend ReadOnly Property GetStories As PropertyValue
|
Friend ReadOnly Property GetStories As PropertyValue
|
||||||
<PropertyOption(ControlText:="Get stories: user", ControlToolTip:="Default value for new users"), PXML, ControlNumber(25), PClonable>
|
<PropertyOption(ControlText:="Get stories: user", ControlToolTip:="Default value for new users"), PXML, ControlNumber(26), PClonable>
|
||||||
Friend ReadOnly Property GetStoriesUser As PropertyValue
|
Friend ReadOnly Property GetStoriesUser As PropertyValue
|
||||||
<PropertyOption(ControlText:="Get tagged photos", ControlToolTip:="Default value for new users"), PXML, ControlNumber(26), PClonable>
|
<PropertyOption(ControlText:="Get tagged photos", ControlToolTip:="Default value for new users"), PXML, ControlNumber(27), PClonable>
|
||||||
Friend ReadOnly Property GetTagged As PropertyValue
|
Friend ReadOnly Property GetTagged As PropertyValue
|
||||||
<PropertyOption(ControlText:="Tagged notify limit",
|
<PropertyOption(ControlText:="Tagged notify limit",
|
||||||
ControlToolTip:="If the number of tagged posts exceeds this number you will be notified." & vbCr &
|
ControlToolTip:="If the number of tagged posts exceeds this number you will be notified." & vbCr &
|
||||||
@@ -137,11 +140,13 @@ Namespace API.Instagram
|
|||||||
#Region "Download ready"
|
#Region "Download ready"
|
||||||
<PropertyOption(ControlText:="Download timeline", ControlToolTip:="Download timeline"), PXML, ControlNumber(10), PClonable>
|
<PropertyOption(ControlText:="Download timeline", ControlToolTip:="Download timeline"), PXML, ControlNumber(10), PClonable>
|
||||||
Friend ReadOnly Property DownloadTimeline As PropertyValue
|
Friend ReadOnly Property DownloadTimeline As PropertyValue
|
||||||
<PropertyOption(ControlText:="Download stories", ControlToolTip:="Download stories"), PXML, ControlNumber(11), PClonable>
|
<PropertyOption(ControlText:="Download reels", ControlToolTip:="Download reels"), PXML, ControlNumber(11), PClonable>
|
||||||
|
Friend ReadOnly Property DownloadReels As PropertyValue
|
||||||
|
<PropertyOption(ControlText:="Download stories", ControlToolTip:="Download stories"), PXML, ControlNumber(12), PClonable>
|
||||||
Friend ReadOnly Property DownloadStories As PropertyValue
|
Friend ReadOnly Property DownloadStories As PropertyValue
|
||||||
<PropertyOption(ControlText:="Download stories: user", ControlToolTip:="Download stories (user)"), PXML, ControlNumber(12), PClonable>
|
<PropertyOption(ControlText:="Download stories: user", ControlToolTip:="Download stories (user)"), PXML, ControlNumber(13), PClonable>
|
||||||
Friend ReadOnly Property DownloadStoriesUser As PropertyValue
|
Friend ReadOnly Property DownloadStoriesUser As PropertyValue
|
||||||
<PropertyOption(ControlText:="Download tagged", ControlToolTip:="Download tagged posts"), PXML, ControlNumber(13), PClonable>
|
<PropertyOption(ControlText:="Download tagged", ControlToolTip:="Download tagged posts"), PXML, ControlNumber(14), PClonable>
|
||||||
Friend ReadOnly Property DownloadTagged As PropertyValue
|
Friend ReadOnly Property DownloadTagged As PropertyValue
|
||||||
#End Region
|
#End Region
|
||||||
#Region "429 bypass"
|
#Region "429 bypass"
|
||||||
@@ -244,9 +249,10 @@ Namespace API.Instagram
|
|||||||
HH_USER_AGENT = New PropertyValue(useragent, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_USER_AGENT), v))
|
HH_USER_AGENT = New PropertyValue(useragent, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_USER_AGENT), v))
|
||||||
|
|
||||||
DownloadTimeline = New PropertyValue(True)
|
DownloadTimeline = New PropertyValue(True)
|
||||||
|
DownloadReels = New PropertyValue(False)
|
||||||
DownloadStories = New PropertyValue(True)
|
DownloadStories = New PropertyValue(True)
|
||||||
DownloadStoriesUser = New PropertyValue(True)
|
DownloadStoriesUser = New PropertyValue(True)
|
||||||
DownloadTagged = New PropertyValue(True)
|
DownloadTagged = New PropertyValue(False)
|
||||||
|
|
||||||
RequestsWaitTimer = New PropertyValue(1000)
|
RequestsWaitTimer = New PropertyValue(1000)
|
||||||
RequestsWaitTimerProvider = New TimersChecker(100)
|
RequestsWaitTimerProvider = New TimersChecker(100)
|
||||||
@@ -256,6 +262,7 @@ Namespace API.Instagram
|
|||||||
SleepTimerOnPostsLimitProvider = New TimersChecker(10000)
|
SleepTimerOnPostsLimitProvider = New TimersChecker(10000)
|
||||||
|
|
||||||
GetTimeline = New PropertyValue(True)
|
GetTimeline = New PropertyValue(True)
|
||||||
|
GetReels = New PropertyValue(False)
|
||||||
GetStories = New PropertyValue(False)
|
GetStories = New PropertyValue(False)
|
||||||
GetStoriesUser = New PropertyValue(False)
|
GetStoriesUser = New PropertyValue(False)
|
||||||
GetTagged = New PropertyValue(False)
|
GetTagged = New PropertyValue(False)
|
||||||
@@ -270,7 +277,7 @@ Namespace API.Instagram
|
|||||||
|
|
||||||
_AllowUserAgentUpdate = False
|
_AllowUserAgentUpdate = False
|
||||||
UrlPatternUser = "https://www.instagram.com/{0}/"
|
UrlPatternUser = "https://www.instagram.com/{0}/"
|
||||||
UserRegex = RParams.DMS("[htps:/]{7,8}.*?instagram.com/([^/]+)", 1)
|
UserRegex = RParams.DMS(String.Format(UserRegexDefaultPattern, "instagram.com/"), 1)
|
||||||
ImageVideoContains = "instagram.com"
|
ImageVideoContains = "instagram.com"
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
@@ -346,6 +353,50 @@ Namespace API.Instagram
|
|||||||
SkipUntilNextSession = False
|
SkipUntilNextSession = False
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "Settings"
|
||||||
|
Private ____HH_CSRF_TOKEN As String = String.Empty
|
||||||
|
Private ____HH_IG_APP_ID As String = String.Empty
|
||||||
|
Private ____HH_ASBD_ID As String = String.Empty
|
||||||
|
Private ____HH_BROWSER As String = String.Empty
|
||||||
|
Private ____HH_BROWSER_EXT As String = String.Empty
|
||||||
|
Private ____HH_PLATFORM As String = String.Empty
|
||||||
|
Private ____HH_USER_AGENT As String = String.Empty
|
||||||
|
Private ____Cookies As CookieKeeper = Nothing
|
||||||
|
Friend Overrides Sub BeginEdit()
|
||||||
|
____HH_CSRF_TOKEN = AConvert(Of String)(HH_CSRF_TOKEN.Value, String.Empty)
|
||||||
|
____HH_IG_APP_ID = AConvert(Of String)(HH_IG_APP_ID.Value, String.Empty)
|
||||||
|
____HH_ASBD_ID = AConvert(Of String)(HH_ASBD_ID.Value, String.Empty)
|
||||||
|
____HH_BROWSER = AConvert(Of String)(HH_BROWSER.Value, String.Empty)
|
||||||
|
____HH_BROWSER_EXT = AConvert(Of String)(HH_BROWSER_EXT.Value, String.Empty)
|
||||||
|
____HH_PLATFORM = AConvert(Of String)(HH_PLATFORM.Value, String.Empty)
|
||||||
|
____HH_USER_AGENT = AConvert(Of String)(HH_USER_AGENT.Value, String.Empty)
|
||||||
|
____Cookies = Responser.Cookies.Copy
|
||||||
|
MyBase.BeginEdit()
|
||||||
|
End Sub
|
||||||
|
Friend Overrides Sub Update()
|
||||||
|
If _SiteEditorFormOpened Then
|
||||||
|
Dim vals() = {New With {.ValueOld = ____HH_CSRF_TOKEN, .ValueNew = AConvert(Of String)(HH_CSRF_TOKEN.Value, String.Empty).ToString},
|
||||||
|
New With {.ValueOld = ____HH_IG_APP_ID, .ValueNew = AConvert(Of String)(HH_IG_APP_ID.Value, String.Empty).ToString},
|
||||||
|
New With {.ValueOld = ____HH_ASBD_ID, .ValueNew = AConvert(Of String)(HH_ASBD_ID.Value, String.Empty).ToString},
|
||||||
|
New With {.ValueOld = ____HH_BROWSER, .ValueNew = AConvert(Of String)(HH_BROWSER.Value, String.Empty).ToString},
|
||||||
|
New With {.ValueOld = ____HH_BROWSER_EXT, .ValueNew = AConvert(Of String)(HH_BROWSER_EXT.Value, String.Empty).ToString},
|
||||||
|
New With {.ValueOld = ____HH_PLATFORM, .ValueNew = AConvert(Of String)(HH_PLATFORM.Value, String.Empty).ToString},
|
||||||
|
New With {.ValueOld = ____HH_USER_AGENT, .ValueNew = AConvert(Of String)(HH_USER_AGENT.Value, String.Empty).ToString}
|
||||||
|
}
|
||||||
|
If vals.Any(Function(v) Not v.ValueOld = v.ValueNew) OrElse
|
||||||
|
Not Responser.Cookies.ListEquals(____Cookies) Then HH_IG_WWW_CLAIM.Value = 0
|
||||||
|
If Responser.CookiesExists Then
|
||||||
|
Dim csrf$ = If(Responser.Cookies.FirstOrDefault(Function(c) c.Name.StringToLower = Header_CSRF_TOKEN_COOKIE)?.Value, String.Empty)
|
||||||
|
If Not csrf.IsEmptyString Then HH_CSRF_TOKEN.Value = csrf
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
MyBase.Update()
|
||||||
|
End Sub
|
||||||
|
Friend Overrides Sub EndEdit()
|
||||||
|
If _SiteEditorFormOpened Then ____Cookies.DisposeIfReady(False) : ____Cookies = Nothing
|
||||||
|
MyBase.EndEdit()
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
#Region "UserOptions, GetUserUrl, GetUserPostUrl"
|
#Region "UserOptions, GetUserUrl, GetUserPostUrl"
|
||||||
Friend Overrides Sub UserOptions(ByRef Options As Object, ByVal OpenForm As Boolean)
|
Friend Overrides Sub UserOptions(ByRef Options As Object, ByVal OpenForm As Boolean)
|
||||||
If Options Is Nothing OrElse Not TypeOf Options Is EditorExchangeOptions Then Options = New EditorExchangeOptions(Me)
|
If Options Is Nothing OrElse Not TypeOf Options Is EditorExchangeOptions Then Options = New EditorExchangeOptions(Me)
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ Imports PersonalUtilities.Functions.XML.Base
|
|||||||
Imports PersonalUtilities.Functions.Messaging
|
Imports PersonalUtilities.Functions.Messaging
|
||||||
Imports PersonalUtilities.Functions.RegularExpressions
|
Imports PersonalUtilities.Functions.RegularExpressions
|
||||||
Imports PersonalUtilities.Tools.Web.Clients
|
Imports PersonalUtilities.Tools.Web.Clients
|
||||||
|
Imports PersonalUtilities.Tools.Web.Clients.Base
|
||||||
|
Imports PersonalUtilities.Tools.Web.Documents
|
||||||
Imports PersonalUtilities.Tools.Web.Documents.JSON
|
Imports PersonalUtilities.Tools.Web.Documents.JSON
|
||||||
Imports UTypes = SCrawler.API.Base.UserMedia.Types
|
Imports UTypes = SCrawler.API.Base.UserMedia.Types
|
||||||
Imports UStates = SCrawler.API.Base.UserMedia.States
|
Imports UStates = SCrawler.API.Base.UserMedia.States
|
||||||
@@ -24,6 +26,7 @@ Namespace API.Instagram
|
|||||||
Private Const Name_LastCursor As String = "LastCursor"
|
Private Const Name_LastCursor As String = "LastCursor"
|
||||||
Private Const Name_FirstLoadingDone As String = "FirstLoadingDone"
|
Private Const Name_FirstLoadingDone As String = "FirstLoadingDone"
|
||||||
Private Const Name_GetTimeline As String = "GetTimeline"
|
Private Const Name_GetTimeline As String = "GetTimeline"
|
||||||
|
Private Const Name_GetReels As String = "GetReels"
|
||||||
Private Const Name_GetStories As String = "GetStories"
|
Private Const Name_GetStories As String = "GetStories"
|
||||||
Private Const Name_GetStoriesUser As String = "GetStoriesUser"
|
Private Const Name_GetStoriesUser As String = "GetStoriesUser"
|
||||||
Private Const Name_GetTagged As String = "GetTaggedData"
|
Private Const Name_GetTagged As String = "GetTaggedData"
|
||||||
@@ -66,6 +69,7 @@ Namespace API.Instagram
|
|||||||
Return New EContainer("Post", ID, {New EAttribute(Name_Section, CInt(Section)), New EAttribute(Name_Code, Code)})
|
Return New EContainer("Post", ID, {New EAttribute(Name_Section, CInt(Section)), New EAttribute(Name_Code, Code)})
|
||||||
End Function
|
End Function
|
||||||
End Structure
|
End Structure
|
||||||
|
Friend Const Header_FB_LSD As String = "x-fb-lsd"
|
||||||
Private ReadOnly Property MySiteSettings As SiteSettings
|
Private ReadOnly Property MySiteSettings As SiteSettings
|
||||||
Get
|
Get
|
||||||
Return DirectCast(HOST.Source, SiteSettings)
|
Return DirectCast(HOST.Source, SiteSettings)
|
||||||
@@ -76,6 +80,7 @@ Namespace API.Instagram
|
|||||||
Private LastCursor As String = String.Empty
|
Private LastCursor As String = String.Empty
|
||||||
Private FirstLoadingDone As Boolean = False
|
Private FirstLoadingDone As Boolean = False
|
||||||
Friend Property GetTimeline As Boolean = True
|
Friend Property GetTimeline As Boolean = True
|
||||||
|
Friend Property GetReels As Boolean = False
|
||||||
Friend Property GetStories As Boolean
|
Friend Property GetStories As Boolean
|
||||||
Friend Property GetStoriesUser As Boolean
|
Friend Property GetStoriesUser As Boolean
|
||||||
Friend Property GetTaggedData As Boolean
|
Friend Property GetTaggedData As Boolean
|
||||||
@@ -94,6 +99,7 @@ Namespace API.Instagram
|
|||||||
LastCursor = .Value(Name_LastCursor)
|
LastCursor = .Value(Name_LastCursor)
|
||||||
FirstLoadingDone = .Value(Name_FirstLoadingDone).FromXML(Of Boolean)(False)
|
FirstLoadingDone = .Value(Name_FirstLoadingDone).FromXML(Of Boolean)(False)
|
||||||
GetTimeline = .Value(Name_GetTimeline).FromXML(Of Boolean)(CBool(MySiteSettings.GetTimeline.Value))
|
GetTimeline = .Value(Name_GetTimeline).FromXML(Of Boolean)(CBool(MySiteSettings.GetTimeline.Value))
|
||||||
|
GetReels = .Value(Name_GetReels).FromXML(Of Boolean)(MySiteSettings.GetReels.Value)
|
||||||
GetStories = .Value(Name_GetStories).FromXML(Of Boolean)(CBool(MySiteSettings.GetStories.Value))
|
GetStories = .Value(Name_GetStories).FromXML(Of Boolean)(CBool(MySiteSettings.GetStories.Value))
|
||||||
GetStoriesUser = .Value(Name_GetStoriesUser).FromXML(Of Boolean)(MySiteSettings.GetStoriesUser.Value)
|
GetStoriesUser = .Value(Name_GetStoriesUser).FromXML(Of Boolean)(MySiteSettings.GetStoriesUser.Value)
|
||||||
GetTaggedData = .Value(Name_GetTagged).FromXML(Of Boolean)(CBool(MySiteSettings.GetTagged.Value))
|
GetTaggedData = .Value(Name_GetTagged).FromXML(Of Boolean)(CBool(MySiteSettings.GetTagged.Value))
|
||||||
@@ -103,6 +109,7 @@ Namespace API.Instagram
|
|||||||
.Add(Name_LastCursor, LastCursor)
|
.Add(Name_LastCursor, LastCursor)
|
||||||
.Add(Name_FirstLoadingDone, FirstLoadingDone.BoolToInteger)
|
.Add(Name_FirstLoadingDone, FirstLoadingDone.BoolToInteger)
|
||||||
.Add(Name_GetTimeline, GetTimeline.BoolToInteger)
|
.Add(Name_GetTimeline, GetTimeline.BoolToInteger)
|
||||||
|
.Add(Name_GetReels, GetReels.BoolToInteger)
|
||||||
.Add(Name_GetStories, GetStories.BoolToInteger)
|
.Add(Name_GetStories, GetStories.BoolToInteger)
|
||||||
.Add(Name_GetStoriesUser, GetStoriesUser.BoolToInteger)
|
.Add(Name_GetStoriesUser, GetStoriesUser.BoolToInteger)
|
||||||
.Add(Name_GetTagged, GetTaggedData.BoolToInteger)
|
.Add(Name_GetTagged, GetTaggedData.BoolToInteger)
|
||||||
@@ -120,6 +127,7 @@ Namespace API.Instagram
|
|||||||
If Not Obj Is Nothing AndAlso TypeOf Obj Is EditorExchangeOptions Then
|
If Not Obj Is Nothing AndAlso TypeOf Obj Is EditorExchangeOptions Then
|
||||||
With DirectCast(Obj, EditorExchangeOptions)
|
With DirectCast(Obj, EditorExchangeOptions)
|
||||||
GetTimeline = .GetTimeline
|
GetTimeline = .GetTimeline
|
||||||
|
GetReels = .GetReels
|
||||||
GetStories = .GetStories
|
GetStories = .GetStories
|
||||||
GetStoriesUser = .GetStoriesUser
|
GetStoriesUser = .GetStoriesUser
|
||||||
GetTaggedData = .GetTagged
|
GetTaggedData = .GetTagged
|
||||||
@@ -131,17 +139,20 @@ Namespace API.Instagram
|
|||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
PostsKVIDs = New List(Of PostKV)
|
PostsKVIDs = New List(Of PostKV)
|
||||||
PostsToReparse = New List(Of PostKV)
|
PostsToReparse = New List(Of PostKV)
|
||||||
|
_ResponserAutoUpdateCookies = True
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Download data"
|
#Region "Download data"
|
||||||
Private E560Thrown As Boolean = False
|
Private E560Thrown As Boolean = False
|
||||||
|
Friend Err5xx As Integer = -1
|
||||||
Private Class ExitException : Inherits Exception
|
Private Class ExitException : Inherits Exception
|
||||||
|
Friend Property Is560 As Boolean = False
|
||||||
Friend Shared Sub Throw560(ByRef Source As UserData)
|
Friend Shared Sub Throw560(ByRef Source As UserData)
|
||||||
If Not Source.E560Thrown Then
|
If Not Source.E560Thrown Then
|
||||||
MyMainLOG = $"{Source.ToStringForLog}: (560) Download skipped until next session"
|
MyMainLOG = $"{Source.ToStringForLog}: ({IIf(Source.Err5xx > 0, Source.Err5xx, 560)}) Download skipped until next session"
|
||||||
Source.E560Thrown = True
|
Source.E560Thrown = True
|
||||||
End If
|
End If
|
||||||
Throw New ExitException
|
Throw New ExitException With {.Is560 = True}
|
||||||
End Sub
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
Private ReadOnly Property MyFilePostsKV As SFile
|
Private ReadOnly Property MyFilePostsKV As SFile
|
||||||
@@ -229,6 +240,7 @@ Namespace API.Instagram
|
|||||||
Dim s As Sections = Sections.Timeline
|
Dim s As Sections = Sections.Timeline
|
||||||
Dim errorFound As Boolean = False
|
Dim errorFound As Boolean = False
|
||||||
Try
|
Try
|
||||||
|
Err5xx = -1
|
||||||
_Limit = If(DownloadTopCount, -1)
|
_Limit = If(DownloadTopCount, -1)
|
||||||
_TotalPostsParsed = 0
|
_TotalPostsParsed = 0
|
||||||
LoadSavePostsKV(True)
|
LoadSavePostsKV(True)
|
||||||
@@ -253,6 +265,14 @@ Namespace API.Instagram
|
|||||||
End If
|
End If
|
||||||
If FirstLoadingDone Then LastCursor = String.Empty
|
If FirstLoadingDone Then LastCursor = String.Empty
|
||||||
If Not IsSavedPosts AndAlso MySiteSettings.BaseAuthExists() Then
|
If Not IsSavedPosts AndAlso MySiteSettings.BaseAuthExists() Then
|
||||||
|
If CBool(MySiteSettings.DownloadReels.Value) And GetReels Then
|
||||||
|
s = Sections.Reels
|
||||||
|
DefaultParser_ElemNode = {"node", "media"}
|
||||||
|
DownloadData(String.Empty, s, Token)
|
||||||
|
DefaultParser_ElemNode = Nothing
|
||||||
|
DownloadReels_SetEnvir = False
|
||||||
|
ProgressPre.Done()
|
||||||
|
End If
|
||||||
If CBool(MySiteSettings.DownloadStories.Value) And GetStories Then s = Sections.Stories : DownloadData(String.Empty, s, Token) : ProgressPre.Done()
|
If CBool(MySiteSettings.DownloadStories.Value) And GetStories Then s = Sections.Stories : DownloadData(String.Empty, s, Token) : ProgressPre.Done()
|
||||||
If CBool(MySiteSettings.DownloadStoriesUser.Value) And GetStoriesUser Then s = Sections.UserStories : DownloadData(String.Empty, s, Token) : ProgressPre.Done()
|
If CBool(MySiteSettings.DownloadStoriesUser.Value) And GetStoriesUser Then s = Sections.UserStories : DownloadData(String.Empty, s, Token) : ProgressPre.Done()
|
||||||
If CBool(MySiteSettings.DownloadTagged.Value) And GetTaggedData Then
|
If CBool(MySiteSettings.DownloadTagged.Value) And GetTaggedData Then
|
||||||
@@ -268,6 +288,8 @@ Namespace API.Instagram
|
|||||||
errorFound = True
|
errorFound = True
|
||||||
Throw ex
|
Throw ex
|
||||||
Finally
|
Finally
|
||||||
|
DefaultParser_ElemNode = Nothing
|
||||||
|
DownloadReels_SetEnvir = False
|
||||||
E560Thrown = False
|
E560Thrown = False
|
||||||
UpdateResponser()
|
UpdateResponser()
|
||||||
ValidateExtension()
|
ValidateExtension()
|
||||||
@@ -292,16 +314,16 @@ Namespace API.Instagram
|
|||||||
Try
|
Try
|
||||||
If _DownloadingInProgress AndAlso Not Responser Is Nothing AndAlso Not Responser.Disposed Then
|
If _DownloadingInProgress AndAlso Not Responser Is Nothing AndAlso Not Responser.Disposed Then
|
||||||
_DownloadingInProgress = False
|
_DownloadingInProgress = False
|
||||||
RemoveHandler Responser.ResponseReceived, AddressOf Responser_ResponseReceived
|
Responser_ResponseReceived_RemoveHandler()
|
||||||
Declarations.UpdateResponser(Responser, MySiteSettings.Responser)
|
Declarations.UpdateResponser(Responser, MySiteSettings.Responser)
|
||||||
End If
|
End If
|
||||||
Catch
|
Catch
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Protected Overridable Sub Responser_ResponseReceived(ByVal Sender As Object, ByVal e As EventArguments.WebDataResponse)
|
Protected Overrides Sub Responser_ResponseReceived(ByVal Sender As Object, ByVal e As EventArguments.WebDataResponse)
|
||||||
Declarations.UpdateResponser(e, Responser)
|
Declarations.UpdateResponser(e, Responser)
|
||||||
End Sub
|
End Sub
|
||||||
Protected Enum Sections : Timeline : Tagged : Stories : UserStories : SavedPosts : End Enum
|
Protected Enum Sections : Timeline : Reels : Tagged : Stories : UserStories : SavedPosts : End Enum
|
||||||
Protected Const StoriesFolder As String = "Stories"
|
Protected Const StoriesFolder As String = "Stories"
|
||||||
Private Const TaggedFolder As String = "Tagged"
|
Private Const TaggedFolder As String = "Tagged"
|
||||||
#Region "429 bypass"
|
#Region "429 bypass"
|
||||||
@@ -441,6 +463,7 @@ Namespace API.Instagram
|
|||||||
ReconfigureAwaiter()
|
ReconfigureAwaiter()
|
||||||
|
|
||||||
Try
|
Try
|
||||||
|
Dim r$ = String.Empty
|
||||||
Dim n As EContainer, nn As EContainer
|
Dim n As EContainer, nn As EContainer
|
||||||
Dim HasNextPage As Boolean = False
|
Dim HasNextPage As Boolean = False
|
||||||
Dim EndCursor$ = String.Empty
|
Dim EndCursor$ = String.Empty
|
||||||
@@ -461,6 +484,9 @@ Namespace API.Instagram
|
|||||||
URL = $"https://www.instagram.com/api/v1/feed/user/{NameTrue}/username/?count=50" &
|
URL = $"https://www.instagram.com/api/v1/feed/user/{NameTrue}/username/?count=50" &
|
||||||
If(Cursor.IsEmptyString, String.Empty, $"&max_id={Cursor}")
|
If(Cursor.IsEmptyString, String.Empty, $"&max_id={Cursor}")
|
||||||
ENode = Nothing
|
ENode = Nothing
|
||||||
|
Case Sections.Reels
|
||||||
|
r = DownloadReels(Cursor, Token)
|
||||||
|
ENode = {"data", "xdt_api__v1__clips__user__connection_v2"}
|
||||||
Case Sections.SavedPosts
|
Case Sections.SavedPosts
|
||||||
SavedPostsDownload(String.Empty, Token)
|
SavedPostsDownload(String.Empty, Token)
|
||||||
Exit Sub
|
Exit Sub
|
||||||
@@ -496,7 +522,7 @@ Namespace API.Instagram
|
|||||||
End Select
|
End Select
|
||||||
|
|
||||||
'Get response
|
'Get response
|
||||||
Dim r$ = Responser.GetResponse(URL,, EDP.ThrowException)
|
If Not Section = Sections.Reels Then r = Responser.GetResponse(URL,, EDP.ThrowException)
|
||||||
MySiteSettings.TooManyRequests(False)
|
MySiteSettings.TooManyRequests(False)
|
||||||
RequestsCount += 1
|
RequestsCount += 1
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
@@ -518,6 +544,20 @@ Namespace API.Instagram
|
|||||||
HasNextPage = False
|
HasNextPage = False
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
|
Case Sections.Reels
|
||||||
|
With n
|
||||||
|
If .Contains("page_info") Then
|
||||||
|
With .Item("page_info")
|
||||||
|
HasNextPage = .Value("has_next_page").FromXML(Of Boolean)(False)
|
||||||
|
EndCursor = .Value("end_cursor")
|
||||||
|
End With
|
||||||
|
Else
|
||||||
|
HasNextPage = False
|
||||||
|
End If
|
||||||
|
If If(.Item("edges")?.Count, 0) > 0 Then
|
||||||
|
If Not DefaultParser(.Item("edges"), Section, Token, "Reels*") Then Throw New ExitException
|
||||||
|
End If
|
||||||
|
End With
|
||||||
Case Sections.Tagged
|
Case Sections.Tagged
|
||||||
With n
|
With n
|
||||||
If .Contains("page_info") Then
|
If .Contains("page_info") Then
|
||||||
@@ -570,14 +610,21 @@ Namespace API.Instagram
|
|||||||
End If
|
End If
|
||||||
dValue = 0
|
dValue = 0
|
||||||
If HasNextPage And Not EndCursor.IsEmptyString Then DownloadData(EndCursor, Section, Token)
|
If HasNextPage And Not EndCursor.IsEmptyString Then DownloadData(EndCursor, Section, Token)
|
||||||
|
Catch jsonNull As JsonDocumentException When jsonNull.State = WebDocumentEventArgs.States.Error And Section = Sections.Reels
|
||||||
|
Throw jsonNull
|
||||||
Catch eex As ExitException
|
Catch eex As ExitException
|
||||||
Throw eex
|
Throw eex
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
dValue = ProcessException(ex, Token, $"data downloading error [{URL}]",, Section, False)
|
dValue = ProcessException(ex, Token, $"data downloading error [{URL}]",, Section, False)
|
||||||
End Try
|
End Try
|
||||||
Loop
|
Loop
|
||||||
|
Catch jsonNull2 As JsonDocumentException When jsonNull2.State = WebDocumentEventArgs.States.Error And Section = Sections.Reels
|
||||||
Catch eex2 As ExitException
|
Catch eex2 As ExitException
|
||||||
If (Section = Sections.Timeline Or Section = Sections.Tagged) And Not Cursor.IsEmptyString Then Throw eex2
|
If eex2.Is560 Then
|
||||||
|
Throw New Plugin.ExitException With {.Silent = True}
|
||||||
|
Else
|
||||||
|
If Not Section = Sections.Reels And (Section = Sections.Timeline Or Section = Sections.Tagged) And Not Cursor.IsEmptyString Then Throw eex2
|
||||||
|
End If
|
||||||
Catch oex2 As OperationCanceledException When Token.IsCancellationRequested Or oex2.HelpLink = InstAborted
|
Catch oex2 As OperationCanceledException When Token.IsCancellationRequested Or oex2.HelpLink = InstAborted
|
||||||
If oex2.HelpLink = InstAborted Then HasError = True
|
If oex2.HelpLink = InstAborted Then HasError = True
|
||||||
Catch DoEx As Exception
|
Catch DoEx As Exception
|
||||||
@@ -668,6 +715,7 @@ Namespace API.Instagram
|
|||||||
End Sub
|
End Sub
|
||||||
Protected DefaultParser_ElemNode() As Object = Nothing
|
Protected DefaultParser_ElemNode() As Object = Nothing
|
||||||
Protected DefaultParser_IgnorePass As Boolean = False
|
Protected DefaultParser_IgnorePass As Boolean = False
|
||||||
|
Private ReadOnly DefaultParser_PostUrlCreator_Default As Func(Of PostKV, String) = Function(post) $"https://www.instagram.com/p/{post.Code}/"
|
||||||
Protected DefaultParser_PostUrlCreator As Func(Of PostKV, String) = Function(post) $"https://www.instagram.com/p/{post.Code}/"
|
Protected DefaultParser_PostUrlCreator As Func(Of PostKV, String) = Function(post) $"https://www.instagram.com/p/{post.Code}/"
|
||||||
Protected Function DefaultParser(ByVal Items As IEnumerable(Of EContainer), ByVal Section As Sections, ByVal Token As CancellationToken,
|
Protected Function DefaultParser(ByVal Items As IEnumerable(Of EContainer), ByVal Section As Sections, ByVal Token As CancellationToken,
|
||||||
Optional ByVal SpecFolder As String = Nothing, Optional ByVal State As UStates = UStates.Unknown,
|
Optional ByVal SpecFolder As String = Nothing, Optional ByVal State As UStates = UStates.Unknown,
|
||||||
@@ -717,6 +765,106 @@ Namespace API.Instagram
|
|||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "Get reels"
|
||||||
|
Private _GetReels_LSD As String = String.Empty
|
||||||
|
Private _GetReels_dtsg As String = String.Empty
|
||||||
|
Private ReadOnly Property DownloadReels_Tokens_Valid As Boolean
|
||||||
|
Get
|
||||||
|
Return Not _GetReels_LSD.IsEmptyString And Not _GetReels_dtsg.IsEmptyString
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private WriteOnly Property DownloadReels_SetEnvir As Boolean
|
||||||
|
Set(ByVal init As Boolean)
|
||||||
|
If init Then
|
||||||
|
ObtainMedia_SetReelsFunc()
|
||||||
|
DefaultParser_PostUrlCreator = Function(post) $"{MySiteSettings.GetUserUrl(Me).TrimEnd("/")}/reel/{post.Code}"
|
||||||
|
Else
|
||||||
|
ObtainMedia_SizeFuncPic = Nothing
|
||||||
|
ObtainMedia_SizeFuncVid = Nothing
|
||||||
|
DefaultParser_PostUrlCreator = DefaultParser_PostUrlCreator_Default
|
||||||
|
End If
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Private Class Responser2 : Inherits Responser
|
||||||
|
Friend Sub New(ByVal Source As Responser)
|
||||||
|
MyBase.New
|
||||||
|
Copy(Source)
|
||||||
|
ErrorProcessor = New ResponserErrorProcessor(Source)
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
|
''' <returns>Response</returns>
|
||||||
|
Private Function DownloadReels(ByVal Cursor As String, ByVal Token As CancellationToken) As String
|
||||||
|
Const requestPattern$ = "https://www.instagram.com/api/graphql?fb_dtsg={0}&fb_api_req_friendly_name=PolarisProfileReelsTabContentQuery&lsd={1}&doc_id=7191572580905225&variables={2}"
|
||||||
|
|
||||||
|
DownloadReels_SetEnvir = True
|
||||||
|
|
||||||
|
If Cursor.IsEmptyString And Not DownloadReels_Tokens_Valid Then GetPageTokens()
|
||||||
|
If Cursor.IsEmptyString And Not DownloadReels_Tokens_Valid Then Throw New ExitException
|
||||||
|
|
||||||
|
Using resp As New Responser2(Responser)
|
||||||
|
Try
|
||||||
|
resp.Method = "POST"
|
||||||
|
AddHandler resp.ResponseReceived, AddressOf Responser_ResponseReceived
|
||||||
|
resp.Headers.Add(Header_FB_LSD, _GetReels_LSD)
|
||||||
|
|
||||||
|
Dim vars$ = """data"":{""include_feed_video"":true,""page_size"":50,""target_user_id"":""" & ID & """}"
|
||||||
|
If Not Cursor.IsEmptyString Then vars = $"""after"":""{Cursor}"",""before"":null,{vars},""first"":4,""last"":null"
|
||||||
|
vars = "{" & vars & "}"
|
||||||
|
|
||||||
|
Dim url$ = String.Format(requestPattern, _GetReels_dtsg, _GetReels_LSD, SymbolsConverter.ASCII.EncodeSymbolsOnly(vars))
|
||||||
|
|
||||||
|
Return resp.GetResponse(url,, EDP.ThrowException)
|
||||||
|
Finally
|
||||||
|
With resp
|
||||||
|
Responser.Cookies.Update(.Cookies)
|
||||||
|
With .Headers
|
||||||
|
If .Contains(SiteSettings.Header_IG_WWW_CLAIM) Then Responser.Headers.Add(SiteSettings.Header_IG_WWW_CLAIM, .Value(SiteSettings.Header_IG_WWW_CLAIM))
|
||||||
|
If .Contains(SiteSettings.Header_CSRF_TOKEN) Then Responser.Headers.Add(SiteSettings.Header_CSRF_TOKEN, .Value(SiteSettings.Header_CSRF_TOKEN))
|
||||||
|
End With
|
||||||
|
End With
|
||||||
|
End Try
|
||||||
|
End Using
|
||||||
|
End Function
|
||||||
|
Private Function GetPageTokens() As Boolean
|
||||||
|
_GetReels_LSD = String.Empty
|
||||||
|
_GetReels_dtsg = String.Empty
|
||||||
|
Try
|
||||||
|
Dim r$ = Responser.GetResponse(MySiteSettings.GetUserUrl(Me),, EDP.ThrowException)
|
||||||
|
If Not r.IsEmptyString Then
|
||||||
|
Dim rr As RParams = RParams.DM(PageTokenRegexPatternDefault, 0, RegexReturn.List, EDP.ReturnValue)
|
||||||
|
Dim tokens As List(Of String) = RegexReplace(r, rr)
|
||||||
|
Dim tt$, ttVal$
|
||||||
|
If tokens.ListExists Then
|
||||||
|
With rr
|
||||||
|
.Match = Nothing
|
||||||
|
.MatchSub = 1
|
||||||
|
.WhatGet = RegexReturn.Value
|
||||||
|
End With
|
||||||
|
For Each tt In tokens
|
||||||
|
If Not _GetReels_LSD.IsEmptyString And Not _GetReels_dtsg.IsEmptyString Then
|
||||||
|
Exit For
|
||||||
|
Else
|
||||||
|
ttVal = RegexReplace(tt, rr)
|
||||||
|
If Not ttVal.IsEmptyString Then
|
||||||
|
If ttVal.Contains(":") Then
|
||||||
|
If _GetReels_dtsg.IsEmptyString Then _GetReels_dtsg = ttVal
|
||||||
|
Else
|
||||||
|
If _GetReels_LSD.IsEmptyString Then _GetReels_LSD = ttVal
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
Dim notFound$ = String.Empty
|
||||||
|
If _GetReels_dtsg.IsEmptyString Then notFound.StringAppend(Header_FB_LSD)
|
||||||
|
If _GetReels_LSD.IsEmptyString Then notFound.StringAppend("lsd")
|
||||||
|
LogError(ex, $"failed to update some{IIf(notFound.IsEmptyString, String.Empty, $" ({notFound})")} credentials", EDP.SendToLog)
|
||||||
|
End Try
|
||||||
|
Return DownloadReels_Tokens_Valid
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
#Region "Code ID converters"
|
#Region "Code ID converters"
|
||||||
Protected Function CodeToID(ByVal Code As String) As String
|
Protected Function CodeToID(ByVal Code As String) As String
|
||||||
Const CodeSymbols$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
|
Const CodeSymbols$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
|
||||||
@@ -741,6 +889,23 @@ Namespace API.Instagram
|
|||||||
Protected ObtainMedia_SizeFuncVid As Func(Of EContainer, Sizes) = Nothing
|
Protected ObtainMedia_SizeFuncVid As Func(Of EContainer, Sizes) = Nothing
|
||||||
Protected ObtainMedia_SizeFuncPic As Func(Of EContainer, Sizes) = Nothing
|
Protected ObtainMedia_SizeFuncPic As Func(Of EContainer, Sizes) = Nothing
|
||||||
Protected ObtainMedia_AllowAbstract As Boolean = False
|
Protected ObtainMedia_AllowAbstract As Boolean = False
|
||||||
|
Protected Sub ObtainMedia_SetReelsFunc()
|
||||||
|
ObtainMedia_SizeFuncPic = Function(ByVal ss As EContainer) As Sizes
|
||||||
|
If ss.Value("url").IsEmptyString Then
|
||||||
|
Return New Sizes("----", "")
|
||||||
|
ElseIf Not ss.Value("width").IsEmptyString Or Not ss.Value("width").IsEmptyString Then
|
||||||
|
Return New Sizes(CInt(AConvert(Of Integer)(ss.Value("width"), 0)) +
|
||||||
|
CInt(AConvert(Of Integer)(ss.Value("height"), 0)), ss.Value("url"))
|
||||||
|
Else
|
||||||
|
Dim rval$ = RegexReplace(ss.Value("url"), ObtainMedia_SizeFuncPic_RegexP)
|
||||||
|
If Not rval.IsEmptyString Then Return New Sizes(rval, ss.Value("url"))
|
||||||
|
rval = RegexReplace(ss.Value("url"), ObtainMedia_SizeFuncPic_RegexS)
|
||||||
|
If Not rval.IsEmptyString Then Return New Sizes(AConvert(Of Integer)(rval, 1) * -1, ss.Value("url"))
|
||||||
|
Return New Sizes(10000, ss.Value("url"))
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
ObtainMedia_SizeFuncVid = Function(ss) If(ss.Value("url").IsEmptyString, New Sizes("----", ""), New Sizes(10000, ss.Value("url")))
|
||||||
|
End Sub
|
||||||
Protected Sub ObtainMedia(ByVal n As EContainer, ByVal PostID As String, Optional ByVal SpecialFolder As String = Nothing,
|
Protected Sub ObtainMedia(ByVal n As EContainer, ByVal PostID As String, Optional ByVal SpecialFolder As String = Nothing,
|
||||||
Optional ByVal DateObj As String = Nothing, Optional ByVal InitialType As Integer = -1,
|
Optional ByVal DateObj As String = Nothing, Optional ByVal InitialType As Integer = -1,
|
||||||
Optional ByVal PostOriginUrl As String = Nothing,
|
Optional ByVal PostOriginUrl As String = Nothing,
|
||||||
@@ -749,6 +914,7 @@ Namespace API.Instagram
|
|||||||
Dim maxSize As Func(Of EContainer, Integer) = Function(ByVal _ss As EContainer) As Integer
|
Dim maxSize As Func(Of EContainer, Integer) = Function(ByVal _ss As EContainer) As Integer
|
||||||
Dim w% = AConvert(Of Integer)(_ss.Value("width"), 0)
|
Dim w% = AConvert(Of Integer)(_ss.Value("width"), 0)
|
||||||
Dim h% = AConvert(Of Integer)(_ss.Value("height"), 0)
|
Dim h% = AConvert(Of Integer)(_ss.Value("height"), 0)
|
||||||
|
'Return w + h
|
||||||
Return Math.Max(w, h)
|
Return Math.Max(w, h)
|
||||||
End Function
|
End Function
|
||||||
Dim wrongData As Predicate(Of Sizes) = Function(_ss) _ss.HasError Or _ss.Data.IsEmptyString
|
Dim wrongData As Predicate(Of Sizes) = Function(_ss) _ss.HasError Or _ss.Data.IsEmptyString
|
||||||
@@ -1037,6 +1203,7 @@ Namespace API.Instagram
|
|||||||
Return 1
|
Return 1
|
||||||
ElseIf Responser.StatusCode = 560 Or Responser.StatusCode = HttpStatusCode.InternalServerError Then '560, 500
|
ElseIf Responser.StatusCode = 560 Or Responser.StatusCode = HttpStatusCode.InternalServerError Then '560, 500
|
||||||
MySiteSettings.SkipUntilNextSession = True
|
MySiteSettings.SkipUntilNextSession = True
|
||||||
|
Err5xx = Responser.StatusCode
|
||||||
Else
|
Else
|
||||||
MyMainLOG = $"Something is wrong. Your credentials may have expired [{CInt(Responser.StatusCode)}/{CInt(Responser.Status)}]: {ToString()} [{s}]"
|
MyMainLOG = $"Something is wrong. Your credentials may have expired [{CInt(Responser.StatusCode)}/{CInt(Responser.Status)}]: {ToString()} [{s}]"
|
||||||
DisableSection(s)
|
DisableSection(s)
|
||||||
@@ -1050,11 +1217,12 @@ Namespace API.Instagram
|
|||||||
Dim s As Sections = DirectCast(Section, Sections)
|
Dim s As Sections = DirectCast(Section, Sections)
|
||||||
Select Case s
|
Select Case s
|
||||||
Case Sections.Timeline : MySiteSettings.DownloadTimeline.Value = False
|
Case Sections.Timeline : MySiteSettings.DownloadTimeline.Value = False
|
||||||
|
Case Sections.Reels : MySiteSettings.DownloadReels.Value = False
|
||||||
|
Case Sections.Tagged : MySiteSettings.DownloadTagged.Value = False
|
||||||
Case Sections.Stories, Sections.UserStories
|
Case Sections.Stories, Sections.UserStories
|
||||||
MySiteSettings.DownloadTimeline.Value = False
|
MySiteSettings.DownloadTimeline.Value = False
|
||||||
MySiteSettings.DownloadStories.Value = False
|
MySiteSettings.DownloadStories.Value = False
|
||||||
MySiteSettings.DownloadStoriesUser.Value = False
|
MySiteSettings.DownloadStoriesUser.Value = False
|
||||||
Case Else : MySiteSettings.DownloadTagged.Value = False
|
|
||||||
End Select
|
End Select
|
||||||
MyMainLOG = $"[{s}] downloading is disabled until you update your credentials".ToUpper
|
MyMainLOG = $"[{s}] downloading is disabled until you update your credentials".ToUpper
|
||||||
End If
|
End If
|
||||||
@@ -1075,7 +1243,7 @@ Namespace API.Instagram
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Standalone downloader"
|
#Region "Standalone downloader"
|
||||||
Protected Overrides Sub DownloadSingleObject_GetPosts(ByVal Data As IYouTubeMediaContainer, ByVal Token As CancellationToken)
|
Protected Overrides Sub DownloadSingleObject_GetPosts(ByVal Data As IYouTubeMediaContainer, ByVal Token As CancellationToken)
|
||||||
Dim PID$ = RegexReplace(Data.URL, RParams.DMS(".*?instagram.com/p/([_\w\d]+)", 1))
|
Dim PID$ = RegexReplace(Data.URL, RParams.DMS(String.Format(UserRegexDefaultPattern, "instagram.com/p/"), 1))
|
||||||
If Not PID.IsEmptyString AndAlso Not ACheck(Of Long)(PID) Then PID = CodeToID(PID)
|
If Not PID.IsEmptyString AndAlso Not ACheck(Of Long)(PID) Then PID = CodeToID(PID)
|
||||||
If Not PID.IsEmptyString Then
|
If Not PID.IsEmptyString Then
|
||||||
PostsToReparse.Add(New PostKV With {.ID = PID})
|
PostsToReparse.Add(New PostKV With {.ID = PID})
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ Namespace API.JustForFans
|
|||||||
UserAgent = New PropertyValue(If(Responser.UserAgentExists, Responser.UserAgent, String.Empty), GetType(String), Sub(v) UpdateHeader(NameOf(UserAgent), v))
|
UserAgent = New PropertyValue(If(Responser.UserAgentExists, Responser.UserAgent, String.Empty), GetType(String), Sub(v) UpdateHeader(NameOf(UserAgent), v))
|
||||||
|
|
||||||
_AllowUserAgentUpdate = False
|
_AllowUserAgentUpdate = False
|
||||||
UserRegex = RParams.DMS("https://justfor.fans/([^/\?]+)", 1, EDP.ReturnValue)
|
UserRegex = RParams.DMS(String.Format(UserRegexDefaultPattern, "justfor.fans/"), 1, EDP.ReturnValue)
|
||||||
UrlPatternUser = "https://justfor.fans/{0}"
|
UrlPatternUser = "https://justfor.fans/{0}"
|
||||||
ImageVideoContains = "justfor.fans"
|
ImageVideoContains = "justfor.fans"
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ Namespace API.JustForFans
|
|||||||
#Region "Initializer"
|
#Region "Initializer"
|
||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
UseInternalM3U8Function = True
|
UseInternalM3U8Function = True
|
||||||
|
_ResponserAutoUpdateCookies = True
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Download functions"
|
#Region "Download functions"
|
||||||
@@ -191,11 +192,11 @@ Namespace API.JustForFans
|
|||||||
DownloadData(0, Token)
|
DownloadData(0, Token)
|
||||||
Finally
|
Finally
|
||||||
If DownloadTopCount.HasValue Then DownloadTopCount = Nothing
|
If DownloadTopCount.HasValue Then DownloadTopCount = Nothing
|
||||||
Try : RemoveHandler Responser.ResponseReceived, AddressOf Responser_ResponseReceived : Catch : End Try
|
Responser_ResponseReceived_RemoveHandler()
|
||||||
MySettings.UpdateResponser(Responser)
|
MySettings.UpdateResponser(Responser)
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Responser_ResponseReceived(ByVal Source As Object, ByVal e As EventArguments.WebDataResponse)
|
Protected Overrides Sub Responser_ResponseReceived(ByVal Source As Object, ByVal e As EventArguments.WebDataResponse)
|
||||||
If e.CookiesExists Then
|
If e.CookiesExists Then
|
||||||
Dim hv$ = If(e.Cookies.FirstOrDefault(Function(cc) cc.Name.StringToLower = SiteSettings.UserHash4_CookieName)?.Value, String.Empty)
|
Dim hv$ = If(e.Cookies.FirstOrDefault(Function(cc) cc.Name.StringToLower = SiteSettings.UserHash4_CookieName)?.Value, String.Empty)
|
||||||
If Not hv.IsEmptyString And Not _UserHash4 = hv Then _UserHash4 = hv
|
If Not hv.IsEmptyString And Not _UserHash4 = hv Then _UserHash4 = hv
|
||||||
|
|||||||
@@ -106,9 +106,12 @@ Namespace API.LPSG
|
|||||||
End Sub
|
End Sub
|
||||||
Protected Overrides Function DownloadingException(ByVal ex As Exception, ByVal Message As String, Optional ByVal FromPE As Boolean = False,
|
Protected Overrides Function DownloadingException(ByVal ex As Exception, ByVal Message As String, Optional ByVal FromPE As Boolean = False,
|
||||||
Optional ByVal EObj As Object = Nothing) As Integer
|
Optional ByVal EObj As Object = Nothing) As Integer
|
||||||
If Responser.StatusCode = Net.HttpStatusCode.ServiceUnavailable Then
|
If Responser.StatusCode = Net.HttpStatusCode.ServiceUnavailable Then '503
|
||||||
MyMainLOG = $"{ToStringForLog()}: LPSG not available"
|
MyMainLOG = $"{ToStringForLog()}: LPSG not available"
|
||||||
Return 1
|
Return 1
|
||||||
|
ElseIf Responser.StatusCode = Net.HttpStatusCode.NotFound Then '404
|
||||||
|
UserExists = False
|
||||||
|
Return 1
|
||||||
Else
|
Else
|
||||||
Return 0
|
Return 0
|
||||||
End If
|
End If
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ Namespace API.OnlyFans
|
|||||||
OFScraperMP4decrypt_XML = New PropertyValue(String.Empty, GetType(String))
|
OFScraperMP4decrypt_XML = New PropertyValue(String.Empty, GetType(String))
|
||||||
KeyModeDefault_XML = New PropertyValue(KeyModeDefault_Default)
|
KeyModeDefault_XML = New PropertyValue(KeyModeDefault_Default)
|
||||||
|
|
||||||
UserRegex = RParams.DMS("onlyfans.com/([\w\._]+)", 1, EDP.ReturnValue)
|
UserRegex = RParams.DMS(String.Format(UserRegexDefaultPattern, "onlyfans.com/"), 1, EDP.ReturnValue)
|
||||||
UrlPatternUser = "https://onlyfans.com/{0}"
|
UrlPatternUser = "https://onlyfans.com/{0}"
|
||||||
ImageVideoContains = "onlyfans.com"
|
ImageVideoContains = "onlyfans.com"
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||
@@ -74,26 +74,33 @@ Namespace API.OnlyFans
|
|||||||
Private _OFScraperExists As Boolean = False
|
Private _OFScraperExists As Boolean = False
|
||||||
Private OFSCache As CacheKeeper = Nothing
|
Private OFSCache As CacheKeeper = Nothing
|
||||||
Private _AbsMediaIndex As Integer = 0
|
Private _AbsMediaIndex As Integer = 0
|
||||||
|
Private FunctionErr As Integer = FunctionErrDef
|
||||||
|
Private Const FunctionErrDef As Integer = -100
|
||||||
Private Sub ValidateOFScraper()
|
Private Sub ValidateOFScraper()
|
||||||
_OFScraperExists = ACheck(MySettings.OFScraperPath.Value) AndAlso CStr(MySettings.OFScraperPath.Value).CSFile.Exists
|
_OFScraperExists = ACheck(MySettings.OFScraperPath.Value) AndAlso CStr(MySettings.OFScraperPath.Value).CSFile.Exists
|
||||||
End Sub
|
End Sub
|
||||||
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
||||||
|
Try
|
||||||
If Not MySettings.SessionAborted Then
|
If Not MySettings.SessionAborted Then
|
||||||
ValidateOFScraper()
|
ValidateOFScraper()
|
||||||
_AbsMediaIndex = 0
|
_AbsMediaIndex = 0
|
||||||
|
FunctionErr = FunctionErrDef
|
||||||
If Not CCookie Is Nothing Then CCookie.Dispose()
|
If Not CCookie Is Nothing Then CCookie.Dispose()
|
||||||
CCookie = Responser.Cookies.Copy
|
CCookie = Responser.Cookies.Copy
|
||||||
Responser.Cookies.Clear()
|
Responser.Cookies.Clear()
|
||||||
AddHandler Responser.ResponseReceived, AddressOf OnResponseReceived
|
AddHandler Responser.ResponseReceived, AddressOf Responser_ResponseReceived
|
||||||
UpdateCookieHeader()
|
UpdateCookieHeader()
|
||||||
DownloadTimeline(IIf(IsSavedPosts, 0, String.Empty), Token)
|
DownloadTimeline(IIf(IsSavedPosts, 0, String.Empty), Token)
|
||||||
If Not IsSavedPosts Then
|
If Not IsSavedPosts Then
|
||||||
If MediaDownloadHighlights Then DownloadHighlights(Token)
|
If MediaDownloadHighlights And FunctionErr = FunctionErrDef Then DownloadHighlights(Token)
|
||||||
If MediaDownloadChatMedia Then DownloadChatMedia(0, Token)
|
If MediaDownloadChatMedia And FunctionErr = FunctionErrDef Then DownloadChatMedia(0, Token)
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
|
Finally
|
||||||
|
Responser_ResponseReceived_RemoveHandler()
|
||||||
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub OnResponseReceived(ByVal Sender As Object, ByVal e As WebDataResponse)
|
Protected Overrides Sub Responser_ResponseReceived(ByVal Sender As Object, ByVal e As WebDataResponse)
|
||||||
If e.CookiesExists Then
|
If e.CookiesExists Then
|
||||||
CCookie.Update(e.Cookies, CookieKeeper.UpdateModes.ReplaceByNameAll,, EDP.ReturnValue)
|
CCookie.Update(e.Cookies, CookieKeeper.UpdateModes.ReplaceByNameAll,, EDP.ReturnValue)
|
||||||
UpdateCookieHeader()
|
UpdateCookieHeader()
|
||||||
@@ -102,6 +109,10 @@ Namespace API.OnlyFans
|
|||||||
Private Sub UpdateCookieHeader()
|
Private Sub UpdateCookieHeader()
|
||||||
Responser.Headers.Add("Cookie", CCookie.ToString(False))
|
Responser.Headers.Add("Cookie", CCookie.ToString(False))
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Function ProcessFunctionErrComplete(ByVal ErrValue As Integer) As Boolean
|
||||||
|
If ErrValue <= 0 Or (ErrValue > 0 And ErrValue <> 2) Then FunctionErr = ErrValue
|
||||||
|
Return ErrValue <> 2
|
||||||
|
End Function
|
||||||
Friend Const A_HIGHLIGHT As String = "HL"
|
Friend Const A_HIGHLIGHT As String = "HL"
|
||||||
Friend Const A_MESSAGE As String = "MSG"
|
Friend Const A_MESSAGE As String = "MSG"
|
||||||
Private Const BaseUrlPattern As String = "https://onlyfans.com{0}"
|
Private Const BaseUrlPattern As String = "https://onlyfans.com{0}"
|
||||||
@@ -180,7 +191,7 @@ Namespace API.OnlyFans
|
|||||||
DownloadTimeline(tmpCursor, Token)
|
DownloadTimeline(tmpCursor, Token)
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_complete = Not ProcessException(ex, Token, $"data downloading error [{url}]") = 2
|
_complete = ProcessFunctionErrComplete(ProcessException(ex, Token, $"data downloading error [{url}]"))
|
||||||
End Try
|
End Try
|
||||||
Loop While Not _complete
|
Loop While Not _complete
|
||||||
End Sub
|
End Sub
|
||||||
@@ -219,7 +230,7 @@ Namespace API.OnlyFans
|
|||||||
End If
|
End If
|
||||||
If hasMore Then DownloadHighlights(Cursor + 5, Token)
|
If hasMore Then DownloadHighlights(Cursor + 5, Token)
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_complete = Not ProcessException(ex, Token, $"highlights downloading error [{url}]") = 2
|
_complete = ProcessFunctionErrComplete(ProcessException(ex, Token, $"highlights downloading error [{url}]"))
|
||||||
End Try
|
End Try
|
||||||
Loop While Not _complete
|
Loop While Not _complete
|
||||||
End Sub
|
End Sub
|
||||||
@@ -264,7 +275,7 @@ Namespace API.OnlyFans
|
|||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_complete = Not ProcessException(ex, Token, $"highlights downloading error [{url}]") = 2
|
_complete = ProcessFunctionErrComplete(ProcessException(ex, Token, $"highlights downloading error [{url}]"))
|
||||||
End Try
|
End Try
|
||||||
Loop While Not _complete
|
Loop While Not _complete
|
||||||
End Sub
|
End Sub
|
||||||
@@ -311,7 +322,7 @@ Namespace API.OnlyFans
|
|||||||
End If
|
End If
|
||||||
If hasMore Then DownloadChatMedia(Cursor + 20, Token)
|
If hasMore Then DownloadChatMedia(Cursor + 20, Token)
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_complete = Not ProcessException(ex, Token, $"chats downloading error [{url}]") = 2
|
_complete = ProcessFunctionErrComplete(ProcessException(ex, Token, $"chats downloading error [{url}]"))
|
||||||
End Try
|
End Try
|
||||||
Loop While Not _complete
|
Loop While Not _complete
|
||||||
End Sub
|
End Sub
|
||||||
@@ -709,15 +720,17 @@ Namespace API.OnlyFans
|
|||||||
End If
|
End If
|
||||||
ElseIf Responser.StatusCode = Net.HttpStatusCode.NotFound Then '404
|
ElseIf Responser.StatusCode = Net.HttpStatusCode.NotFound Then '404
|
||||||
UserExists = False
|
UserExists = False
|
||||||
Return 1
|
Return 3
|
||||||
ElseIf Responser.StatusCode = Net.HttpStatusCode.GatewayTimeout Or Responser.StatusCode = 429 Then '504, 429
|
ElseIf Responser.StatusCode = Net.HttpStatusCode.GatewayTimeout Or Responser.StatusCode = 429 Then '504, 429
|
||||||
If Responser.StatusCode = 429 Then MyMainLOG = $"[429] OnlyFans too many requests ({ToStringForLog()})"
|
If Responser.StatusCode = 429 Then MyMainLOG = $"[429] OnlyFans too many requests ({ToStringForLog()})"
|
||||||
MySettings.SessionAborted = True
|
MySettings.SessionAborted = True
|
||||||
Return 1
|
Return 3
|
||||||
ElseIf Responser.StatusCode = Net.HttpStatusCode.Unauthorized Then '401
|
ElseIf Responser.StatusCode = Net.HttpStatusCode.Unauthorized Then '401
|
||||||
MySettings.SessionAborted = True
|
MySettings.SessionAborted = True
|
||||||
MyMainLOG = $"{ToStringForLog()} [{CInt(Responser.StatusCode)}]: OnlyFans credentials expired"
|
MyMainLOG = $"{ToStringForLog()} [{CInt(Responser.StatusCode)}]: OnlyFans credentials expired"
|
||||||
Return 1
|
Return 3
|
||||||
|
ElseIf Responser.StatusCode = Net.HttpStatusCode.InternalServerError Then '500
|
||||||
|
Return 3
|
||||||
Else
|
Else
|
||||||
Return 0
|
Return 0
|
||||||
End If
|
End If
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ Namespace API.Reddit
|
|||||||
|
|
||||||
UrlPatternUser = "https://www.reddit.com/{0}/{1}/"
|
UrlPatternUser = "https://www.reddit.com/{0}/{1}/"
|
||||||
ImageVideoContains = "reddit.com"
|
ImageVideoContains = "reddit.com"
|
||||||
UserRegex = RParams.DM("[htps:/]{7,8}.*?reddit.com/([user]{1,4})/([^/]+)", 0, RegexReturn.ListByMatch, EDP.ReturnValue)
|
UserRegex = RParams.DM("[htps:/]{7,8}.*?reddit.com/([user]{1,4})/([^/\?&]+)", 0, RegexReturn.ListByMatch, EDP.ReturnValue)
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "GetInstance"
|
#Region "GetInstance"
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ Namespace API.RedGifs
|
|||||||
TokenUpdateIntervalProvider = New TokenRefreshIntervalProvider
|
TokenUpdateIntervalProvider = New TokenRefreshIntervalProvider
|
||||||
_AllowUserAgentUpdate = False
|
_AllowUserAgentUpdate = False
|
||||||
UrlPatternUser = "https://www.redgifs.com/users/{0}/"
|
UrlPatternUser = "https://www.redgifs.com/users/{0}/"
|
||||||
UserRegex = RParams.DMS("[htps:/]{7,8}.*?redgifs.com/users/([^/]+)", 1)
|
UserRegex = RParams.DMS(String.Format(UserRegexDefaultPattern, "redgifs.com/users/"), 1)
|
||||||
ImageVideoContains = "redgifs"
|
ImageVideoContains = "redgifs"
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
|||||||
@@ -55,8 +55,7 @@ Namespace API.ThisVid
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "UpdateCookies"
|
#Region "UpdateCookies"
|
||||||
Friend Sub UpdateCookies(ByVal Source As Responser)
|
Friend Sub UpdateCookies(ByVal Source As Responser)
|
||||||
Responser.Cookies.Clear()
|
Responser.Cookies.Update(Source.Cookies)
|
||||||
Responser.Cookies.AddRange(Source.Cookies)
|
|
||||||
Update_SaveCookiesNetscape(True)
|
Update_SaveCookiesNetscape(True)
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ Namespace API.ThisVid
|
|||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
UseClientTokens = True
|
UseClientTokens = True
|
||||||
SessionPosts = New List(Of String)
|
SessionPosts = New List(Of String)
|
||||||
|
_ResponserAutoUpdateCookies = True
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Validation"
|
#Region "Validation"
|
||||||
@@ -225,6 +226,7 @@ Namespace API.ThisVid
|
|||||||
Private AddedCount As Integer = 0
|
Private AddedCount As Integer = 0
|
||||||
Private _PageVideosRepeat As Integer = 0
|
Private _PageVideosRepeat As Integer = 0
|
||||||
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
||||||
|
Try
|
||||||
SessionPosts.Clear()
|
SessionPosts.Clear()
|
||||||
AddedCount = 0
|
AddedCount = 0
|
||||||
_PageVideosRepeat = 0
|
_PageVideosRepeat = 0
|
||||||
@@ -249,7 +251,9 @@ Namespace API.ThisVid
|
|||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
|
Finally
|
||||||
If Responser.Cookies.Changed Then MySettings.UpdateCookies(Responser) : Responser.Cookies.Changed = False
|
If Responser.Cookies.Changed Then MySettings.UpdateCookies(Responser) : Responser.Cookies.Changed = False
|
||||||
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Friend Function GetNonUserUrl(ByVal Page As Integer) As String
|
Friend Function GetNonUserUrl(ByVal Page As Integer) As String
|
||||||
Dim url$ = String.Empty
|
Dim url$ = String.Empty
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ Namespace API.ThreadsNet
|
|||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
#Region "Authorization"
|
#Region "Authorization"
|
||||||
<PClonable(Clone:=False)> Protected ReadOnly __HH_CSRF_TOKEN As PropertyValue
|
<PClonable(Clone:=False)> Protected ReadOnly __HH_CSRF_TOKEN As PropertyValue
|
||||||
<PropertyOption(ControlText:="x-csrftoken", AllowNull:=False, IsAuth:=True), ControlNumber(0)>
|
<PropertyOption(ControlText:="x-csrftoken", AllowNull:=True, IsAuth:=True), ControlNumber(0)>
|
||||||
Friend Overridable ReadOnly Property HH_CSRF_TOKEN As PropertyValue
|
Friend Overridable ReadOnly Property HH_CSRF_TOKEN As PropertyValue
|
||||||
Get
|
Get
|
||||||
Return __HH_CSRF_TOKEN
|
Return __HH_CSRF_TOKEN
|
||||||
@@ -126,7 +126,7 @@ Namespace API.ThreadsNet
|
|||||||
HH_USER_AGENT = New PropertyValue(useragent, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_USER_AGENT), v))
|
HH_USER_AGENT = New PropertyValue(useragent, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_USER_AGENT), v))
|
||||||
|
|
||||||
UrlPatternUser = "https://www.threads.net/@{0}"
|
UrlPatternUser = "https://www.threads.net/@{0}"
|
||||||
UserRegex = RParams.DMS("threads.net/@([^/\?&]+)", 1)
|
UserRegex = RParams.DMS(String.Format(UserRegexDefaultPattern, "threads.net/@"), 1)
|
||||||
ImageVideoContains = "threads.net"
|
ImageVideoContains = "threads.net"
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
@@ -165,6 +165,15 @@ Namespace API.ThreadsNet
|
|||||||
Return ErrorsDescriber.Execute(EDP.SendToLog, ex, "Can't open user's post", String.Empty)
|
Return ErrorsDescriber.Execute(EDP.SendToLog, ex, "Can't open user's post", String.Empty)
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
#End Region
|
||||||
|
#Region "Update"
|
||||||
|
Friend Overrides Sub Update()
|
||||||
|
If _SiteEditorFormOpened And Responser.CookiesExists Then
|
||||||
|
Dim csrf$ = If(Responser.Cookies.FirstOrDefault(Function(c) c.Name.StringToLower = IG.Header_CSRF_TOKEN_COOKIE)?.Value, String.Empty)
|
||||||
|
If Not csrf.IsEmptyString Then HH_CSRF_TOKEN.Value = csrf
|
||||||
|
End If
|
||||||
|
MyBase.Update()
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -18,14 +18,11 @@ Imports IGS = SCrawler.API.Instagram.SiteSettings
|
|||||||
Namespace API.ThreadsNet
|
Namespace API.ThreadsNet
|
||||||
Friend Class UserData : Inherits Instagram.UserData
|
Friend Class UserData : Inherits Instagram.UserData
|
||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
Friend Const Header_FB_LSD As String = "x-fb-lsd"
|
|
||||||
Private ReadOnly Property MySettings As SiteSettings
|
Private ReadOnly Property MySettings As SiteSettings
|
||||||
Get
|
Get
|
||||||
Return HOST.Source
|
Return HOST.Source
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Private ReadOnly ObtainMedia_SizeFuncPic_RegexP As RParams = RParams.DMS("_p(\d+)x(\d+)", 1, EDP.ReturnValue)
|
|
||||||
Private ReadOnly ObtainMedia_SizeFuncPic_RegexS As RParams = RParams.DMS("_s(\d+)x(\d+)", 1, EDP.ReturnValue)
|
|
||||||
Private ReadOnly DefaultParser_ElemNode_Default() As Object = {"node", "thread_items", 0, "post"}
|
Private ReadOnly DefaultParser_ElemNode_Default() As Object = {"node", "thread_items", 0, "post"}
|
||||||
Private OPT_LSD As String = String.Empty
|
Private OPT_LSD As String = String.Empty
|
||||||
Private OPT_FB_DTSG As String = String.Empty
|
Private OPT_FB_DTSG As String = String.Empty
|
||||||
@@ -48,23 +45,12 @@ Namespace API.ThreadsNet
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Initializer"
|
#Region "Initializer"
|
||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
ObtainMedia_SizeFuncPic = Function(ByVal ss As EContainer) As Sizes
|
ObtainMedia_SetReelsFunc()
|
||||||
If ss.Value("url").IsEmptyString Then
|
|
||||||
Return New Sizes("----", "")
|
|
||||||
ElseIf Not ss.Value("width").IsEmptyString Then
|
|
||||||
Return New Sizes(ss.Value("height").IfNullOrEmpty(ss.Value("width")), ss.Value("url"))
|
|
||||||
Else
|
|
||||||
Dim rval$ = RegexReplace(ss.Value("url"), ObtainMedia_SizeFuncPic_RegexP)
|
|
||||||
If Not rval.IsEmptyString Then Return New Sizes(rval, ss.Value("url"))
|
|
||||||
rval = RegexReplace(ss.Value("url"), ObtainMedia_SizeFuncPic_RegexS)
|
|
||||||
If Not rval.IsEmptyString Then Return New Sizes(AConvert(Of Integer)(rval, 1) * -1, ss.Value("url"))
|
|
||||||
Return New Sizes(10000, ss.Value("url"))
|
|
||||||
End If
|
|
||||||
End Function
|
|
||||||
ObtainMedia_SizeFuncVid = Function(ss) If(ss.Value("url").IsEmptyString, New Sizes("----", ""), New Sizes(10000, ss.Value("url")))
|
|
||||||
ObtainMedia_AllowAbstract = True
|
ObtainMedia_AllowAbstract = True
|
||||||
DefaultParser_ElemNode = DefaultParser_ElemNode_Default
|
DefaultParser_ElemNode = DefaultParser_ElemNode_Default
|
||||||
DefaultParser_PostUrlCreator = Function(post) $"https://www.threads.net/@{NameTrue}/post/{post.Code}"
|
DefaultParser_PostUrlCreator = Function(post) $"https://www.threads.net/@{NameTrue}/post/{post.Code}"
|
||||||
|
_ResponserAutoUpdateCookies = True
|
||||||
|
_ResponserAddResponseReceivedHandler = True
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Download functions"
|
#Region "Download functions"
|
||||||
@@ -72,7 +58,6 @@ Namespace API.ThreadsNet
|
|||||||
Dim errorFound As Boolean = False
|
Dim errorFound As Boolean = False
|
||||||
Try
|
Try
|
||||||
Responser.Method = "POST"
|
Responser.Method = "POST"
|
||||||
AddHandler Responser.ResponseReceived, AddressOf Responser_ResponseReceived
|
|
||||||
LoadSavePostsKV(True)
|
LoadSavePostsKV(True)
|
||||||
OPT_LSD = String.Empty
|
OPT_LSD = String.Empty
|
||||||
OPT_FB_DTSG = String.Empty
|
OPT_FB_DTSG = String.Empty
|
||||||
@@ -170,11 +155,11 @@ Namespace API.ThreadsNet
|
|||||||
Responser.Method = "GET"
|
Responser.Method = "GET"
|
||||||
Responser.Referer = URL
|
Responser.Referer = URL
|
||||||
Responser.Headers.Remove(Header_FB_LSD)
|
Responser.Headers.Remove(Header_FB_LSD)
|
||||||
Dim r$ = Responser.GetResponse(URL,, EDP.SendToLog + EDP.ThrowException)
|
Dim r$ = Responser.GetResponse(URL,, EDP.ThrowException)
|
||||||
Dim rr As RParams
|
Dim rr As RParams
|
||||||
Dim tt$, ttVal$
|
Dim tt$, ttVal$
|
||||||
If Not r.IsEmptyString Then
|
If Not r.IsEmptyString Then
|
||||||
rr = RParams.DM("\[\],{""token"":""(.*?)""},\d+\]", 0, RegexReturn.List, EDP.ReturnValue)
|
rr = RParams.DM(Instagram.PageTokenRegexPatternDefault, 0, RegexReturn.List, EDP.ReturnValue)
|
||||||
Dim tokens As List(Of String) = RegexReplace(r, rr)
|
Dim tokens As List(Of String) = RegexReplace(r, rr)
|
||||||
If tokens.ListExists Then
|
If tokens.ListExists Then
|
||||||
With rr
|
With rr
|
||||||
@@ -205,7 +190,12 @@ Namespace API.ThreadsNet
|
|||||||
If OPT_FB_DTSG.IsEmptyString Then notFound.StringAppend(Header_FB_LSD)
|
If OPT_FB_DTSG.IsEmptyString Then notFound.StringAppend(Header_FB_LSD)
|
||||||
If OPT_LSD.IsEmptyString Then notFound.StringAppend("lsd")
|
If OPT_LSD.IsEmptyString Then notFound.StringAppend("lsd")
|
||||||
If ID.IsEmptyString Then notFound.StringAppend("User ID")
|
If ID.IsEmptyString Then notFound.StringAppend("User ID")
|
||||||
LogError(ex, $"failed to update some{IIf(notFound.IsEmptyString, String.Empty, $" ({notFound})")} credentials", e)
|
Dim eex As New ErrorsDescriberException($"{ToStringForLog()}: failed to update some{IIf(notFound.IsEmptyString, String.Empty, $" ({notFound})")} credentials",,, ex) With {
|
||||||
|
.ReplaceMainMessage = True,
|
||||||
|
.SendToLogOnlyMessage = Responser.StatusCode = Net.HttpStatusCode.InternalServerError And Responser.Status = Net.WebExceptionStatus.ProtocolError
|
||||||
|
}
|
||||||
|
'LogError(ex, $"failed to update some{IIf(notFound.IsEmptyString, String.Empty, $" ({notFound})")} credentials", e)
|
||||||
|
LogError(eex, String.Empty, e)
|
||||||
Return False
|
Return False
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ Namespace API.TikTok
|
|||||||
Friend ReadOnly Property TitleUseNativeSTD As PropertyValue
|
Friend ReadOnly Property TitleUseNativeSTD As PropertyValue
|
||||||
<PropertyOption(ControlText:="Add video ID to video title"), PXML, PClonable>
|
<PropertyOption(ControlText:="Add video ID to video title"), PXML, PClonable>
|
||||||
Friend ReadOnly Property TitleAddVideoID As PropertyValue
|
Friend ReadOnly Property TitleAddVideoID As PropertyValue
|
||||||
|
<PropertyOption(ControlText:="Use regex to clean video title"), PXML, PClonable>
|
||||||
|
Friend ReadOnly Property TitleUseRegexForTitle As PropertyValue
|
||||||
|
<PropertyOption(ControlText:="Title regex", ControlToolTip:="Regex to clean video title"), PXML, PClonable>
|
||||||
|
Friend ReadOnly Property TitleUseRegexForTitle_Value As PropertyValue
|
||||||
<PropertyOption(ControlText:="Use video date as file date",
|
<PropertyOption(ControlText:="Use video date as file date",
|
||||||
ControlToolTip:="Set the file date to the date the video was added (website) (if available)."), PXML, PClonable>
|
ControlToolTip:="Set the file date to the date the video was added (website) (if available)."), PXML, PClonable>
|
||||||
Friend ReadOnly Property UseParsedVideoDate As PropertyValue
|
Friend ReadOnly Property UseParsedVideoDate As PropertyValue
|
||||||
@@ -31,10 +35,12 @@ Namespace API.TikTok
|
|||||||
TitleUseNative = New PropertyValue(True)
|
TitleUseNative = New PropertyValue(True)
|
||||||
TitleUseNativeSTD = New PropertyValue(False)
|
TitleUseNativeSTD = New PropertyValue(False)
|
||||||
TitleAddVideoID = New PropertyValue(True)
|
TitleAddVideoID = New PropertyValue(True)
|
||||||
|
TitleUseRegexForTitle = New PropertyValue(False)
|
||||||
|
TitleUseRegexForTitle_Value = New PropertyValue(String.Empty, GetType(String))
|
||||||
UseParsedVideoDate = New PropertyValue(True)
|
UseParsedVideoDate = New PropertyValue(True)
|
||||||
UseNetscapeCookies = True
|
UseNetscapeCookies = True
|
||||||
UrlPatternUser = "https://www.tiktok.com/@{0}/"
|
UrlPatternUser = "https://www.tiktok.com/@{0}/"
|
||||||
UserRegex = RParams.DMS("[htps:/]{7,8}.*?tiktok.com/@([^/]+)", 1)
|
UserRegex = RParams.DMS(String.Format(UserRegexDefaultPattern, "tiktok.com/@"), 1)
|
||||||
ImageVideoContains = "tiktok.com"
|
ImageVideoContains = "tiktok.com"
|
||||||
End Sub
|
End Sub
|
||||||
Friend Overrides Function GetInstance(ByVal What As ISiteSettings.Download) As IPluginContentProvider
|
Friend Overrides Function GetInstance(ByVal What As ISiteSettings.Download) As IPluginContentProvider
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ Namespace API.TikTok
|
|||||||
Private Const Name_TitleUseNative As String = "TitleUseNative"
|
Private Const Name_TitleUseNative As String = "TitleUseNative"
|
||||||
Private Const Name_TitleAddVideoID As String = "TitleAddVideoID"
|
Private Const Name_TitleAddVideoID As String = "TitleAddVideoID"
|
||||||
Private Const Name_LastDownloadDate As String = "LastDownloadDate"
|
Private Const Name_LastDownloadDate As String = "LastDownloadDate"
|
||||||
|
Private Const Name_TitleUseRegexForTitle As String = "TitleUseRegexForTitle"
|
||||||
|
Private Const Name_TitleUseRegexForTitle_Value As String = "TitleUseRegexForTitle_Value"
|
||||||
|
Private Const Name_TitleUseGlobalRegexOptions As String = "TitleUseGlobalRegexOptions"
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
Private ReadOnly Property MySettings As SiteSettings
|
Private ReadOnly Property MySettings As SiteSettings
|
||||||
@@ -27,8 +30,15 @@ Namespace API.TikTok
|
|||||||
Return HOST.Source
|
Return HOST.Source
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
Private UserCache As CacheKeeper = Nothing
|
||||||
Private ReadOnly Property RootCacheTikTok As ICacheKeeper
|
Private ReadOnly Property RootCacheTikTok As ICacheKeeper
|
||||||
Get
|
Get
|
||||||
|
If Not UserCache Is Nothing AndAlso Not UserCache.Disposed Then
|
||||||
|
With DirectCast(UserCache.NewInstance(Of BatchFileExchanger), BatchFileExchanger)
|
||||||
|
.Validate()
|
||||||
|
Return .Self
|
||||||
|
End With
|
||||||
|
Else
|
||||||
With Settings.Cache
|
With Settings.Cache
|
||||||
Dim f As SFile = $"{Settings.Cache.RootDirectory.PathWithSeparator}TikTokCache\"
|
Dim f As SFile = $"{Settings.Cache.RootDirectory.PathWithSeparator}TikTokCache\"
|
||||||
If .ContainsFolder(f) Then
|
If .ContainsFolder(f) Then
|
||||||
@@ -42,11 +52,15 @@ Namespace API.TikTok
|
|||||||
End With
|
End With
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
|
End If
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Friend Property RemoveTagsFromTitle As Boolean = False
|
Friend Property RemoveTagsFromTitle As Boolean = False
|
||||||
Friend Property TitleUseNative As Boolean = True
|
Friend Property TitleUseNative As Boolean = True
|
||||||
Friend Property TitleAddVideoID As Boolean = True
|
Friend Property TitleAddVideoID As Boolean = True
|
||||||
|
Friend Property TitleUseRegexForTitle As Boolean = False
|
||||||
|
Friend Property TitleUseRegexForTitle_Value As String = String.Empty
|
||||||
|
Friend Property TitleUseGlobalRegexOptions As Boolean = True
|
||||||
Private Property LastDownloadDate As Date? = Nothing
|
Private Property LastDownloadDate As Date? = Nothing
|
||||||
Private _TrueName As String = String.Empty
|
Private _TrueName As String = String.Empty
|
||||||
Friend Property TrueName As String
|
Friend Property TrueName As String
|
||||||
@@ -68,6 +82,9 @@ Namespace API.TikTok
|
|||||||
RemoveTagsFromTitle = .RemoveTagsFromTitle
|
RemoveTagsFromTitle = .RemoveTagsFromTitle
|
||||||
TitleUseNative = .TitleUseNative
|
TitleUseNative = .TitleUseNative
|
||||||
TitleAddVideoID = .TitleAddVideoID
|
TitleAddVideoID = .TitleAddVideoID
|
||||||
|
TitleUseRegexForTitle = .TitleUseRegexForTitle
|
||||||
|
TitleUseRegexForTitle_Value = .TitleUseRegexForTitle_Value
|
||||||
|
TitleUseGlobalRegexOptions = .TitleUseGlobalRegexOptions
|
||||||
End With
|
End With
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
@@ -82,12 +99,18 @@ Namespace API.TikTok
|
|||||||
LastDownloadDate = AConvert(Of Date)(.Value(Name_LastDownloadDate), ADateTime.Formats.BaseDateTime, Nothing)
|
LastDownloadDate = AConvert(Of Date)(.Value(Name_LastDownloadDate), ADateTime.Formats.BaseDateTime, Nothing)
|
||||||
If Not LastDownloadDate.HasValue Then LastDownloadDate = LastUpdated
|
If Not LastDownloadDate.HasValue Then LastDownloadDate = LastUpdated
|
||||||
_TrueName = .Value(Name_TrueName)
|
_TrueName = .Value(Name_TrueName)
|
||||||
|
TitleUseRegexForTitle = .Value(Name_TitleUseRegexForTitle).FromXML(Of Boolean)(False)
|
||||||
|
TitleUseRegexForTitle_Value = .Value(Name_TitleUseRegexForTitle_Value)
|
||||||
|
TitleUseGlobalRegexOptions = .Value(Name_TitleUseGlobalRegexOptions).FromXML(Of Boolean)(True)
|
||||||
Else
|
Else
|
||||||
.Add(Name_RemoveTagsFromTitle, RemoveTagsFromTitle.BoolToInteger)
|
.Add(Name_RemoveTagsFromTitle, RemoveTagsFromTitle.BoolToInteger)
|
||||||
.Add(Name_TitleUseNative, TitleUseNative.BoolToInteger)
|
.Add(Name_TitleUseNative, TitleUseNative.BoolToInteger)
|
||||||
.Add(Name_TitleAddVideoID, TitleAddVideoID.BoolToInteger)
|
.Add(Name_TitleAddVideoID, TitleAddVideoID.BoolToInteger)
|
||||||
.Add(Name_LastDownloadDate, AConvert(Of String)(LastDownloadDate, AModes.XML, ADateTime.Formats.BaseDateTime, String.Empty))
|
.Add(Name_LastDownloadDate, AConvert(Of String)(LastDownloadDate, AModes.XML, ADateTime.Formats.BaseDateTime, String.Empty))
|
||||||
.Add(Name_TrueName, _TrueName)
|
.Add(Name_TrueName, _TrueName)
|
||||||
|
.Add(Name_TitleUseRegexForTitle, TitleUseRegexForTitle.BoolToInteger)
|
||||||
|
.Add(Name_TitleUseRegexForTitle_Value, TitleUseRegexForTitle_Value)
|
||||||
|
.Add(Name_TitleUseGlobalRegexOptions, TitleUseGlobalRegexOptions.BoolToInteger)
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
@@ -99,9 +122,43 @@ Namespace API.TikTok
|
|||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Download functions"
|
#Region "Download functions"
|
||||||
|
Private Function GetTitleRegex() As RParams
|
||||||
|
Dim titleRegex As RParams = Nothing
|
||||||
|
If TitleUseGlobalRegexOptions Then
|
||||||
|
If CBool(MySettings.TitleUseRegexForTitle.Value) AndAlso Not CStr(MySettings.TitleUseRegexForTitle_Value.Value).IsEmptyString Then _
|
||||||
|
titleRegex = RParams.DM(MySettings.TitleUseRegexForTitle_Value.Value, 0, RegexReturn.List, EDP.ReturnValue)
|
||||||
|
ElseIf TitleUseRegexForTitle And Not TitleUseRegexForTitle_Value.IsEmptyString Then
|
||||||
|
titleRegex = RParams.DM(TitleUseRegexForTitle_Value, 0, RegexReturn.List, EDP.ReturnValue)
|
||||||
|
End If
|
||||||
|
If Not titleRegex Is Nothing Then
|
||||||
|
titleRegex.NothingExists = True
|
||||||
|
titleRegex.Nothing = New List(Of String)
|
||||||
|
titleRegex.Converter = Function(input) input.StringTrim
|
||||||
|
End If
|
||||||
|
Return titleRegex
|
||||||
|
End Function
|
||||||
|
Private Function ChangeTitleRegex(ByVal Title As String, ByVal Regex As RParams) As String
|
||||||
|
Try
|
||||||
|
If Not Regex Is Nothing Then
|
||||||
|
With DirectCast(RegexReplace(Title, Regex), List(Of String))
|
||||||
|
If .ListExists Then
|
||||||
|
Dim newTitle$ = .ListToString(String.Empty, EDP.ReturnValue).StringTrim
|
||||||
|
If Not newTitle.IsEmptyString Then Return newTitle
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
End Try
|
||||||
|
Return Title
|
||||||
|
End Function
|
||||||
|
Friend Overrides Sub DownloadData(ByVal Token As CancellationToken)
|
||||||
|
MyBase.DownloadData(Token)
|
||||||
|
UserCache.DisposeIfReady(False)
|
||||||
|
UserCache = Nothing
|
||||||
|
End Sub
|
||||||
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
|
||||||
Dim URL$ = $"https://www.tiktok.com/@{TrueName}"
|
Dim URL$ = $"https://www.tiktok.com/@{TrueName}"
|
||||||
Using cache As CacheKeeper = CreateCache()
|
UserCache = CreateCache()
|
||||||
Try
|
Try
|
||||||
Dim postID$, title$, postUrl$, newName$
|
Dim postID$, title$, postUrl$, newName$
|
||||||
Dim postDate As Date?
|
Dim postDate As Date?
|
||||||
@@ -109,6 +166,7 @@ Namespace API.TikTok
|
|||||||
Dim dateBefore As Date? = DownloadDateTo
|
Dim dateBefore As Date? = DownloadDateTo
|
||||||
Dim dateAfter As Date? = DownloadDateFrom
|
Dim dateAfter As Date? = DownloadDateFrom
|
||||||
Dim baseDataObtained As Boolean = False
|
Dim baseDataObtained As Boolean = False
|
||||||
|
Dim titleRegex As RParams = GetTitleRegex()
|
||||||
|
|
||||||
If _ContentList.Count > 0 Then
|
If _ContentList.Count > 0 Then
|
||||||
With (From d In _ContentList Where d.Post.Date.HasValue Select d.Post.Date.Value)
|
With (From d In _ContentList Where d.Post.Date.HasValue Select d.Post.Date.Value)
|
||||||
@@ -136,14 +194,14 @@ Namespace API.TikTok
|
|||||||
|
|
||||||
Using b As New YTDLP.YTDLPBatch(Token) With {.TempPostsList = _TempPostsList}
|
Using b As New YTDLP.YTDLPBatch(Token) With {.TempPostsList = _TempPostsList}
|
||||||
b.Commands.Clear()
|
b.Commands.Clear()
|
||||||
b.ChangeDirectory(cache)
|
b.ChangeDirectory(UserCache)
|
||||||
b.Encoding = BatchExecutor.UnicodeEncoding
|
b.Encoding = BatchExecutor.UnicodeEncoding
|
||||||
b.Execute(CreateYTCommand(cache.RootDirectory, URL, False, dateBefore, dateAfter))
|
b.Execute(CreateYTCommand(UserCache.RootDirectory, URL, False, dateBefore, dateAfter))
|
||||||
End Using
|
End Using
|
||||||
|
|
||||||
ThrowAny(Token)
|
ThrowAny(Token)
|
||||||
|
|
||||||
Dim files As List(Of SFile) = SFile.GetFiles(cache, "*.json",, EDP.ReturnValue)
|
Dim files As List(Of SFile) = SFile.GetFiles(UserCache, "*.json",, EDP.ReturnValue)
|
||||||
If files.ListExists Then
|
If files.ListExists Then
|
||||||
Dim j As EContainer
|
Dim j As EContainer
|
||||||
For Each file As SFile In files
|
For Each file As SFile In files
|
||||||
@@ -171,6 +229,7 @@ Namespace API.TikTok
|
|||||||
Exit Sub
|
Exit Sub
|
||||||
End If
|
End If
|
||||||
title = j.Value("title").StringRemoveWinForbiddenSymbols
|
title = j.Value("title").StringRemoveWinForbiddenSymbols
|
||||||
|
If Not title.IsEmptyString Then title = Left(title, 150)
|
||||||
If title.IsEmptyString Or Not TitleUseNative Then
|
If title.IsEmptyString Or Not TitleUseNative Then
|
||||||
title = postID
|
title = postID
|
||||||
Else
|
Else
|
||||||
@@ -181,6 +240,7 @@ Namespace API.TikTok
|
|||||||
ElseIf TitleAddVideoID Then
|
ElseIf TitleAddVideoID Then
|
||||||
title &= $" ({postID})"
|
title &= $" ({postID})"
|
||||||
End If
|
End If
|
||||||
|
title = ChangeTitleRegex(title, titleRegex)
|
||||||
End If
|
End If
|
||||||
postDate = AConvert(Of Date)(j.Value("timestamp"), UnixDate32Provider, Nothing)
|
postDate = AConvert(Of Date)(j.Value("timestamp"), UnixDate32Provider, Nothing)
|
||||||
If Not postDate.HasValue Then postDate = AConvert(Of Date)(j.Value("upload_date"), SimpleDateConverter, Nothing)
|
If Not postDate.HasValue Then postDate = AConvert(Of Date)(j.Value("upload_date"), SimpleDateConverter, Nothing)
|
||||||
@@ -202,7 +262,6 @@ Namespace API.TikTok
|
|||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ProcessException(ex, Token, $"data downloading error [{URL}]")
|
ProcessException(ex, Token, $"data downloading error [{URL}]")
|
||||||
End Try
|
End Try
|
||||||
End Using
|
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "ReparseMissing"
|
#Region "ReparseMissing"
|
||||||
@@ -262,7 +321,7 @@ Namespace API.TikTok
|
|||||||
b.Encoding = BatchExecutor.UnicodeEncoding
|
b.Encoding = BatchExecutor.UnicodeEncoding
|
||||||
b.Execute(CreateYTCommand(DestinationFile, URL, True))
|
b.Execute(CreateYTCommand(DestinationFile, URL, True))
|
||||||
End Using
|
End Using
|
||||||
Return DestinationFile
|
If DestinationFile.Exists Then Return DestinationFile Else Return Nothing
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
#Region "DownloadSingleObject"
|
#Region "DownloadSingleObject"
|
||||||
@@ -292,6 +351,7 @@ Namespace API.TikTok
|
|||||||
f = f.StringTrim
|
f = f.StringTrim
|
||||||
If Not f.IsEmptyString Then
|
If Not f.IsEmptyString Then
|
||||||
If CBool(MySettings.TitleAddVideoID.Value) Then f &= $" ({m.File.Name})"
|
If CBool(MySettings.TitleAddVideoID.Value) Then f &= $" ({m.File.Name})"
|
||||||
|
f = ChangeTitleRegex(f, GetTitleRegex)
|
||||||
m.File.Name = f
|
m.File.Name = f
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
@@ -303,6 +363,15 @@ Namespace API.TikTok
|
|||||||
Optional ByVal EObj As Object = Nothing) As Integer
|
Optional ByVal EObj As Object = Nothing) As Integer
|
||||||
Return 0
|
Return 0
|
||||||
End Function
|
End Function
|
||||||
|
#End Region
|
||||||
|
#Region "IDisposable Support"
|
||||||
|
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||||
|
If Not disposedValue And disposing Then
|
||||||
|
UserCache.DisposeIfReady(False)
|
||||||
|
UserCache = Nothing
|
||||||
|
End If
|
||||||
|
MyBase.Dispose(disposing)
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -15,18 +15,29 @@ Namespace API.TikTok
|
|||||||
Friend Property TitleUseNative As Boolean
|
Friend Property TitleUseNative As Boolean
|
||||||
<PSetting(NameOf(SiteSettings.TitleAddVideoID), NameOf(MySettings))>
|
<PSetting(NameOf(SiteSettings.TitleAddVideoID), NameOf(MySettings))>
|
||||||
Friend Property TitleAddVideoID As Boolean
|
Friend Property TitleAddVideoID As Boolean
|
||||||
|
<PSetting(NameOf(SiteSettings.TitleUseRegexForTitle), NameOf(MySettings))>
|
||||||
|
Friend Property TitleUseRegexForTitle As Boolean
|
||||||
|
<PSetting(NameOf(SiteSettings.TitleUseRegexForTitle_Value), NameOf(MySettings))>
|
||||||
|
Friend Property TitleUseRegexForTitle_Value As String
|
||||||
|
<PSetting(Caption:="Use global regex", ToolTip:="Use the global regex from the site settings to clean the video title")>
|
||||||
|
Friend Property TitleUseGlobalRegexOptions As Boolean = True
|
||||||
Private ReadOnly MySettings As SiteSettings
|
Private ReadOnly MySettings As SiteSettings
|
||||||
Friend Sub New(ByVal u As UserData)
|
Friend Sub New(ByVal u As UserData)
|
||||||
MySettings = u.HOST.Source
|
MySettings = u.HOST.Source
|
||||||
RemoveTagsFromTitle = u.RemoveTagsFromTitle
|
RemoveTagsFromTitle = u.RemoveTagsFromTitle
|
||||||
TitleUseNative = u.TitleUseNative
|
TitleUseNative = u.TitleUseNative
|
||||||
TitleAddVideoID = u.TitleAddVideoID
|
TitleAddVideoID = u.TitleAddVideoID
|
||||||
|
TitleUseRegexForTitle = u.TitleUseRegexForTitle
|
||||||
|
TitleUseRegexForTitle_Value = u.TitleUseRegexForTitle_Value
|
||||||
|
TitleUseGlobalRegexOptions = u.TitleUseGlobalRegexOptions
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub New(ByVal s As SiteSettings)
|
Friend Sub New(ByVal s As SiteSettings)
|
||||||
MySettings = s
|
MySettings = s
|
||||||
RemoveTagsFromTitle = s.RemoveTagsFromTitle.Value
|
RemoveTagsFromTitle = s.RemoveTagsFromTitle.Value
|
||||||
TitleUseNative = s.TitleUseNative.Value
|
TitleUseNative = s.TitleUseNative.Value
|
||||||
TitleAddVideoID = s.TitleAddVideoID.Value
|
TitleAddVideoID = s.TitleAddVideoID.Value
|
||||||
|
TitleUseRegexForTitle = s.TitleUseRegexForTitle.Value
|
||||||
|
TitleUseRegexForTitle_Value = s.TitleUseRegexForTitle_Value.Value
|
||||||
End Sub
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ Namespace API.Twitter
|
|||||||
ConcurrentDownloads = New PropertyValue(1)
|
ConcurrentDownloads = New PropertyValue(1)
|
||||||
MyConcurrentDownloadsProvider = New ConcurrentDownloadsProvider
|
MyConcurrentDownloadsProvider = New ConcurrentDownloadsProvider
|
||||||
|
|
||||||
UserRegex = RParams.DMS("[htps:/]{7,8}.*?twitter.com/([^/]+)", 1)
|
UserRegex = RParams.DMS(String.Format(UserRegexDefaultPattern, "/(twitter|x).com/"), 2)
|
||||||
UrlPatternUser = "https://twitter.com/{0}"
|
UrlPatternUser = "https://twitter.com/{0}"
|
||||||
ImageVideoContains = "twitter"
|
ImageVideoContains = "twitter"
|
||||||
CheckNetscapeCookiesOnEndInit = True
|
CheckNetscapeCookiesOnEndInit = True
|
||||||
|
|||||||
@@ -157,7 +157,6 @@ Namespace API.Twitter
|
|||||||
Private Sub DownloadData_Timeline(ByVal Token As CancellationToken)
|
Private Sub DownloadData_Timeline(ByVal Token As CancellationToken)
|
||||||
Dim URL$ = String.Empty
|
Dim URL$ = String.Empty
|
||||||
Dim tCache As CacheKeeper = Nothing
|
Dim tCache As CacheKeeper = Nothing
|
||||||
Dim jsonArgs As New WebDocumentEventArgs With {.DeclaredError = EDP.ThrowException}
|
|
||||||
Try
|
Try
|
||||||
Const entry$ = "entry"
|
Const entry$ = "entry"
|
||||||
Dim PostID$ = String.Empty
|
Dim PostID$ = String.Empty
|
||||||
@@ -237,8 +236,7 @@ Namespace API.Twitter
|
|||||||
For i = 0 To timelineFiles.Count - 1 : timelineFiles(i) = RenameGdlFile(timelineFiles(i), i) : Next
|
For i = 0 To timelineFiles.Count - 1 : timelineFiles(i) = RenameGdlFile(timelineFiles(i), i) : Next
|
||||||
'parse files
|
'parse files
|
||||||
For i = 0 To timelineFiles.Count - 1
|
For i = 0 To timelineFiles.Count - 1
|
||||||
j = JsonDocument.Parse(timelineFiles(i).GetText, jsonArgs)
|
j = JsonDocument.Parse(timelineFiles(i).GetText)
|
||||||
jsonArgs.Reset()
|
|
||||||
If Not j Is Nothing Then
|
If Not j Is Nothing Then
|
||||||
If i = 0 Then
|
If i = 0 Then
|
||||||
If Not userInfoParsed Then
|
If Not userInfoParsed Then
|
||||||
@@ -363,7 +361,7 @@ Namespace API.Twitter
|
|||||||
End If
|
End If
|
||||||
DownloadModelForceApply = False
|
DownloadModelForceApply = False
|
||||||
FirstDownloadComplete = True
|
FirstDownloadComplete = True
|
||||||
Catch jsonNull_ex As ArgumentNullException When jsonArgs.State = WebDocumentEventArgs.States.Error
|
Catch jsonNull_ex As JsonDocumentException When jsonNull_ex.State = WebDocumentEventArgs.States.Error
|
||||||
Throw New Plugin.ExitException("No deserialized data found")
|
Throw New Plugin.ExitException("No deserialized data found")
|
||||||
Catch limit_ex As TwitterLimitException
|
Catch limit_ex As TwitterLimitException
|
||||||
Throw limit_ex
|
Throw limit_ex
|
||||||
@@ -371,7 +369,6 @@ Namespace API.Twitter
|
|||||||
ProcessException(ex, Token, $"data downloading error [{URL}]")
|
ProcessException(ex, Token, $"data downloading error [{URL}]")
|
||||||
Finally
|
Finally
|
||||||
If Not tCache Is Nothing Then tCache.Dispose()
|
If Not tCache Is Nothing Then tCache.Dispose()
|
||||||
jsonArgs.DisposeIfReady
|
|
||||||
If _TempPostsList.Count > 0 Then _TempPostsList.Sort()
|
If _TempPostsList.Count > 0 Then _TempPostsList.Sort()
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||
@@ -741,6 +741,15 @@ Namespace API
|
|||||||
Return GetEnumerator()
|
Return GetEnumerator()
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "IComparable Support"
|
||||||
|
Friend Overrides Function CompareTo(ByVal Other As UserDataBase) As Integer
|
||||||
|
If TypeOf Other Is UserDataBind Then
|
||||||
|
Return CollectionName.CompareTo(Other.CollectionName)
|
||||||
|
Else
|
||||||
|
Return -1
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
#Region "IEquatable support"
|
#Region "IEquatable support"
|
||||||
Friend Overrides Function Equals(ByVal Other As UserDataBase) As Boolean
|
Friend Overrides Function Equals(ByVal Other As UserDataBase) As Boolean
|
||||||
If Other.IsCollection Then
|
If Other.IsCollection Then
|
||||||
|
|||||||
@@ -84,10 +84,15 @@ Namespace API.Xhamster
|
|||||||
End Function
|
End Function
|
||||||
Private Shared Function ObtainUrls(ByVal URL As String, ByVal Responser As Responser, ByVal UHD As Boolean) As List(Of M3U8URL)
|
Private Shared Function ObtainUrls(ByVal URL As String, ByVal Responser As Responser, ByVal UHD As Boolean) As List(Of M3U8URL)
|
||||||
Try
|
Try
|
||||||
|
Const sk$ = "/key="
|
||||||
Dim file$ = ParseFirstM3U8(URL, Responser, UHD)
|
Dim file$ = ParseFirstM3U8(URL, Responser, UHD)
|
||||||
If Not file.IsEmptyString Then
|
If Not file.IsEmptyString Then
|
||||||
Responser.UseGZipStream = False
|
Responser.UseGZipStream = False
|
||||||
Dim appender$ = URL.Replace(URL.Split("/").LastOrDefault, String.Empty)
|
Dim appender$ = URL.Replace(URL.Split("/").LastOrDefault, String.Empty)
|
||||||
|
If file.StartsWith(sk) Then
|
||||||
|
Dim position% = InStr(URL, sk)
|
||||||
|
If position > 0 Then appender = URL.Remove(position - 1)
|
||||||
|
End If
|
||||||
URL = M3U8Base.CreateUrl(appender, file)
|
URL = M3U8Base.CreateUrl(appender, file)
|
||||||
Dim l As List(Of M3U8URL) = ParseSecondM3U8(URL, Responser, appender)
|
Dim l As List(Of M3U8URL) = ParseSecondM3U8(URL, Responser, appender)
|
||||||
If l.ListExists Then Return l
|
If l.ListExists Then Return l
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ Namespace API.YouTube
|
|||||||
Friend ReadOnly Property DownloadCommunityImages As PropertyValue
|
Friend ReadOnly Property DownloadCommunityImages As PropertyValue
|
||||||
<PXML, PropertyOption(ControlText:="Download user community: videos"), PClonable>
|
<PXML, PropertyOption(ControlText:="Download user community: videos"), PClonable>
|
||||||
Friend ReadOnly Property DownloadCommunityVideos As PropertyValue
|
Friend ReadOnly Property DownloadCommunityVideos As PropertyValue
|
||||||
|
<PXML, PropertyOption(ControlText:="Ignore community errors", ControlToolTip:="If true, community errors will not be added to the log."), PClonable>
|
||||||
|
Friend ReadOnly Property IgnoreCommunityErrors As PropertyValue
|
||||||
<PXML, PropertyOption(ControlText:="Use cookies", ControlToolTip:="Default value for new users." & vbCr & "Use cookies when downloading data."), PClonable>
|
<PXML, PropertyOption(ControlText:="Use cookies", ControlToolTip:="Default value for new users." & vbCr & "Use cookies when downloading data."), PClonable>
|
||||||
Friend ReadOnly Property UseCookies As PropertyValue
|
Friend ReadOnly Property UseCookies As PropertyValue
|
||||||
#End Region
|
#End Region
|
||||||
@@ -36,6 +38,7 @@ Namespace API.YouTube
|
|||||||
DownloadPlaylists = New PropertyValue(False)
|
DownloadPlaylists = New PropertyValue(False)
|
||||||
DownloadCommunityImages = New PropertyValue(False)
|
DownloadCommunityImages = New PropertyValue(False)
|
||||||
DownloadCommunityVideos = New PropertyValue(False)
|
DownloadCommunityVideos = New PropertyValue(False)
|
||||||
|
IgnoreCommunityErrors = New PropertyValue(False)
|
||||||
UseCookies = New PropertyValue(False)
|
UseCookies = New PropertyValue(False)
|
||||||
_SubscriptionsAllowed = True
|
_SubscriptionsAllowed = True
|
||||||
UseNetscapeCookies = True
|
UseNetscapeCookies = True
|
||||||
|
|||||||
@@ -333,7 +333,7 @@ Namespace API.YouTube
|
|||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
Else
|
ElseIf Not CBool(DirectCast(HOST.Source, SiteSettings).IgnoreCommunityErrors.Value) Then
|
||||||
With j({"error"})
|
With j({"error"})
|
||||||
If .ListExists Then MyMainLOG = $"{ToStringForLog()} {errMsg} [{ .Value("code")}]: { .Value("message")}"
|
If .ListExists Then MyMainLOG = $"{ToStringForLog()} {errMsg} [{ .Value("code")}]: { .Value("message")}"
|
||||||
End With
|
End With
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ Imports ADB = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons
|
|||||||
Imports RButton = PersonalUtilities.Forms.Toolbars.RangeSwitcherToolbar.ControlItem
|
Imports RButton = PersonalUtilities.Forms.Toolbars.RangeSwitcherToolbar.ControlItem
|
||||||
Friend Class ChannelViewForm : Implements IChannelLimits
|
Friend Class ChannelViewForm : Implements IChannelLimits
|
||||||
#Region "Events"
|
#Region "Events"
|
||||||
Friend Event OnUsersAdded(ByVal StartIndex As Integer)
|
Friend Event OnUsersAdded As UsersAddedEventHandler
|
||||||
Friend Event OnDownloadDone As NotificationEventHandler
|
Friend Event OnDownloadDone As NotificationEventHandler
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Appended user structure"
|
#Region "Appended user structure"
|
||||||
|
|||||||
BIN
SCrawler/Content/Pictures/CutPic_48.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
@@ -14,7 +14,7 @@ Imports PersonalUtilities.Functions.XML.Base
|
|||||||
Imports PersonalUtilities.Tools
|
Imports PersonalUtilities.Tools
|
||||||
Imports PersonalUtilities.Tools.Notifications
|
Imports PersonalUtilities.Tools.Notifications
|
||||||
Namespace DownloadObjects
|
Namespace DownloadObjects
|
||||||
Friend Class AutoDownloader : Inherits GroupParameters : Implements IIndexable, IEContainerProvider
|
Friend Class AutoDownloader : Inherits GroupParameters : Implements IIndexable, IEContainerProvider, IComparable(Of AutoDownloader)
|
||||||
Friend Event PauseChanged(ByVal Value As PauseModes)
|
Friend Event PauseChanged(ByVal Value As PauseModes)
|
||||||
Friend Enum Modes As Integer
|
Friend Enum Modes As Integer
|
||||||
None = 0
|
None = 0
|
||||||
@@ -39,6 +39,7 @@ Namespace DownloadObjects
|
|||||||
#Region "Notifications"
|
#Region "Notifications"
|
||||||
Private Const KeyOpenFolder As String = "_____OPEN_FOLDER_SCRAWLER_AUTOMATION"
|
Private Const KeyOpenFolder As String = "_____OPEN_FOLDER_SCRAWLER_AUTOMATION"
|
||||||
Private Const KeyOpenSite As String = "_____OPEN_SITE_SCRAWLER_AUTOMATION"
|
Private Const KeyOpenSite As String = "_____OPEN_SITE_SCRAWLER_AUTOMATION"
|
||||||
|
Private Const KeyOpenFeed As String = "_____OPEN_FEED_SCRAWLER_AUTOMATION"
|
||||||
Private Const KeyBttDismiss As String = "_____DISMISS_SCRAWLER_AUTOMATION"
|
Private Const KeyBttDismiss As String = "_____DISMISS_SCRAWLER_AUTOMATION"
|
||||||
Private Const KeyBttPhoto As String = "_____PHOTO_SCRAWLER_AUTOMATION"
|
Private Const KeyBttPhoto As String = "_____PHOTO_SCRAWLER_AUTOMATION"
|
||||||
Private ReadOnly UserKeys As List(Of NotifiedUser)
|
Private ReadOnly UserKeys As List(Of NotifiedUser)
|
||||||
@@ -48,6 +49,7 @@ Namespace DownloadObjects
|
|||||||
Private ReadOnly Property Key As String
|
Private ReadOnly Property Key As String
|
||||||
Private ReadOnly Property KeyFolder As String
|
Private ReadOnly Property KeyFolder As String
|
||||||
Private ReadOnly Property KeySite As String
|
Private ReadOnly Property KeySite As String
|
||||||
|
Private ReadOnly Property KeyFeed As String
|
||||||
Private ReadOnly Property KeyDismiss As String
|
Private ReadOnly Property KeyDismiss As String
|
||||||
Private ReadOnly Property Images As Dictionary(Of String, SFile)
|
Private ReadOnly Property Images As Dictionary(Of String, SFile)
|
||||||
Private ReadOnly Property AutoDownloaderSource As AutoDownloader
|
Private ReadOnly Property AutoDownloaderSource As AutoDownloader
|
||||||
@@ -59,6 +61,7 @@ Namespace DownloadObjects
|
|||||||
Key = _Key
|
Key = _Key
|
||||||
KeyFolder = $"{Key}{KeyOpenFolder}"
|
KeyFolder = $"{Key}{KeyOpenFolder}"
|
||||||
KeySite = $"{Key}{KeyOpenSite}"
|
KeySite = $"{Key}{KeyOpenSite}"
|
||||||
|
KeyFeed = $"{Key}{KeyOpenFeed}"
|
||||||
KeyDismiss = $"{Key}{KeyBttDismiss}"
|
KeyDismiss = $"{Key}{KeyBttDismiss}"
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub New(ByVal _Key As String, ByRef _User As IUserData, ByRef Source As AutoDownloader)
|
Friend Sub New(ByVal _Key As String, ByRef _User As IUserData, ByRef Source As AutoDownloader)
|
||||||
@@ -116,7 +119,8 @@ Namespace DownloadObjects
|
|||||||
End If
|
End If
|
||||||
Notify.Buttons = {
|
Notify.Buttons = {
|
||||||
New ToastButton(KeyFolder, "Folder"),
|
New ToastButton(KeyFolder, "Folder"),
|
||||||
New ToastButton(KeySite, "Site")
|
New ToastButton(KeySite, "Site"),
|
||||||
|
New ToastButton(KeyFeed, "Feed")
|
||||||
}
|
}
|
||||||
If Not uifKey.IsEmptyString Then Notify.Buttons = {New ToastButton(uifKey, "Photo")}
|
If Not uifKey.IsEmptyString Then Notify.Buttons = {New ToastButton(uifKey, "Photo")}
|
||||||
Notify.Buttons = {New ToastButton(KeyDismiss, "Dismiss")}
|
Notify.Buttons = {New ToastButton(KeyDismiss, "Dismiss")}
|
||||||
@@ -149,6 +153,8 @@ Namespace DownloadObjects
|
|||||||
End If
|
End If
|
||||||
ElseIf KeySite = _Key Then
|
ElseIf KeySite = _Key Then
|
||||||
User.OpenSite()
|
User.OpenSite()
|
||||||
|
ElseIf KeyFeed = _Key Then
|
||||||
|
With MainFrameObj : ControlInvokeFast(.MF, AddressOf .MF.ShowFeed, EDP.LogMessageValue) : End With
|
||||||
ElseIf Images.ContainsKey(_Key) Then
|
ElseIf Images.ContainsKey(_Key) Then
|
||||||
Images(_Key).Open()
|
Images(_Key).Open()
|
||||||
End If
|
End If
|
||||||
@@ -159,7 +165,7 @@ Namespace DownloadObjects
|
|||||||
End Function
|
End Function
|
||||||
Public Overrides Function Equals(ByVal Obj As Object) As Boolean
|
Public Overrides Function Equals(ByVal Obj As Object) As Boolean
|
||||||
With CType(Obj, NotifiedUser)
|
With CType(Obj, NotifiedUser)
|
||||||
Return .Key = Key Or .Key = KeyFolder Or .Key = KeySite Or .Key = KeyDismiss Or Images.ContainsKey(.Key)
|
Return .Key = Key Or .Key = KeyFolder Or .Key = KeySite Or .Key = KeyFeed Or .Key = KeyDismiss Or Images.ContainsKey(.Key)
|
||||||
End With
|
End With
|
||||||
End Function
|
End Function
|
||||||
#Region "IDisposable Support"
|
#Region "IDisposable Support"
|
||||||
@@ -213,7 +219,7 @@ Namespace DownloadObjects
|
|||||||
Friend Property ShowPictureDownloaded As Boolean = True
|
Friend Property ShowPictureDownloaded As Boolean = True
|
||||||
Friend Property ShowPictureUser As Boolean = True
|
Friend Property ShowPictureUser As Boolean = True
|
||||||
Friend Property ShowSimpleNotification As Boolean = False
|
Friend Property ShowSimpleNotification As Boolean = False
|
||||||
Private Property Index As Integer = -1 Implements IIndexable.Index
|
Friend Property Index As Integer = -1 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
|
||||||
DirectCast(Obj, AutoDownloader).Index = Index
|
DirectCast(Obj, AutoDownloader).Index = Index
|
||||||
Return Obj
|
Return Obj
|
||||||
@@ -519,6 +525,7 @@ Namespace DownloadObjects
|
|||||||
Dim users As New List(Of IUserData)
|
Dim users As New List(Of IUserData)
|
||||||
Dim GName$
|
Dim GName$
|
||||||
Dim i%
|
Dim i%
|
||||||
|
Dim doRound% = -1, doLim% = Settings.Plugins.Count
|
||||||
Dim DownloadedUsersCount% = 0
|
Dim DownloadedUsersCount% = 0
|
||||||
Dim DownloadedSubscriptionsCount% = 0
|
Dim DownloadedSubscriptionsCount% = 0
|
||||||
Dim simple As Boolean = ShowSimpleNotification And ShowNotifications
|
Dim simple As Boolean = ShowSimpleNotification And ShowNotifications
|
||||||
@@ -594,7 +601,7 @@ Namespace DownloadObjects
|
|||||||
With Downloader
|
With Downloader
|
||||||
.AutoDownloaderWorking = True
|
.AutoDownloaderWorking = True
|
||||||
If .Downloaded.Count > 0 Then .Downloaded.RemoveAll(Function(u) Keys.Contains(u.Key)) : .InvokeDownloadsChangeEvent()
|
If .Downloaded.Count > 0 Then .Downloaded.RemoveAll(Function(u) Keys.Contains(u.Key)) : .InvokeDownloadsChangeEvent()
|
||||||
.AddRange(users, True)
|
Do : Try : doRound += 1 : .AddRange(users, True) : Exit Do : Catch iex As IndexOutOfRangeException : Thread.Sleep(200) : End Try : Loop While doRound < doLim
|
||||||
While .Working Or .Count > 0 : notify.Invoke() : Thread.Sleep(200) : End While
|
While .Working Or .Count > 0 : notify.Invoke() : Thread.Sleep(200) : End While
|
||||||
.AutoDownloaderWorking = False
|
.AutoDownloaderWorking = False
|
||||||
notify.Invoke
|
notify.Invoke
|
||||||
@@ -640,6 +647,11 @@ Namespace DownloadObjects
|
|||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "IComparable Support"
|
||||||
|
Private Function CompareTo(ByVal Other As AutoDownloader) As Integer Implements IComparable(Of AutoDownloader).CompareTo
|
||||||
|
Return Index.CompareTo(Other.Index)
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
#Region "IDisposable Support"
|
#Region "IDisposable Support"
|
||||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||||
If Not disposedValue And disposing Then
|
If Not disposedValue And disposing Then
|
||||||
|
|||||||
@@ -38,7 +38,13 @@ Namespace DownloadObjects
|
|||||||
End Property
|
End Property
|
||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
Plans = New List(Of AutoDownloader)
|
Plans = New List(Of AutoDownloader)
|
||||||
File = Settings.AutomationFile.Value.IfNullOrEmpty(FileDefault)
|
Dim sFolder As SFile = SettingsFolderName.CSFileP
|
||||||
|
File = New SFile(Settings.AutomationFile.Value.IfNullOrEmpty(FileDefault.ToString))
|
||||||
|
If File.Path.IsEmptyString OrElse Not File.Path.StartsWith(sFolder.Path) Then
|
||||||
|
Dim updateSetting As Boolean = File.Path.IsEmptyString OrElse Not File.Path.StartsWith(sFolder.CutPath.Path)
|
||||||
|
File.Path = sFolder.Path
|
||||||
|
If File.Exists And updateSetting Then Settings.AutomationFile.Value = File.File
|
||||||
|
End If
|
||||||
If Not File.Exists Then File = FileDefault
|
If Not File.Exists Then File = FileDefault
|
||||||
Reset(File, True)
|
Reset(File, True)
|
||||||
End Sub
|
End Sub
|
||||||
@@ -129,6 +135,25 @@ Namespace DownloadObjects
|
|||||||
End If
|
End If
|
||||||
Return True
|
Return True
|
||||||
End Function
|
End Function
|
||||||
|
Friend Function Move(ByVal Index As Integer, ByVal Up As Boolean) As Integer
|
||||||
|
Try
|
||||||
|
If Index.ValueBetween(0, Count - 1) Then
|
||||||
|
Plans.ListReindex
|
||||||
|
Dim v% = IIf(Up, -1, 1)
|
||||||
|
Dim newIndx%
|
||||||
|
Item(Index).Index += v
|
||||||
|
newIndx = Item(Index).Index
|
||||||
|
If newIndx.ValueBetween(0, Count - 1) Then Item(newIndx).Index += v * -1
|
||||||
|
Plans.Sort()
|
||||||
|
Plans.ListReindex
|
||||||
|
Update()
|
||||||
|
Return newIndx
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[Scheduler.Move]")
|
||||||
|
End Try
|
||||||
|
Return -1
|
||||||
|
End Function
|
||||||
#Region "Groups Support"
|
#Region "Groups Support"
|
||||||
Friend Sub GROUPS_Updated(ByVal Sender As DownloadGroup)
|
Friend Sub GROUPS_Updated(ByVal Sender As DownloadGroup)
|
||||||
If Count > 0 Then Plans.ForEach(Sub(p) p.GROUPS_Updated(Sender))
|
If Count > 0 Then Plans.ForEach(Sub(p) p.GROUPS_Updated(Sender))
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ Namespace DownloadObjects
|
|||||||
Private WithEvents BTT_START_FORCE As ToolStripButton
|
Private WithEvents BTT_START_FORCE As ToolStripButton
|
||||||
Private WithEvents BTT_PAUSE As ToolStripDropDownButton
|
Private WithEvents BTT_PAUSE As ToolStripDropDownButton
|
||||||
Private WithEvents PauseArr As AutoDownloaderPauseButtons
|
Private WithEvents PauseArr As AutoDownloaderPauseButtons
|
||||||
|
Private WithEvents BTT_MOVE_UP As ToolStripButton
|
||||||
|
Private WithEvents BTT_MOVE_DOWN As ToolStripButton
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Initializer"
|
#Region "Initializer"
|
||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
@@ -98,6 +100,18 @@ Namespace DownloadObjects
|
|||||||
.ToolTipText = "Pause task",
|
.ToolTipText = "Pause task",
|
||||||
.AutoToolTip = True
|
.AutoToolTip = True
|
||||||
}
|
}
|
||||||
|
BTT_MOVE_UP = New ToolStripButton With {
|
||||||
|
.Text = String.Empty,
|
||||||
|
.Image = PersonalUtilities.My.Resources.ArrowUpPic_Blue_32,
|
||||||
|
.ToolTipText = "Move the selected task higher in the list",
|
||||||
|
.AutoToolTip = True
|
||||||
|
}
|
||||||
|
BTT_MOVE_DOWN = New ToolStripButton With {
|
||||||
|
.Text = String.Empty,
|
||||||
|
.Image = PersonalUtilities.My.Resources.ArrowDownPic_Blue_32,
|
||||||
|
.ToolTipText = "Move the selected task lower in the list",
|
||||||
|
.AutoToolTip = True
|
||||||
|
}
|
||||||
PauseArr = New AutoDownloaderPauseButtons(AutoDownloaderPauseButtons.ButtonsPlace.Scheduler) With {
|
PauseArr = New AutoDownloaderPauseButtons(AutoDownloaderPauseButtons.ButtonsPlace.Scheduler) With {
|
||||||
.MainFrameButtonsInstance = MainFrameObj.PauseButtons}
|
.MainFrameButtonsInstance = MainFrameObj.PauseButtons}
|
||||||
Icon = ImageRenderer.GetIcon(My.Resources.ScriptPic_32, EDP.ReturnValue)
|
Icon = ImageRenderer.GetIcon(My.Resources.ScriptPic_32, EDP.ReturnValue)
|
||||||
@@ -108,6 +122,7 @@ Namespace DownloadObjects
|
|||||||
With MyDefs
|
With MyDefs
|
||||||
.MyViewInitialize()
|
.MyViewInitialize()
|
||||||
.AddEditToolbar({BTT_SETTINGS, ECI.Separator, ECI.Add, BTT_CLONE, ECI.Edit, ECI.Delete, ECI.Update, ECI.Separator,
|
.AddEditToolbar({BTT_SETTINGS, ECI.Separator, ECI.Add, BTT_CLONE, ECI.Edit, ECI.Delete, ECI.Update, ECI.Separator,
|
||||||
|
BTT_MOVE_UP, BTT_MOVE_DOWN, ECI.Separator,
|
||||||
BTT_START, BTT_START_FORCE, MENU_SKIP, BTT_PAUSE})
|
BTT_START, BTT_START_FORCE, MENU_SKIP, BTT_PAUSE})
|
||||||
PauseArr.AddButtons(BTT_PAUSE, .MyEditToolbar.ToolStrip)
|
PauseArr.AddButtons(BTT_PAUSE, .MyEditToolbar.ToolStrip)
|
||||||
Refill()
|
Refill()
|
||||||
@@ -264,9 +279,9 @@ Namespace DownloadObjects
|
|||||||
If Not Settings.Automation.File = f AndAlso Settings.Automation.Reset(f, False) Then
|
If Not Settings.Automation.File = f AndAlso Settings.Automation.Reset(f, False) Then
|
||||||
Settings.Automation.File = f
|
Settings.Automation.File = f
|
||||||
If selectedName = defName Then
|
If selectedName = defName Then
|
||||||
Settings.AutomationFile.Value = Nothing
|
Settings.AutomationFile.Value = String.Empty
|
||||||
Else
|
Else
|
||||||
Settings.AutomationFile.Value = f
|
Settings.AutomationFile.Value = f.File
|
||||||
End If
|
End If
|
||||||
PauseArr.UpdatePauseButtons()
|
PauseArr.UpdatePauseButtons()
|
||||||
Refill()
|
Refill()
|
||||||
@@ -332,6 +347,15 @@ Namespace DownloadObjects
|
|||||||
Private Sub PauseArr_Updating() Handles PauseArr.Updating
|
Private Sub PauseArr_Updating() Handles PauseArr.Updating
|
||||||
Refill()
|
Refill()
|
||||||
End Sub
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Move"
|
||||||
|
Private Sub BTT_MOVE_UP_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_MOVE_UP.Click, BTT_MOVE_DOWN.Click
|
||||||
|
If _LatestSelected.ValueBetween(0, LIST_PLANS.Items.Count - 1) Then
|
||||||
|
Dim v% = Settings.Automation.Move(_LatestSelected, sender Is BTT_MOVE_UP)
|
||||||
|
If v >= 0 Then _LatestSelected = v
|
||||||
|
Refill()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
134
SCrawler/Download/Feed/DownloadFeedForm.Designer.vb
generated
@@ -31,6 +31,9 @@ Namespace DownloadObjects
|
|||||||
Dim MENU_LOAD_SEP_3 As System.Windows.Forms.ToolStripSeparator
|
Dim MENU_LOAD_SEP_3 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim MENU_LOAD_SEP_4 As System.Windows.Forms.ToolStripSeparator
|
Dim MENU_LOAD_SEP_4 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim MENU_LOAD_SEP_5 As System.Windows.Forms.ToolStripSeparator
|
Dim MENU_LOAD_SEP_5 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Dim MENU_LOAD_SEP_6 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Dim MENU_LOAD_SEP_7 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Dim MENU_LOAD_SEP_0 As System.Windows.Forms.ToolStripSeparator
|
||||||
Me.OPT_DEFAULT = New System.Windows.Forms.ToolStripMenuItem()
|
Me.OPT_DEFAULT = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.OPT_SUBSCRIPTIONS = New System.Windows.Forms.ToolStripMenuItem()
|
Me.OPT_SUBSCRIPTIONS = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.ToolbarTOP = New System.Windows.Forms.ToolStrip()
|
Me.ToolbarTOP = New System.Windows.Forms.ToolStrip()
|
||||||
@@ -38,11 +41,15 @@ Namespace DownloadObjects
|
|||||||
Me.BTT_LOAD_SESSION_CURRENT = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_LOAD_SESSION_CURRENT = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_LOAD_SESSION_LAST = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_LOAD_SESSION_LAST = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_LOAD_SESSION_CHOOSE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_LOAD_SESSION_CHOOSE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_COPY_TO = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_MOVE_TO = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_LOAD_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_LOAD_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_LOAD_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_LOAD_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_FEED_ADD_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_FEED_ADD_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_FEED_REMOVE_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_FEED_REMOVE_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_FEED_ADD_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_FEED_ADD_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_FEED_REMOVE_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_FEED_REMOVE_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_FEED_CLEAR_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_FEED_CLEAR_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_FEED_CLEAR_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_FEED_CLEAR_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
@@ -51,6 +58,9 @@ Namespace DownloadObjects
|
|||||||
Me.BTT_FEED_DELETE_DAILY_DATE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_FEED_DELETE_DAILY_DATE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_MERGE_SESSIONS = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_MERGE_SESSIONS = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CLEAR_DAILY = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CLEAR_DAILY = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_MERGE_FEEDS = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_CHECK_ALL = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_CHECK_NONE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.SEP_0 = New System.Windows.Forms.ToolStripSeparator()
|
Me.SEP_0 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.MENU_DOWN = New System.Windows.Forms.ToolStripDropDownButton()
|
Me.MENU_DOWN = New System.Windows.Forms.ToolStripDropDownButton()
|
||||||
Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
@@ -65,6 +75,9 @@ Namespace DownloadObjects
|
|||||||
MENU_LOAD_SEP_3 = New System.Windows.Forms.ToolStripSeparator()
|
MENU_LOAD_SEP_3 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
MENU_LOAD_SEP_4 = New System.Windows.Forms.ToolStripSeparator()
|
MENU_LOAD_SEP_4 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
MENU_LOAD_SEP_5 = New System.Windows.Forms.ToolStripSeparator()
|
MENU_LOAD_SEP_5 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
|
MENU_LOAD_SEP_6 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
|
MENU_LOAD_SEP_7 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
|
MENU_LOAD_SEP_0 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.ToolbarTOP.SuspendLayout()
|
Me.ToolbarTOP.SuspendLayout()
|
||||||
Me.SuspendLayout()
|
Me.SuspendLayout()
|
||||||
'
|
'
|
||||||
@@ -103,27 +116,42 @@ Namespace DownloadObjects
|
|||||||
'MENU_LOAD_SEP_1
|
'MENU_LOAD_SEP_1
|
||||||
'
|
'
|
||||||
MENU_LOAD_SEP_1.Name = "MENU_LOAD_SEP_1"
|
MENU_LOAD_SEP_1.Name = "MENU_LOAD_SEP_1"
|
||||||
MENU_LOAD_SEP_1.Size = New System.Drawing.Size(264, 6)
|
MENU_LOAD_SEP_1.Size = New System.Drawing.Size(349, 6)
|
||||||
'
|
'
|
||||||
'MENU_LOAD_SEP_2
|
'MENU_LOAD_SEP_2
|
||||||
'
|
'
|
||||||
MENU_LOAD_SEP_2.Name = "MENU_LOAD_SEP_2"
|
MENU_LOAD_SEP_2.Name = "MENU_LOAD_SEP_2"
|
||||||
MENU_LOAD_SEP_2.Size = New System.Drawing.Size(264, 6)
|
MENU_LOAD_SEP_2.Size = New System.Drawing.Size(349, 6)
|
||||||
'
|
'
|
||||||
'MENU_LOAD_SEP_3
|
'MENU_LOAD_SEP_3
|
||||||
'
|
'
|
||||||
MENU_LOAD_SEP_3.Name = "MENU_LOAD_SEP_3"
|
MENU_LOAD_SEP_3.Name = "MENU_LOAD_SEP_3"
|
||||||
MENU_LOAD_SEP_3.Size = New System.Drawing.Size(264, 6)
|
MENU_LOAD_SEP_3.Size = New System.Drawing.Size(349, 6)
|
||||||
'
|
'
|
||||||
'MENU_LOAD_SEP_4
|
'MENU_LOAD_SEP_4
|
||||||
'
|
'
|
||||||
MENU_LOAD_SEP_4.Name = "MENU_LOAD_SEP_4"
|
MENU_LOAD_SEP_4.Name = "MENU_LOAD_SEP_4"
|
||||||
MENU_LOAD_SEP_4.Size = New System.Drawing.Size(264, 6)
|
MENU_LOAD_SEP_4.Size = New System.Drawing.Size(349, 6)
|
||||||
'
|
'
|
||||||
'MENU_LOAD_SEP_5
|
'MENU_LOAD_SEP_5
|
||||||
'
|
'
|
||||||
MENU_LOAD_SEP_5.Name = "MENU_LOAD_SEP_5"
|
MENU_LOAD_SEP_5.Name = "MENU_LOAD_SEP_5"
|
||||||
MENU_LOAD_SEP_5.Size = New System.Drawing.Size(264, 6)
|
MENU_LOAD_SEP_5.Size = New System.Drawing.Size(349, 6)
|
||||||
|
'
|
||||||
|
'MENU_LOAD_SEP_6
|
||||||
|
'
|
||||||
|
MENU_LOAD_SEP_6.Name = "MENU_LOAD_SEP_6"
|
||||||
|
MENU_LOAD_SEP_6.Size = New System.Drawing.Size(349, 6)
|
||||||
|
'
|
||||||
|
'MENU_LOAD_SEP_7
|
||||||
|
'
|
||||||
|
MENU_LOAD_SEP_7.Name = "MENU_LOAD_SEP_7"
|
||||||
|
MENU_LOAD_SEP_7.Size = New System.Drawing.Size(349, 6)
|
||||||
|
'
|
||||||
|
'MENU_LOAD_SEP_0
|
||||||
|
'
|
||||||
|
MENU_LOAD_SEP_0.Name = "MENU_LOAD_SEP_0"
|
||||||
|
MENU_LOAD_SEP_0.Size = New System.Drawing.Size(349, 6)
|
||||||
'
|
'
|
||||||
'ToolbarTOP
|
'ToolbarTOP
|
||||||
'
|
'
|
||||||
@@ -136,8 +164,9 @@ Namespace DownloadObjects
|
|||||||
'
|
'
|
||||||
'MENU_LOAD_SESSION
|
'MENU_LOAD_SESSION
|
||||||
'
|
'
|
||||||
|
Me.MENU_LOAD_SESSION.AutoToolTip = False
|
||||||
Me.MENU_LOAD_SESSION.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
|
Me.MENU_LOAD_SESSION.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
|
||||||
Me.MENU_LOAD_SESSION.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_LOAD_SESSION_CURRENT, Me.BTT_LOAD_SESSION_LAST, Me.BTT_LOAD_SESSION_CHOOSE, MENU_LOAD_SEP_1, Me.BTT_LOAD_FAV, Me.BTT_LOAD_SPEC, MENU_LOAD_SEP_2, Me.BTT_FEED_ADD_FAV, Me.BTT_FEED_REMOVE_FAV, MENU_LOAD_SEP_3, Me.BTT_FEED_ADD_SPEC, Me.BTT_FEED_REMOVE_SPEC, MENU_LOAD_SEP_4, Me.BTT_FEED_CLEAR_FAV, Me.BTT_FEED_CLEAR_SPEC, Me.BTT_FEED_DELETE_SPEC, Me.BTT_FEED_DELETE_DAILY_LIST, Me.BTT_FEED_DELETE_DAILY_DATE, MENU_LOAD_SEP_5, Me.BTT_MERGE_SESSIONS, Me.BTT_CLEAR_DAILY})
|
Me.MENU_LOAD_SESSION.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_LOAD_SESSION_CURRENT, Me.BTT_LOAD_SESSION_LAST, Me.BTT_LOAD_SESSION_CHOOSE, MENU_LOAD_SEP_0, Me.BTT_COPY_TO, Me.BTT_MOVE_TO, MENU_LOAD_SEP_1, Me.BTT_LOAD_FAV, Me.BTT_LOAD_SPEC, MENU_LOAD_SEP_2, Me.BTT_FEED_ADD_FAV, Me.BTT_FEED_ADD_FAV_REMOVE, Me.BTT_FEED_REMOVE_FAV, MENU_LOAD_SEP_3, Me.BTT_FEED_ADD_SPEC, Me.BTT_FEED_ADD_SPEC_REMOVE, Me.BTT_FEED_REMOVE_SPEC, MENU_LOAD_SEP_4, Me.BTT_FEED_CLEAR_FAV, Me.BTT_FEED_CLEAR_SPEC, Me.BTT_FEED_DELETE_SPEC, Me.BTT_FEED_DELETE_DAILY_LIST, Me.BTT_FEED_DELETE_DAILY_DATE, MENU_LOAD_SEP_5, Me.BTT_MERGE_SESSIONS, Me.BTT_CLEAR_DAILY, MENU_LOAD_SEP_6, Me.BTT_MERGE_FEEDS, MENU_LOAD_SEP_7, Me.BTT_CHECK_ALL, Me.BTT_CHECK_NONE})
|
||||||
Me.MENU_LOAD_SESSION.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
|
Me.MENU_LOAD_SESSION.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
|
||||||
Me.MENU_LOAD_SESSION.ImageTransparentColor = System.Drawing.Color.Magenta
|
Me.MENU_LOAD_SESSION.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
Me.MENU_LOAD_SESSION.Name = "MENU_LOAD_SESSION"
|
Me.MENU_LOAD_SESSION.Name = "MENU_LOAD_SESSION"
|
||||||
@@ -148,98 +177,126 @@ Namespace DownloadObjects
|
|||||||
'
|
'
|
||||||
Me.BTT_LOAD_SESSION_CURRENT.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
|
Me.BTT_LOAD_SESSION_CURRENT.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
|
||||||
Me.BTT_LOAD_SESSION_CURRENT.Name = "BTT_LOAD_SESSION_CURRENT"
|
Me.BTT_LOAD_SESSION_CURRENT.Name = "BTT_LOAD_SESSION_CURRENT"
|
||||||
Me.BTT_LOAD_SESSION_CURRENT.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_LOAD_SESSION_CURRENT.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_LOAD_SESSION_CURRENT.Text = "Load current session"
|
Me.BTT_LOAD_SESSION_CURRENT.Text = "Load current session"
|
||||||
'
|
'
|
||||||
'BTT_LOAD_SESSION_LAST
|
'BTT_LOAD_SESSION_LAST
|
||||||
'
|
'
|
||||||
Me.BTT_LOAD_SESSION_LAST.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
|
Me.BTT_LOAD_SESSION_LAST.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
|
||||||
Me.BTT_LOAD_SESSION_LAST.Name = "BTT_LOAD_SESSION_LAST"
|
Me.BTT_LOAD_SESSION_LAST.Name = "BTT_LOAD_SESSION_LAST"
|
||||||
Me.BTT_LOAD_SESSION_LAST.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_LOAD_SESSION_LAST.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_LOAD_SESSION_LAST.Text = "Load last session"
|
Me.BTT_LOAD_SESSION_LAST.Text = "Load last session"
|
||||||
'
|
'
|
||||||
'BTT_LOAD_SESSION_CHOOSE
|
'BTT_LOAD_SESSION_CHOOSE
|
||||||
'
|
'
|
||||||
Me.BTT_LOAD_SESSION_CHOOSE.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
|
Me.BTT_LOAD_SESSION_CHOOSE.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
|
||||||
Me.BTT_LOAD_SESSION_CHOOSE.Name = "BTT_LOAD_SESSION_CHOOSE"
|
Me.BTT_LOAD_SESSION_CHOOSE.Name = "BTT_LOAD_SESSION_CHOOSE"
|
||||||
Me.BTT_LOAD_SESSION_CHOOSE.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_LOAD_SESSION_CHOOSE.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_LOAD_SESSION_CHOOSE.Text = "Select loading session"
|
Me.BTT_LOAD_SESSION_CHOOSE.Text = "Select loading session"
|
||||||
'
|
'
|
||||||
|
'BTT_COPY_TO
|
||||||
|
'
|
||||||
|
Me.BTT_COPY_TO.Image = Global.SCrawler.My.Resources.Resources.PastePic_32
|
||||||
|
Me.BTT_COPY_TO.Name = "BTT_COPY_TO"
|
||||||
|
Me.BTT_COPY_TO.Size = New System.Drawing.Size(352, 22)
|
||||||
|
Me.BTT_COPY_TO.Text = "Copy checked to..."
|
||||||
|
'
|
||||||
|
'BTT_MOVE_TO
|
||||||
|
'
|
||||||
|
Me.BTT_MOVE_TO.Image = Global.SCrawler.My.Resources.Resources.CutPic_48
|
||||||
|
Me.BTT_MOVE_TO.Name = "BTT_MOVE_TO"
|
||||||
|
Me.BTT_MOVE_TO.Size = New System.Drawing.Size(352, 22)
|
||||||
|
Me.BTT_MOVE_TO.Text = "Move checked to..."
|
||||||
|
'
|
||||||
'BTT_LOAD_FAV
|
'BTT_LOAD_FAV
|
||||||
'
|
'
|
||||||
Me.BTT_LOAD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
|
Me.BTT_LOAD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
|
||||||
Me.BTT_LOAD_FAV.Name = "BTT_LOAD_FAV"
|
Me.BTT_LOAD_FAV.Name = "BTT_LOAD_FAV"
|
||||||
Me.BTT_LOAD_FAV.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_LOAD_FAV.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_LOAD_FAV.Text = "Load Favorite"
|
Me.BTT_LOAD_FAV.Text = "Load Favorite"
|
||||||
'
|
'
|
||||||
'BTT_LOAD_SPEC
|
'BTT_LOAD_SPEC
|
||||||
'
|
'
|
||||||
Me.BTT_LOAD_SPEC.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
|
Me.BTT_LOAD_SPEC.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
|
||||||
Me.BTT_LOAD_SPEC.Name = "BTT_LOAD_SPEC"
|
Me.BTT_LOAD_SPEC.Name = "BTT_LOAD_SPEC"
|
||||||
Me.BTT_LOAD_SPEC.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_LOAD_SPEC.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_LOAD_SPEC.Text = "Load special feed"
|
Me.BTT_LOAD_SPEC.Text = "Load special feed"
|
||||||
'
|
'
|
||||||
'BTT_FEED_ADD_FAV
|
'BTT_FEED_ADD_FAV
|
||||||
'
|
'
|
||||||
Me.BTT_FEED_ADD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
|
Me.BTT_FEED_ADD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
|
||||||
Me.BTT_FEED_ADD_FAV.Name = "BTT_FEED_ADD_FAV"
|
Me.BTT_FEED_ADD_FAV.Name = "BTT_FEED_ADD_FAV"
|
||||||
Me.BTT_FEED_ADD_FAV.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_FEED_ADD_FAV.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_FEED_ADD_FAV.Text = "Add checked to Favorite"
|
Me.BTT_FEED_ADD_FAV.Text = "Add checked to Favorite"
|
||||||
'
|
'
|
||||||
|
'BTT_FEED_ADD_FAV_REMOVE
|
||||||
|
'
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE.Name = "BTT_FEED_ADD_FAV_REMOVE"
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE.Size = New System.Drawing.Size(352, 22)
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE.Text = "Add checked to Favorite (remove from current)"
|
||||||
|
'
|
||||||
'BTT_FEED_REMOVE_FAV
|
'BTT_FEED_REMOVE_FAV
|
||||||
'
|
'
|
||||||
Me.BTT_FEED_REMOVE_FAV.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
Me.BTT_FEED_REMOVE_FAV.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
||||||
Me.BTT_FEED_REMOVE_FAV.Name = "BTT_FEED_REMOVE_FAV"
|
Me.BTT_FEED_REMOVE_FAV.Name = "BTT_FEED_REMOVE_FAV"
|
||||||
Me.BTT_FEED_REMOVE_FAV.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_FEED_REMOVE_FAV.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_FEED_REMOVE_FAV.Text = "Remove checked from Favorite"
|
Me.BTT_FEED_REMOVE_FAV.Text = "Remove checked from Favorite"
|
||||||
'
|
'
|
||||||
'BTT_FEED_ADD_SPEC
|
'BTT_FEED_ADD_SPEC
|
||||||
'
|
'
|
||||||
Me.BTT_FEED_ADD_SPEC.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
|
Me.BTT_FEED_ADD_SPEC.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
|
||||||
Me.BTT_FEED_ADD_SPEC.Name = "BTT_FEED_ADD_SPEC"
|
Me.BTT_FEED_ADD_SPEC.Name = "BTT_FEED_ADD_SPEC"
|
||||||
Me.BTT_FEED_ADD_SPEC.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_FEED_ADD_SPEC.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_FEED_ADD_SPEC.Text = "Add checked to special feed..."
|
Me.BTT_FEED_ADD_SPEC.Text = "Add checked to special feed..."
|
||||||
'
|
'
|
||||||
|
'BTT_FEED_ADD_SPEC_REMOVE
|
||||||
|
'
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE.Name = "BTT_FEED_ADD_SPEC_REMOVE"
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE.Size = New System.Drawing.Size(352, 22)
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE.Text = "Add checked to special feed (remove from current)..."
|
||||||
|
'
|
||||||
'BTT_FEED_REMOVE_SPEC
|
'BTT_FEED_REMOVE_SPEC
|
||||||
'
|
'
|
||||||
Me.BTT_FEED_REMOVE_SPEC.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
Me.BTT_FEED_REMOVE_SPEC.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
||||||
Me.BTT_FEED_REMOVE_SPEC.Name = "BTT_FEED_REMOVE_SPEC"
|
Me.BTT_FEED_REMOVE_SPEC.Name = "BTT_FEED_REMOVE_SPEC"
|
||||||
Me.BTT_FEED_REMOVE_SPEC.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_FEED_REMOVE_SPEC.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_FEED_REMOVE_SPEC.Text = "Remove checked from special feed..."
|
Me.BTT_FEED_REMOVE_SPEC.Text = "Remove checked from special feed..."
|
||||||
'
|
'
|
||||||
'BTT_FEED_CLEAR_FAV
|
'BTT_FEED_CLEAR_FAV
|
||||||
'
|
'
|
||||||
Me.BTT_FEED_CLEAR_FAV.Image = Global.SCrawler.My.Resources.Resources.BrushToolPic_16
|
Me.BTT_FEED_CLEAR_FAV.Image = Global.SCrawler.My.Resources.Resources.BrushToolPic_16
|
||||||
Me.BTT_FEED_CLEAR_FAV.Name = "BTT_FEED_CLEAR_FAV"
|
Me.BTT_FEED_CLEAR_FAV.Name = "BTT_FEED_CLEAR_FAV"
|
||||||
Me.BTT_FEED_CLEAR_FAV.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_FEED_CLEAR_FAV.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_FEED_CLEAR_FAV.Text = "Clear Favorite"
|
Me.BTT_FEED_CLEAR_FAV.Text = "Clear Favorite"
|
||||||
'
|
'
|
||||||
'BTT_FEED_CLEAR_SPEC
|
'BTT_FEED_CLEAR_SPEC
|
||||||
'
|
'
|
||||||
Me.BTT_FEED_CLEAR_SPEC.Image = Global.SCrawler.My.Resources.Resources.BrushToolPic_16
|
Me.BTT_FEED_CLEAR_SPEC.Image = Global.SCrawler.My.Resources.Resources.BrushToolPic_16
|
||||||
Me.BTT_FEED_CLEAR_SPEC.Name = "BTT_FEED_CLEAR_SPEC"
|
Me.BTT_FEED_CLEAR_SPEC.Name = "BTT_FEED_CLEAR_SPEC"
|
||||||
Me.BTT_FEED_CLEAR_SPEC.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_FEED_CLEAR_SPEC.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_FEED_CLEAR_SPEC.Text = "Clear special feed..."
|
Me.BTT_FEED_CLEAR_SPEC.Text = "Clear special feed..."
|
||||||
'
|
'
|
||||||
'BTT_FEED_DELETE_SPEC
|
'BTT_FEED_DELETE_SPEC
|
||||||
'
|
'
|
||||||
Me.BTT_FEED_DELETE_SPEC.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
Me.BTT_FEED_DELETE_SPEC.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
||||||
Me.BTT_FEED_DELETE_SPEC.Name = "BTT_FEED_DELETE_SPEC"
|
Me.BTT_FEED_DELETE_SPEC.Name = "BTT_FEED_DELETE_SPEC"
|
||||||
Me.BTT_FEED_DELETE_SPEC.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_FEED_DELETE_SPEC.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_FEED_DELETE_SPEC.Text = "Delete special feed..."
|
Me.BTT_FEED_DELETE_SPEC.Text = "Delete special feed..."
|
||||||
'
|
'
|
||||||
'BTT_FEED_DELETE_DAILY_LIST
|
'BTT_FEED_DELETE_DAILY_LIST
|
||||||
'
|
'
|
||||||
Me.BTT_FEED_DELETE_DAILY_LIST.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
Me.BTT_FEED_DELETE_DAILY_LIST.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
||||||
Me.BTT_FEED_DELETE_DAILY_LIST.Name = "BTT_FEED_DELETE_DAILY_LIST"
|
Me.BTT_FEED_DELETE_DAILY_LIST.Name = "BTT_FEED_DELETE_DAILY_LIST"
|
||||||
Me.BTT_FEED_DELETE_DAILY_LIST.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_FEED_DELETE_DAILY_LIST.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_FEED_DELETE_DAILY_LIST.Text = "Delete daily feed (by list)"
|
Me.BTT_FEED_DELETE_DAILY_LIST.Text = "Delete daily feed (by list)"
|
||||||
'
|
'
|
||||||
'BTT_FEED_DELETE_DAILY_DATE
|
'BTT_FEED_DELETE_DAILY_DATE
|
||||||
'
|
'
|
||||||
Me.BTT_FEED_DELETE_DAILY_DATE.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
Me.BTT_FEED_DELETE_DAILY_DATE.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
||||||
Me.BTT_FEED_DELETE_DAILY_DATE.Name = "BTT_FEED_DELETE_DAILY_DATE"
|
Me.BTT_FEED_DELETE_DAILY_DATE.Name = "BTT_FEED_DELETE_DAILY_DATE"
|
||||||
Me.BTT_FEED_DELETE_DAILY_DATE.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_FEED_DELETE_DAILY_DATE.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_FEED_DELETE_DAILY_DATE.Text = "Delete daily feed (by date)"
|
Me.BTT_FEED_DELETE_DAILY_DATE.Text = "Delete daily feed (by date)"
|
||||||
'
|
'
|
||||||
'BTT_MERGE_SESSIONS
|
'BTT_MERGE_SESSIONS
|
||||||
@@ -247,18 +304,40 @@ Namespace DownloadObjects
|
|||||||
Me.BTT_MERGE_SESSIONS.AutoToolTip = True
|
Me.BTT_MERGE_SESSIONS.AutoToolTip = True
|
||||||
Me.BTT_MERGE_SESSIONS.Image = Global.SCrawler.My.Resources.Resources.DBPic_32
|
Me.BTT_MERGE_SESSIONS.Image = Global.SCrawler.My.Resources.Resources.DBPic_32
|
||||||
Me.BTT_MERGE_SESSIONS.Name = "BTT_MERGE_SESSIONS"
|
Me.BTT_MERGE_SESSIONS.Name = "BTT_MERGE_SESSIONS"
|
||||||
Me.BTT_MERGE_SESSIONS.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_MERGE_SESSIONS.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_MERGE_SESSIONS.Text = "Merge sessions"
|
Me.BTT_MERGE_SESSIONS.Text = "Merge sessions"
|
||||||
Me.BTT_MERGE_SESSIONS.ToolTipText = "Merge multiple session feeds into one"
|
Me.BTT_MERGE_SESSIONS.ToolTipText = "Merge multiple session feeds into one"
|
||||||
'
|
'
|
||||||
'BTT_CLEAR_DAILY
|
'BTT_CLEAR_DAILY
|
||||||
'
|
'
|
||||||
|
Me.BTT_CLEAR_DAILY.AutoToolTip = True
|
||||||
Me.BTT_CLEAR_DAILY.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
Me.BTT_CLEAR_DAILY.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
||||||
Me.BTT_CLEAR_DAILY.ImageTransparentColor = System.Drawing.Color.Magenta
|
Me.BTT_CLEAR_DAILY.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||||
Me.BTT_CLEAR_DAILY.Name = "BTT_CLEAR_DAILY"
|
Me.BTT_CLEAR_DAILY.Name = "BTT_CLEAR_DAILY"
|
||||||
Me.BTT_CLEAR_DAILY.Size = New System.Drawing.Size(267, 22)
|
Me.BTT_CLEAR_DAILY.Size = New System.Drawing.Size(352, 22)
|
||||||
Me.BTT_CLEAR_DAILY.Text = "Clear session"
|
Me.BTT_CLEAR_DAILY.Text = "Clear session"
|
||||||
Me.BTT_CLEAR_DAILY.ToolTipText = "Clear data list (session)"
|
Me.BTT_CLEAR_DAILY.ToolTipText = "Clear current session"
|
||||||
|
'
|
||||||
|
'BTT_MERGE_FEEDS
|
||||||
|
'
|
||||||
|
Me.BTT_MERGE_FEEDS.AutoToolTip = True
|
||||||
|
Me.BTT_MERGE_FEEDS.Image = Global.SCrawler.My.Resources.Resources.DBPic_32
|
||||||
|
Me.BTT_MERGE_FEEDS.Name = "BTT_MERGE_FEEDS"
|
||||||
|
Me.BTT_MERGE_FEEDS.Size = New System.Drawing.Size(352, 22)
|
||||||
|
Me.BTT_MERGE_FEEDS.Text = "Merge special feeds"
|
||||||
|
Me.BTT_MERGE_FEEDS.ToolTipText = "Merge multiple special feeds into one"
|
||||||
|
'
|
||||||
|
'BTT_CHECK_ALL
|
||||||
|
'
|
||||||
|
Me.BTT_CHECK_ALL.Name = "BTT_CHECK_ALL"
|
||||||
|
Me.BTT_CHECK_ALL.Size = New System.Drawing.Size(352, 22)
|
||||||
|
Me.BTT_CHECK_ALL.Text = "Select all"
|
||||||
|
'
|
||||||
|
'BTT_CHECK_NONE
|
||||||
|
'
|
||||||
|
Me.BTT_CHECK_NONE.Name = "BTT_CHECK_NONE"
|
||||||
|
Me.BTT_CHECK_NONE.Size = New System.Drawing.Size(352, 22)
|
||||||
|
Me.BTT_CHECK_NONE.Text = "Select none"
|
||||||
'
|
'
|
||||||
'SEP_0
|
'SEP_0
|
||||||
'
|
'
|
||||||
@@ -339,7 +418,7 @@ Namespace DownloadObjects
|
|||||||
Me.KeyPreview = True
|
Me.KeyPreview = True
|
||||||
Me.MinimumSize = New System.Drawing.Size(300, 300)
|
Me.MinimumSize = New System.Drawing.Size(300, 300)
|
||||||
Me.Name = "DownloadFeedForm"
|
Me.Name = "DownloadFeedForm"
|
||||||
Me.Text = "Download Feed"
|
Me.Text = "Feed"
|
||||||
Me.ToolbarTOP.ResumeLayout(False)
|
Me.ToolbarTOP.ResumeLayout(False)
|
||||||
Me.ToolbarTOP.PerformLayout()
|
Me.ToolbarTOP.PerformLayout()
|
||||||
Me.ResumeLayout(False)
|
Me.ResumeLayout(False)
|
||||||
@@ -372,5 +451,12 @@ Namespace DownloadObjects
|
|||||||
Private WithEvents BTT_FEED_DELETE_DAILY_LIST As ToolStripMenuItem
|
Private WithEvents BTT_FEED_DELETE_DAILY_LIST As ToolStripMenuItem
|
||||||
Private WithEvents BTT_FEED_DELETE_DAILY_DATE As ToolStripMenuItem
|
Private WithEvents BTT_FEED_DELETE_DAILY_DATE As ToolStripMenuItem
|
||||||
Private WithEvents BTT_MERGE_SESSIONS As ToolStripMenuItem
|
Private WithEvents BTT_MERGE_SESSIONS As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_MERGE_FEEDS As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_FEED_ADD_FAV_REMOVE As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_FEED_ADD_SPEC_REMOVE As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_CHECK_ALL As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_CHECK_NONE As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_COPY_TO As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_MOVE_TO As ToolStripMenuItem
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -150,6 +150,15 @@
|
|||||||
<metadata name="MENU_LOAD_SEP_5.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="MENU_LOAD_SEP_5.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<metadata name="MENU_LOAD_SEP_6.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="MENU_LOAD_SEP_7.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="MENU_LOAD_SEP_0.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
<metadata name="ToolbarTOP.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="ToolbarTOP.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
|||||||
@@ -16,7 +16,11 @@ Imports UserMediaD = SCrawler.DownloadObjects.TDownloader.UserMediaD
|
|||||||
Imports DTSModes = PersonalUtilities.Forms.DateTimeSelectionForm.Modes
|
Imports DTSModes = PersonalUtilities.Forms.DateTimeSelectionForm.Modes
|
||||||
Namespace DownloadObjects
|
Namespace DownloadObjects
|
||||||
Friend Class DownloadFeedForm
|
Friend Class DownloadFeedForm
|
||||||
|
#Region "Events"
|
||||||
|
Friend Event UsersAdded As UsersAddedEventHandler
|
||||||
|
#End Region
|
||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
|
Private Const FeedTitleDefault As String = "Feed"
|
||||||
Private WithEvents MyDefs As DefaultFormOptions
|
Private WithEvents MyDefs As DefaultFormOptions
|
||||||
Private WithEvents MyRange As RangeSwitcherToolbar(Of UserMediaD)
|
Private WithEvents MyRange As RangeSwitcherToolbar(Of UserMediaD)
|
||||||
Private ReadOnly DataList As List(Of UserMediaD)
|
Private ReadOnly DataList As List(Of UserMediaD)
|
||||||
@@ -37,7 +41,72 @@ Namespace DownloadObjects
|
|||||||
Return OPT_SUBSCRIPTIONS.Checked
|
Return OPT_SUBSCRIPTIONS.Checked
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
Private IsSession As Boolean = True
|
#Region "Feeds options"
|
||||||
|
Private Enum FeedModes : Current : Saved : Special : End Enum
|
||||||
|
Private FeedMode As FeedModes = FeedModes.Current
|
||||||
|
Private LoadedSessionName As String = String.Empty
|
||||||
|
Private ReadOnly Property IsSession As Boolean
|
||||||
|
Get
|
||||||
|
Return FeedMode = FeedModes.Current Or FeedMode = FeedModes.Saved
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private ReadOnly LoadedFeedNames As List(Of String)
|
||||||
|
Private Sub FeedChangeMode(ByVal Mode As FeedModes, Optional ByVal fNames As IEnumerable(Of String) = Nothing)
|
||||||
|
FeedMode = Mode
|
||||||
|
LoadedFeedNames.Clear()
|
||||||
|
If fNames.ListExists Then LoadedFeedNames.AddRange(fNames)
|
||||||
|
Try : ControlInvokeFast(Me, Sub()
|
||||||
|
Select Case FeedMode
|
||||||
|
Case FeedModes.Current : Text = $"{FeedTitleDefault}: current session"
|
||||||
|
Case FeedModes.Saved : Text = $"{FeedTitleDefault}: saved session {LoadedSessionName.IfNullOrEmpty("(multiple)")}"
|
||||||
|
Case FeedModes.Special : Text = $"{FeedTitleDefault}: {IIf(LoadedFeedNames.Count > 1, "multiple special feeds", LoadedFeedNames.FirstOrDefault.IfNullOrEmpty("?"))}"
|
||||||
|
Case Else : Text = FeedTitleDefault
|
||||||
|
End Select
|
||||||
|
End Sub, EDP.None) : Catch : End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub FeedRemoveCheckedMedia(ByVal MediaList As IEnumerable(Of UserMediaD), Optional ByVal OverriddenNames As List(Of String) = Nothing,
|
||||||
|
Optional ByVal RemoveChecked As Boolean = True, Optional ByVal ExcludingNames As IEnumerable(Of String) = Nothing,
|
||||||
|
Optional ByVal RemoveFromDataListOnly As Boolean = False)
|
||||||
|
Try
|
||||||
|
If FeedMode = FeedModes.Special Then
|
||||||
|
If LoadedFeedNames.Count > 0 Then
|
||||||
|
Dim dataRemoved As Boolean = False
|
||||||
|
If OverriddenNames.ListExists And Not LoadedFeedNames.ListContains(OverriddenNames) Then Exit Sub
|
||||||
|
If Not RemoveFromDataListOnly Then
|
||||||
|
Dim eNames As IEnumerable(Of String) = If(ExcludingNames, New String() {})
|
||||||
|
With If(OverriddenNames, LoadedFeedNames)
|
||||||
|
.ForEach(Sub(ByVal feedName As String)
|
||||||
|
If Not eNames.Contains(feedName) Then
|
||||||
|
Dim indx% = Settings.Feeds.IndexOf(feedName)
|
||||||
|
If indx >= 0 Then
|
||||||
|
If Settings.Feeds(indx).Remove(MediaList) > 0 Then dataRemoved = True
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End Sub)
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
If RemoveFromDataListOnly Then
|
||||||
|
RefillSpecialFeedsData()
|
||||||
|
ElseIf dataRemoved Then
|
||||||
|
DataList.ListDisposeRemove(MediaList)
|
||||||
|
If RemoveChecked Then
|
||||||
|
If RemoveCheckedMedia(False) Then RefillAfterDelete()
|
||||||
|
Else
|
||||||
|
RefillSpecialFeedsData()
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
ElseIf FeedMode = FeedModes.Current Then
|
||||||
|
If OverriddenNames Is Nothing AndAlso Downloader.Files.ListDisposeRemove(MediaList) > 0 AndAlso RemoveCheckedMedia(False) Then
|
||||||
|
DataList.ListDisposeRemove(MediaList)
|
||||||
|
RefillAfterDelete()
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[DownloadFeedForm.FeedRemoveCheckedMedia]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Initializer"
|
#Region "Initializer"
|
||||||
Friend Sub New()
|
Friend Sub New()
|
||||||
@@ -45,6 +114,7 @@ Namespace DownloadObjects
|
|||||||
MyDefs = New DefaultFormOptions(Me, Settings.Design)
|
MyDefs = New DefaultFormOptions(Me, Settings.Design)
|
||||||
MyRange = New RangeSwitcherToolbar(Of UserMediaD)(ToolbarTOP)
|
MyRange = New RangeSwitcherToolbar(Of UserMediaD)(ToolbarTOP)
|
||||||
DataList = New List(Of UserMediaD)
|
DataList = New List(Of UserMediaD)
|
||||||
|
LoadedFeedNames = New List(Of String)
|
||||||
BTT_DELETE_SELECTED = New ToolStripButton With {
|
BTT_DELETE_SELECTED = New ToolStripButton With {
|
||||||
.Text = "Delete selected",
|
.Text = "Delete selected",
|
||||||
.AutoToolTip = True,
|
.AutoToolTip = True,
|
||||||
@@ -79,6 +149,7 @@ Namespace DownloadObjects
|
|||||||
If Not feed.IsFavorite Then
|
If Not feed.IsFavorite Then
|
||||||
AddNewFeedItem(BTT_LOAD_SPEC, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_LOAD)
|
AddNewFeedItem(BTT_LOAD_SPEC, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_LOAD)
|
||||||
AddNewFeedItem(BTT_FEED_ADD_SPEC, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD)
|
AddNewFeedItem(BTT_FEED_ADD_SPEC, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD)
|
||||||
|
AddNewFeedItem(BTT_FEED_ADD_SPEC_REMOVE, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD_REMOVE)
|
||||||
AddNewFeedItem(BTT_FEED_REMOVE_SPEC, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_REMOVE)
|
AddNewFeedItem(BTT_FEED_REMOVE_SPEC, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_REMOVE)
|
||||||
AddNewFeedItem(BTT_FEED_DELETE_SPEC, feed, My.Resources.DeletePic_24, AddressOf Feed_SPEC_DELETE)
|
AddNewFeedItem(BTT_FEED_DELETE_SPEC, feed, My.Resources.DeletePic_24, AddressOf Feed_SPEC_DELETE)
|
||||||
AddNewFeedItem(BTT_FEED_CLEAR_SPEC, feed, My.Resources.BrushToolPic_16, AddressOf Feed_SPEC_CLEAR)
|
AddNewFeedItem(BTT_FEED_CLEAR_SPEC, feed, My.Resources.BrushToolPic_16, AddressOf Feed_SPEC_CLEAR)
|
||||||
@@ -95,7 +166,8 @@ Namespace DownloadObjects
|
|||||||
End With
|
End With
|
||||||
MENU_DOWN.Visible = OPT_SUBSCRIPTIONS.Checked
|
MENU_DOWN.Visible = OPT_SUBSCRIPTIONS.Checked
|
||||||
UpdateSettings()
|
UpdateSettings()
|
||||||
RefillList()
|
FeedChangeMode(FeedModes.Current)
|
||||||
|
RefillList(True, False)
|
||||||
.EndLoaderOperations(False)
|
.EndLoaderOperations(False)
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
@@ -106,6 +178,7 @@ Namespace DownloadObjects
|
|||||||
Private Sub DownloadFeedForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
Private Sub DownloadFeedForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
||||||
ClearTable()
|
ClearTable()
|
||||||
MyRange.Dispose()
|
MyRange.Dispose()
|
||||||
|
LoadedFeedNames.Clear()
|
||||||
BTT_CLEAR_DAILY.Dispose()
|
BTT_CLEAR_DAILY.Dispose()
|
||||||
DataList.Clear()
|
DataList.Clear()
|
||||||
End Sub
|
End Sub
|
||||||
@@ -135,6 +208,7 @@ Namespace DownloadObjects
|
|||||||
Private Sub Feed_FeedAdded(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
|
Private Sub Feed_FeedAdded(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
|
||||||
AddNewFeedItem(BTT_LOAD_SPEC, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_LOAD, True)
|
AddNewFeedItem(BTT_LOAD_SPEC, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_LOAD, True)
|
||||||
AddNewFeedItem(BTT_FEED_ADD_SPEC, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD, True)
|
AddNewFeedItem(BTT_FEED_ADD_SPEC, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD, True)
|
||||||
|
AddNewFeedItem(BTT_FEED_ADD_SPEC_REMOVE, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD_REMOVE, True)
|
||||||
AddNewFeedItem(BTT_FEED_REMOVE_SPEC, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_REMOVE, True)
|
AddNewFeedItem(BTT_FEED_REMOVE_SPEC, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_REMOVE, True)
|
||||||
AddNewFeedItem(BTT_FEED_DELETE_SPEC, Feed, My.Resources.DeletePic_24, AddressOf Feed_SPEC_DELETE, True)
|
AddNewFeedItem(BTT_FEED_DELETE_SPEC, Feed, My.Resources.DeletePic_24, AddressOf Feed_SPEC_DELETE, True)
|
||||||
AddNewFeedItem(BTT_FEED_CLEAR_SPEC, Feed, My.Resources.BrushToolPic_16, AddressOf Feed_SPEC_CLEAR, True)
|
AddNewFeedItem(BTT_FEED_CLEAR_SPEC, Feed, My.Resources.BrushToolPic_16, AddressOf Feed_SPEC_CLEAR, True)
|
||||||
@@ -160,7 +234,6 @@ Namespace DownloadObjects
|
|||||||
item = .DropDownItems(i)
|
item = .DropDownItems(i)
|
||||||
If TypeOf item Is ToolStripMenuItem AndAlso Feed.Equals(DirectCast(item, ToolStripMenuItem).Tag) Then
|
If TypeOf item Is ToolStripMenuItem AndAlso Feed.Equals(DirectCast(item, ToolStripMenuItem).Tag) Then
|
||||||
With DirectCast(item, ToolStripMenuItem) : .Tag = Nothing : .Dispose() : End With
|
With DirectCast(item, ToolStripMenuItem) : .Tag = Nothing : .Dispose() : End With
|
||||||
'.DropDownItems.RemoveAt(i)
|
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
@@ -172,33 +245,53 @@ Namespace DownloadObjects
|
|||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Feed_SPEC_LOAD(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
Private Sub Feed_SPEC_LOAD(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
||||||
IsSession = False
|
|
||||||
Dim f As FeedSpecial = Source.Tag
|
Dim f As FeedSpecial = Source.Tag
|
||||||
If Not f Is Nothing AndAlso Not f.Disposed Then
|
If Not f Is Nothing AndAlso Not f.Disposed Then
|
||||||
DataList.Clear()
|
FeedChangeMode(FeedModes.Special, {f.Name})
|
||||||
If f.Count > 0 Then DataList.ListAddList(f) : CleanDataList()
|
RefillSpecialFeedsData(False)
|
||||||
RefillList(False)
|
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Feed_SPEC_ADD(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
Private Sub Feed_SPEC_ADD(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
||||||
Dim f As FeedSpecial = Source.Tag
|
Dim f As FeedSpecial = Source.Tag
|
||||||
If Not f Is Nothing AndAlso Not f.Disposed Then f.Add(GetCheckedMedia())
|
If Not f Is Nothing AndAlso Not f.Disposed Then f.Add(GetCheckedMedia())
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub Feed_SPEC_ADD_REMOVE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
||||||
|
Dim f As FeedSpecial = Source.Tag
|
||||||
|
If Not f Is Nothing AndAlso Not f.Disposed Then
|
||||||
|
Dim c As IEnumerable(Of UserMediaD) = GetCheckedMedia()
|
||||||
|
If c.ListExists Then
|
||||||
|
f.Add(c)
|
||||||
|
FeedRemoveCheckedMedia(c,,, {f.Name})
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
Private Sub Feed_SPEC_CLEAR(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
Private Sub Feed_SPEC_CLEAR(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
||||||
Dim f As FeedSpecial = Source.Tag
|
Dim f As FeedSpecial = Source.Tag
|
||||||
If Not f Is Nothing AndAlso Not f.Disposed Then
|
If Not f Is Nothing AndAlso Not f.Disposed Then
|
||||||
If MsgBoxE({$"Are you sure you want to clear the '{f.Name}' feed?", "Clear feed"}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then f.Clear()
|
If MsgBoxE({$"Are you sure you want to clear the '{f.Name}' feed?", "Clear feed"}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then
|
||||||
|
f.Clear()
|
||||||
|
If FeedMode = FeedModes.Special Then RefillSpecialFeedsData()
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Feed_SPEC_REMOVE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
Private Sub Feed_SPEC_REMOVE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
||||||
Dim f As FeedSpecial = Source.Tag
|
Dim f As FeedSpecial = Source.Tag
|
||||||
If Not f Is Nothing AndAlso Not f.Disposed Then f.Remove(GetCheckedMedia())
|
If Not f Is Nothing AndAlso Not f.Disposed Then
|
||||||
|
Dim m As IEnumerable(Of UserMediaD) = GetCheckedMedia()
|
||||||
|
If m.ListExists Then
|
||||||
|
f.Remove(m)
|
||||||
|
FeedRemoveCheckedMedia(m, {f.Name}.ToList)
|
||||||
|
End If
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Feed_SPEC_DELETE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
Private Sub Feed_SPEC_DELETE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
||||||
Dim f As FeedSpecial = Source.Tag
|
Dim f As FeedSpecial = Source.Tag
|
||||||
If Not f Is Nothing AndAlso Not f.Disposed Then
|
If Not f Is Nothing AndAlso Not f.Disposed Then
|
||||||
If MsgBoxE({$"Are you sure you want to delete the '{f.Name}' feed?", "Delete feed"}, vbExclamation,,, {"Process", "Cancel"}) = 0 AndAlso
|
Dim name$ = f.Name
|
||||||
f.Delete() Then Feed_FeedRemoved(Settings.Feeds, f)
|
If MsgBoxE({$"Are you sure you want to delete the '{name}' feed?", "Delete feed"}, vbExclamation,,, {"Process", "Cancel"}) = 0 AndAlso f.Delete() Then
|
||||||
|
Feed_FeedRemoved(Settings.Feeds, f)
|
||||||
|
If LoadedFeedNames.Count > 0 AndAlso LoadedFeedNames.Contains(name) Then LoadedFeedNames.Remove(name) : RefillSpecialFeedsData()
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
@@ -229,11 +322,6 @@ Namespace DownloadObjects
|
|||||||
ForeColor = SystemColors.WindowText
|
ForeColor = SystemColors.WindowText
|
||||||
End If
|
End If
|
||||||
|
|
||||||
Dim fsd As Boolean = .FeedStoreSessionsData
|
|
||||||
ControlInvoke(ToolbarTOP, MENU_LOAD_SESSION, Sub()
|
|
||||||
MENU_LOAD_SESSION.Visible = fsd
|
|
||||||
SEP_0.Visible = fsd
|
|
||||||
End Sub)
|
|
||||||
If rangeChanged Then
|
If rangeChanged Then
|
||||||
ClearTable()
|
ClearTable()
|
||||||
ControlInvoke(TP_DATA, Sub()
|
ControlInvoke(TP_DATA, Sub()
|
||||||
@@ -255,13 +343,22 @@ Namespace DownloadObjects
|
|||||||
MyRange.HandlersSuspended = True
|
MyRange.HandlersSuspended = True
|
||||||
MyRange.Limit = c
|
MyRange.Limit = c
|
||||||
MyRange.HandlersSuspended = False
|
MyRange.HandlersSuspended = False
|
||||||
If Not MyDefs.Initializing Then RefillList(False)
|
If Not MyDefs.Initializing Then RefillList()
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Refill"
|
#Region "Refill"
|
||||||
Private Sub RefillList(Optional ByVal RefillDataList As Boolean = True)
|
Private Overloads Sub RefillList(Optional ByVal RememberPosition As Boolean? = Nothing)
|
||||||
|
If IsSession Then
|
||||||
|
RefillList(FeedMode = FeedModes.Current, If(RememberPosition, True))
|
||||||
|
Else
|
||||||
|
RefillSpecialFeedsData()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Overloads Sub RefillList(ByVal RefillDataList As Boolean, ByVal RememberPosition As Boolean)
|
||||||
DataPopulated = False
|
DataPopulated = False
|
||||||
|
Dim rIndx% = -1
|
||||||
|
If RememberPosition Then rIndx = MyRange.CurrentIndex
|
||||||
If RefillDataList Then
|
If RefillDataList Then
|
||||||
If Not IsSubscription Then
|
If Not IsSubscription Then
|
||||||
Try : Downloader.Files.RemoveAll(FileNotExist) : Catch : End Try
|
Try : Downloader.Files.RemoveAll(FileNotExist) : Catch : End Try
|
||||||
@@ -270,6 +367,10 @@ Namespace DownloadObjects
|
|||||||
DataList.ListAddList(Downloader.Files.Where(If(IsSubscription, FilterSubscriptions, FilterUsers)), LAP.NotContainsOnly)
|
DataList.ListAddList(Downloader.Files.Where(If(IsSubscription, FilterSubscriptions, FilterUsers)), LAP.NotContainsOnly)
|
||||||
End If
|
End If
|
||||||
MyRange.Source = DataList
|
MyRange.Source = DataList
|
||||||
|
If rIndx >= 0 Then
|
||||||
|
If Not rIndx.ValueBetween(0, MyRange.Count - 1) Then rIndx -= 1
|
||||||
|
If rIndx.ValueBetween(0, MyRange.Count - 1) Then MyRange.CurrentIndex = rIndx
|
||||||
|
End If
|
||||||
ControlInvokeFast(ToolbarTOP, BTT_REFRESH, Sub() BTT_REFRESH.ToolTipText = BttRefreshToolTipText)
|
ControlInvokeFast(ToolbarTOP, BTT_REFRESH, Sub() BTT_REFRESH.ToolTipText = BttRefreshToolTipText)
|
||||||
BTT_REFRESH.ControlDropColor(ToolbarTOP)
|
BTT_REFRESH.ControlDropColor(ToolbarTOP)
|
||||||
If DataList.Count = 0 Then
|
If DataList.Count = 0 Then
|
||||||
@@ -293,20 +394,20 @@ Namespace DownloadObjects
|
|||||||
#Region "Feed"
|
#Region "Feed"
|
||||||
#Region "Load"
|
#Region "Load"
|
||||||
Private Sub BTT_LOAD_SESSION_CURRENT_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SESSION_CURRENT.Click
|
Private Sub BTT_LOAD_SESSION_CURRENT_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SESSION_CURRENT.Click
|
||||||
IsSession = True
|
FeedChangeMode(FeedModes.Current)
|
||||||
RefillList()
|
RefillList(True, False)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_LOAD_SESSION_LAST_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SESSION_LAST.Click
|
Private Sub BTT_LOAD_SESSION_LAST_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SESSION_LAST.Click
|
||||||
IsSession = True
|
SessionChooser(True,,, FeedModes.Saved)
|
||||||
SessionChooser(True)
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_LOAD_SESSION_CHOOSE_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SESSION_CHOOSE.Click
|
Private Sub BTT_LOAD_SESSION_CHOOSE_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SESSION_CHOOSE.Click
|
||||||
IsSession = True
|
SessionChooser(False,,, FeedModes.Saved)
|
||||||
SessionChooser(False)
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub SessionChooser(ByVal GetLast As Boolean, Optional ByVal GetFilesOnly As Boolean = False,
|
Private Sub SessionChooser(ByVal GetLast As Boolean, Optional ByVal GetFilesOnly As Boolean = False,
|
||||||
Optional ByRef ResultFilesList As List(Of SFile) = Nothing)
|
Optional ByRef ResultFilesList As List(Of SFile) = Nothing,
|
||||||
|
Optional ByVal SelectedMode As FeedModes = -1)
|
||||||
Try
|
Try
|
||||||
|
LoadedSessionName = String.Empty
|
||||||
Downloader.ClearSessions()
|
Downloader.ClearSessions()
|
||||||
Dim f As SFile = TDownloader.SessionsPath.CSFileP
|
Dim f As SFile = TDownloader.SessionsPath.CSFileP
|
||||||
Dim fList As List(Of SFile) = Nothing
|
Dim fList As List(Of SFile) = Nothing
|
||||||
@@ -341,6 +442,10 @@ Namespace DownloadObjects
|
|||||||
ResultFilesList.AddRange(fList)
|
ResultFilesList.AddRange(fList)
|
||||||
Else
|
Else
|
||||||
DataList.Clear()
|
DataList.Clear()
|
||||||
|
If SelectedMode >= 0 Then
|
||||||
|
If SelectedMode = FeedModes.Saved And fList.Count = 1 Then LoadedSessionName = fList(0).Name
|
||||||
|
FeedChangeMode(SelectedMode)
|
||||||
|
End If
|
||||||
For Each f In fList
|
For Each f In fList
|
||||||
x = New XmlFile(f,, False) With {.AllowSameNames = True, .XmlReadOnly = True}
|
x = New XmlFile(f,, False) With {.AllowSameNames = True, .XmlReadOnly = True}
|
||||||
x.LoadData()
|
x.LoadData()
|
||||||
@@ -348,7 +453,7 @@ Namespace DownloadObjects
|
|||||||
x.Dispose()
|
x.Dispose()
|
||||||
Next
|
Next
|
||||||
CleanDataList()
|
CleanDataList()
|
||||||
RefillList(False)
|
RefillList(False, False)
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
MsgBoxE(m)
|
MsgBoxE(m)
|
||||||
@@ -368,12 +473,17 @@ Namespace DownloadObjects
|
|||||||
f = Downloader.FilesSessionActual(False)
|
f = Downloader.FilesSessionActual(False)
|
||||||
End If
|
End If
|
||||||
If f.Exists Then
|
If f.Exists Then
|
||||||
|
If SelectedMode >= 0 Then
|
||||||
|
If SelectedMode = FeedModes.Saved Then LoadedSessionName = f.Name
|
||||||
|
FeedChangeMode(SelectedMode)
|
||||||
|
End If
|
||||||
|
DataList.Clear()
|
||||||
x = New XmlFile(f,, False) With {.AllowSameNames = True, .XmlReadOnly = True}
|
x = New XmlFile(f,, False) With {.AllowSameNames = True, .XmlReadOnly = True}
|
||||||
x.LoadData()
|
x.LoadData()
|
||||||
If x.Count > 0 Then DataList.Clear() : DataList.ListAddList(x, lcr)
|
If x.Count > 0 Then DataList.ListAddList(x, lcr)
|
||||||
x.Dispose()
|
x.Dispose()
|
||||||
CleanDataList()
|
CleanDataList()
|
||||||
RefillList(False)
|
RefillList(False, False)
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
m.Text = "Saved sessions not found"
|
m.Text = "Saved sessions not found"
|
||||||
@@ -385,45 +495,256 @@ Namespace DownloadObjects
|
|||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
Private Sub BTT_COPY_MOVE_TO_Click(sender As Object, e As EventArgs) Handles BTT_COPY_TO.Click, BTT_MOVE_TO.Click
|
||||||
|
MoveCopyFiles(True, sender, Nothing, Nothing)
|
||||||
|
End Sub
|
||||||
|
Private Function MoveCopyFiles(ByVal IsInternal As Boolean, ByVal Sender As Object, ByVal MCTOptions As FeedMoveCopyTo, ByVal FeedMediaData As FeedMedia) As Boolean
|
||||||
|
Const MsgTitle$ = "Copy/Move checked files"
|
||||||
|
Try
|
||||||
|
Dim isCopy As Boolean = Not Sender Is Nothing AndAlso Sender Is BTT_COPY_TO
|
||||||
|
Dim moveOptions As FeedMoveCopyTo = Nothing
|
||||||
|
Dim ff As SFile = Nothing, df As SFile
|
||||||
|
Dim data As IEnumerable(Of UserMediaD) = Nothing
|
||||||
|
Dim dd As UserMediaD
|
||||||
|
Dim data_files As IEnumerable(Of SFile) = Nothing
|
||||||
|
Dim mm As UserMediaD
|
||||||
|
Dim mm_data As API.Base.UserMedia
|
||||||
|
Dim indx%
|
||||||
|
Dim renameExisting As Boolean = False
|
||||||
|
Dim downloaderFilesUpdated As Boolean = False
|
||||||
|
Dim eFiles As IEnumerable(Of SFile)
|
||||||
|
Dim finder As Predicate(Of UserMediaD) = Function(media) media.Data.File = ff
|
||||||
|
Dim x As XmlFile
|
||||||
|
Dim sessionData As New List(Of UserMediaD)
|
||||||
|
Dim sesFile As SFile
|
||||||
|
Dim sesFilesReplaced As Boolean = False
|
||||||
|
Dim filesReplace As New List(Of KeyValuePair(Of SFile, SFile))
|
||||||
|
Dim updateFileLocations As Boolean = Settings.FeedMoveCopyUpdateFileLocationOnMove
|
||||||
|
Dim result As Boolean = False
|
||||||
|
|
||||||
|
If FeedMediaData Is Nothing Then
|
||||||
|
data = GetCheckedMedia()
|
||||||
|
With data
|
||||||
|
If .ListExists Then data_files = .Select(Function(m) m.Data.File)
|
||||||
|
End With
|
||||||
|
Else
|
||||||
|
data = {FeedMediaData.Media}
|
||||||
|
data_files = {FeedMediaData.File}
|
||||||
|
End If
|
||||||
|
If data.ListExists Then
|
||||||
|
If MCTOptions.Destination.IsEmptyString Then
|
||||||
|
Using f As New FeedCopyToForm(data_files, isCopy)
|
||||||
|
f.ShowDialog()
|
||||||
|
If f.DialogResult = DialogResult.OK Then moveOptions = f.Result
|
||||||
|
End Using
|
||||||
|
Else
|
||||||
|
moveOptions = MCTOptions
|
||||||
|
End If
|
||||||
|
|
||||||
|
With moveOptions
|
||||||
|
If Not .Destination.IsEmptyString And .ReplaceUserProfile And .ReplaceUserProfile_CreateIfNull And .ReplaceUserProfile_Profile Is Nothing Then
|
||||||
|
Dim existingPathInstances As IEnumerable(Of String) = Nothing
|
||||||
|
Dim __user As UserInfo
|
||||||
|
Dim __host As Plugin.Hosts.SettingsHost = Settings(API.PathPlugin.PluginKey).Default
|
||||||
|
Dim __userName$ = .Destination.Segments.LastOrDefault
|
||||||
|
If Settings.UsersList.Count > 0 Then _
|
||||||
|
existingPathInstances = (From __uu As UserInfo In Settings.UsersList
|
||||||
|
Where __uu.Plugin = API.PathPlugin.PluginKey
|
||||||
|
Select __uu.Name.ToLower)
|
||||||
|
Do
|
||||||
|
__userName = InputBoxE("Enter a new username for the 'path' plugin:", MsgTitle, __userName)
|
||||||
|
If __userName.IsEmptyString Then
|
||||||
|
Return False
|
||||||
|
Else
|
||||||
|
If Not existingPathInstances.ListExists OrElse Not existingPathInstances.Contains(__userName.ToLower) Then
|
||||||
|
Exit Do
|
||||||
|
ElseIf MsgBoxE({$"The name you entered ({__userName}) already exists", MsgTitle}, vbCritical,,, {"Retry", "Cancel"}) = 1 Then
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Loop
|
||||||
|
__user = New UserInfo(__userName, __host) With {.SpecialPath = moveOptions.Destination.CSFilePS}
|
||||||
|
__user.UpdateUserFile()
|
||||||
|
If Settings.UsersList.Count = 0 OrElse Not Settings.UsersList.Contains(__user) Then
|
||||||
|
Settings.UpdateUsersList(__user)
|
||||||
|
With Settings.Users
|
||||||
|
Dim startIndx% = .Count
|
||||||
|
.Add(API.Base.UserDataBase.GetInstance(__user))
|
||||||
|
With .Last
|
||||||
|
If Not .FileExists Then .UpdateUserInformation()
|
||||||
|
End With
|
||||||
|
RaiseEvent UsersAdded(startIndx)
|
||||||
|
moveOptions.ReplaceUserProfile_Profile = .Last
|
||||||
|
End With
|
||||||
|
|
||||||
|
Else
|
||||||
|
MsgBoxE({$"The user list already contains the user you want to add.{vbCr}Operation canceled.", MsgTitle}, vbCritical)
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
|
||||||
|
If Not moveOptions.Destination.IsEmptyString Then
|
||||||
|
If Not isCopy Then
|
||||||
|
Dim eFileResult As Func(Of UserMediaD, SFile) = Function(ByVal fff As UserMediaD) As SFile
|
||||||
|
Dim _fff As SFile = fff.Data.File
|
||||||
|
_fff.Path = moveOptions.DestinationTrue(fff).Path
|
||||||
|
Return _fff
|
||||||
|
End Function
|
||||||
|
eFiles = (From ef As UserMediaD In data Where eFileResult.Invoke(ef).Exists Select eFileResult.Invoke(ef))
|
||||||
|
If eFiles.ListExists Then _
|
||||||
|
renameExisting = MsgBoxE(New MMessage("The following files already exist at the destination. " &
|
||||||
|
"Do you still want to move them? These files will be renamed and moved." & vbCr &
|
||||||
|
$"Destination: {moveOptions.Destination.PathWithSeparator}{vbCr}{vbCr}" &
|
||||||
|
eFiles.ListToString(vbCr), MsgTitle, {"Move", "Cancel"}, vbExclamation) With {.Editable = True}) = 0
|
||||||
|
|
||||||
|
End If
|
||||||
|
For Each dd In data
|
||||||
|
If Not dd.Data.File.IsEmptyString Then
|
||||||
|
ff = dd.Data.File
|
||||||
|
df = ff
|
||||||
|
df.Path = moveOptions.DestinationTrue(dd).Path
|
||||||
|
If isCopy Then
|
||||||
|
If ff.Copy(df) Then result = True
|
||||||
|
Else
|
||||||
|
If df.Exists And renameExisting Then df = SFile.IndexReindex(df,,,, New ErrorsDescriber(False, False, False, df))
|
||||||
|
If SFile.Move(ff, df) Then
|
||||||
|
result = True
|
||||||
|
If updateFileLocations Then
|
||||||
|
filesReplace.Add(New KeyValuePair(Of SFile, SFile)(ff, df))
|
||||||
|
indx = Downloader.Files.FindIndex(finder)
|
||||||
|
If indx >= 0 Then
|
||||||
|
mm = Downloader.Files(indx)
|
||||||
|
mm_data = mm.Data
|
||||||
|
mm_data.File = df
|
||||||
|
mm = New UserMediaD(mm_data, If(moveOptions.ReplaceUserProfile_Profile, mm.User), mm.Session, mm.Date)
|
||||||
|
Downloader.Files(indx) = mm
|
||||||
|
downloaderFilesUpdated = True
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
If Not isCopy And updateFileLocations Then
|
||||||
|
If downloaderFilesUpdated Then Downloader.FilesSave()
|
||||||
|
If FeedMode = FeedModes.Saved And Not LoadedSessionName.IsEmptyString And filesReplace.Count > 0 Then
|
||||||
|
sesFile = $"{TDownloader.SessionsPath.CSFilePS}{LoadedSessionName}.xml"
|
||||||
|
If sesFile.Exists Then
|
||||||
|
sessionData.Clear()
|
||||||
|
x = New XmlFile(sesFile, Protector.Modes.All, False) With {.AllowSameNames = True}
|
||||||
|
x.LoadData()
|
||||||
|
If x.Count > 0 Then sessionData.ListAddList(x, LAP.IgnoreICopier)
|
||||||
|
x.Dispose()
|
||||||
|
If sessionData.Count > 0 Then
|
||||||
|
For Each rfile As KeyValuePair(Of SFile, SFile) In filesReplace
|
||||||
|
ff = rfile.Key
|
||||||
|
df = rfile.Value
|
||||||
|
indx = sessionData.FindIndex(finder)
|
||||||
|
If indx >= 0 Then
|
||||||
|
mm = sessionData(indx)
|
||||||
|
mm_data = mm.Data
|
||||||
|
mm_data.File = df
|
||||||
|
mm = New UserMediaD(mm_data, If(moveOptions.ReplaceUserProfile_Profile, mm.User), mm.Session, mm.Date)
|
||||||
|
sessionData(indx) = mm
|
||||||
|
sesFilesReplaced = True
|
||||||
|
If DataList.Count > 0 Then
|
||||||
|
indx = DataList.FindIndex(finder)
|
||||||
|
If indx >= 0 Then DataList(indx) = mm
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
If sesFilesReplaced Then
|
||||||
|
x = New XmlFile With {.AllowSameNames = True}
|
||||||
|
x.AddRange(sessionData)
|
||||||
|
x.Name = TDownloader.Name_SessionXML
|
||||||
|
x.Save(sesFile, EDP.SendToLog)
|
||||||
|
x.Dispose()
|
||||||
|
End If
|
||||||
|
sessionData.Clear()
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
If filesReplace.Count > 0 Then filesReplace.ForEach(Sub(fr) Settings.Feeds.UpdateDataByFile(fr.Key, fr.Value, moveOptions))
|
||||||
|
filesReplace.Clear()
|
||||||
|
End If
|
||||||
|
If IsInternal Then MsgBoxE(New MMessage($"The following files were {IIf(isCopy, "copied", "moved")} to{vbCr}{moveOptions.Destination}{vbCr}{vbCr}{data_files.ListToString(vbCr)}", MsgTitle) With {.Editable = True})
|
||||||
|
If Not isCopy And updateFileLocations Then RefillList()
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
MsgBoxE({"No files selected", MsgTitle}, vbExclamation)
|
||||||
|
End If
|
||||||
|
Return result
|
||||||
|
Catch ex As Exception
|
||||||
|
Return ErrorsDescriber.Execute(EDP.LogMessageValue, ex, MsgTitle, False)
|
||||||
|
Finally
|
||||||
|
Settings.Feeds.UpdateWhereDataReplaced()
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
#Region "Load fav, spec"
|
#Region "Load fav, spec"
|
||||||
Private Sub BTT_LOAD_FAV_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_FAV.Click
|
Private Sub BTT_LOAD_FAV_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_FAV.Click
|
||||||
IsSession = False
|
FeedChangeMode(FeedModes.Special, {FeedSpecial.FavoriteName})
|
||||||
DataList.Clear()
|
RefillSpecialFeedsData(False)
|
||||||
With Settings.Feeds.Favorite
|
|
||||||
.RemoveNotExist(FileNotExist)
|
|
||||||
If .Count > 0 Then DataList.AddRange(.Self) : CleanDataList() : RefillList(False)
|
|
||||||
End With
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_LOAD_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SPEC.Click
|
Private Sub BTT_LOAD_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SPEC.Click
|
||||||
IsSession = False
|
|
||||||
With FeedSpecialCollection.ChooseFeeds(False)
|
With FeedSpecialCollection.ChooseFeeds(False)
|
||||||
If .ListExists Then
|
If .ListExists Then
|
||||||
DataList.Clear()
|
FeedChangeMode(FeedModes.Special, .Select(Function(f) f.Name))
|
||||||
Dim d As New List(Of UserMediaD)
|
RefillSpecialFeedsData(False)
|
||||||
.ForEach(Sub(ByVal f As FeedSpecial)
|
|
||||||
f.RemoveNotExist(FileNotExist)
|
|
||||||
If f.Count > 0 Then d.AddRange(f)
|
|
||||||
End Sub)
|
|
||||||
If d.Count > 0 Then DataList.ListAddList(d.Distinct)
|
|
||||||
CleanDataList()
|
|
||||||
RefillList(False)
|
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub RefillSpecialFeedsData(Optional ByVal RememberPosition As Boolean = True)
|
||||||
|
If LoadedFeedNames.Count > 0 Then
|
||||||
|
Dim d As New List(Of UserMediaD)
|
||||||
|
Dim lp As New ListAddParams(LAP.NotContainsOnly)
|
||||||
|
LoadedFeedNames.ForEach(Sub(ByVal fName As String)
|
||||||
|
Dim indx% = Settings.Feeds.IndexOf(fName)
|
||||||
|
If indx >= 0 Then
|
||||||
|
With Settings.Feeds(indx)
|
||||||
|
.RemoveNotExist(FileNotExist)
|
||||||
|
d.ListAddList(.Self, lp)
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
End Sub)
|
||||||
|
DataList.Clear()
|
||||||
|
If d.Count > 0 Then
|
||||||
|
d.Sort(New FeedSpecial.SEComparer)
|
||||||
|
DataList.AddRange(d)
|
||||||
|
CleanDataList()
|
||||||
|
d.Clear()
|
||||||
|
End If
|
||||||
|
RefillList(False, RememberPosition)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Add remove fav spec"
|
#Region "Add remove fav spec"
|
||||||
Private Sub BTT_FEED_ADD_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_FAV.Click
|
Private Sub BTT_FEED_ADD_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_FAV.Click, BTT_FEED_ADD_FAV_REMOVE.Click
|
||||||
Settings.Feeds.Favorite.Add(GetCheckedMedia())
|
Dim m As IEnumerable(Of UserMediaD) = GetCheckedMedia()
|
||||||
|
If m.ListExists Then
|
||||||
|
Settings.Feeds.Favorite.Add(m)
|
||||||
|
If sender Is BTT_FEED_ADD_FAV_REMOVE Then FeedRemoveCheckedMedia(m,,, {FeedSpecial.FavoriteName})
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_FEED_REMOVE_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_FAV.Click
|
Private Sub BTT_FEED_REMOVE_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_FAV.Click
|
||||||
Settings.Feeds.Favorite.Remove(GetCheckedMedia())
|
Dim m As IEnumerable(Of UserMediaD) = GetCheckedMedia()
|
||||||
|
If m.ListExists Then
|
||||||
|
Settings.Feeds.Favorite.Remove(m)
|
||||||
|
If FeedMode = FeedModes.Special Then FeedRemoveCheckedMedia(m, {FeedSpecial.FavoriteName}.ToList)
|
||||||
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_FEED_ADD_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_SPEC.Click
|
Private Sub BTT_FEED_ADD_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_SPEC.Click, BTT_FEED_ADD_SPEC_REMOVE.Click
|
||||||
Dim c As IEnumerable(Of UserMediaD) = GetCheckedMedia()
|
Dim c As IEnumerable(Of UserMediaD) = GetCheckedMedia()
|
||||||
If c.ListExists Then
|
If c.ListExists Then
|
||||||
|
Dim names As New List(Of String)
|
||||||
With FeedSpecialCollection.ChooseFeeds(True)
|
With FeedSpecialCollection.ChooseFeeds(True)
|
||||||
If .ListExists Then .ForEach(Sub(f) f.Add(c))
|
If .ListExists Then .ForEach(Sub(ByVal f As FeedSpecial)
|
||||||
|
names.Add(f.Name)
|
||||||
|
f.Add(c)
|
||||||
|
End Sub)
|
||||||
End With
|
End With
|
||||||
|
If sender Is BTT_FEED_ADD_SPEC_REMOVE Then FeedRemoveCheckedMedia(c,,, names)
|
||||||
|
names.Clear()
|
||||||
Else
|
Else
|
||||||
MsgBoxE({"You haven't selected media to add to your feed(s)", "Add to feed(s)"}, vbExclamation)
|
MsgBoxE({"You haven't selected media to add to your feed(s)", "Add to feed(s)"}, vbExclamation)
|
||||||
End If
|
End If
|
||||||
@@ -431,9 +752,14 @@ Namespace DownloadObjects
|
|||||||
Private Sub BTT_FEED_REMOVE_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_SPEC.Click
|
Private Sub BTT_FEED_REMOVE_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_SPEC.Click
|
||||||
Dim c As IEnumerable(Of UserMediaD) = GetCheckedMedia()
|
Dim c As IEnumerable(Of UserMediaD) = GetCheckedMedia()
|
||||||
If c.ListExists Then
|
If c.ListExists Then
|
||||||
|
Dim names As New List(Of String)
|
||||||
With FeedSpecialCollection.ChooseFeeds(False)
|
With FeedSpecialCollection.ChooseFeeds(False)
|
||||||
If .ListExists Then .ForEach(Sub(f) f.Remove(c))
|
If .ListExists Then .ForEach(Sub(ByVal f As FeedSpecial)
|
||||||
|
names.Add(f.Name)
|
||||||
|
f.Remove(c)
|
||||||
|
End Sub)
|
||||||
End With
|
End With
|
||||||
|
If FeedMode = FeedModes.Special Then FeedRemoveCheckedMedia(c, names)
|
||||||
Else
|
Else
|
||||||
MsgBoxE({"You haven't selected media to remove from your feed(s)", "Remove from feed(s)"}, vbExclamation)
|
MsgBoxE({"You haven't selected media to remove from your feed(s)", "Remove from feed(s)"}, vbExclamation)
|
||||||
End If
|
End If
|
||||||
@@ -457,16 +783,28 @@ Namespace DownloadObjects
|
|||||||
Private Sub BTT_FEED_CLEAR_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_CLEAR_SPEC.Click
|
Private Sub BTT_FEED_CLEAR_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_CLEAR_SPEC.Click
|
||||||
With FeedSpecialCollection.ChooseFeeds(False)
|
With FeedSpecialCollection.ChooseFeeds(False)
|
||||||
If .ListExists Then
|
If .ListExists Then
|
||||||
If MsgBoxE({$"Are you sure you want to clear the following feeds?{vbCr}{vbCr}{ .ListToString(vbCr)}", "Clear feed"}, vbExclamation,,,
|
If MsgBoxE({$"Are you sure you want to clear the following feeds?{vbCr}{vbCr}{ .ListToString(vbCr)}", "Clear feed"}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then
|
||||||
{"Process", "Cancel"}) = 0 Then .ForEach(Sub(f) f.Clear())
|
Dim names As IEnumerable(Of String) = .Select(Function(f) f.Name)
|
||||||
|
.ForEach(Sub(f) f.Clear())
|
||||||
|
If FeedMode = FeedModes.Special Then
|
||||||
|
LoadedFeedNames.ListDisposeRemove(names)
|
||||||
|
RefillSpecialFeedsData()
|
||||||
|
End If
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_FEED_DELETE_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_DELETE_SPEC.Click
|
Private Sub BTT_FEED_DELETE_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_DELETE_SPEC.Click
|
||||||
With FeedSpecialCollection.ChooseFeeds(False)
|
With FeedSpecialCollection.ChooseFeeds(False)
|
||||||
If .ListExists Then
|
If .ListExists Then
|
||||||
If MsgBoxE({$"Are you sure you want to delete the following feeds?{vbCr}{vbCr}{ .ListToString(vbCr)}", "Delete feed"}, vbExclamation,,,
|
If MsgBoxE({$"Are you sure you want to delete the following feeds?{vbCr}{vbCr}{ .ListToString(vbCr)}", "Delete feed"}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then
|
||||||
{"Process", "Cancel"}) = 0 Then .ForEach(Sub(f) f.Delete())
|
Dim names As IEnumerable(Of String) = .Select(Function(f) f.Name)
|
||||||
|
.ForEach(Sub(f) f.Delete())
|
||||||
|
If FeedMode = FeedModes.Special Then
|
||||||
|
LoadedFeedNames.ListDisposeRemove(names)
|
||||||
|
RefillSpecialFeedsData()
|
||||||
|
End If
|
||||||
|
End If
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
@@ -535,7 +873,7 @@ Namespace DownloadObjects
|
|||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Merge feeds"
|
#Region "Merge feeds"
|
||||||
Private Sub MergeFeeds() Handles BTT_MERGE_SESSIONS.Click
|
Private Sub BTT_MERGE_SESSIONS_Click(sender As Object, e As EventArgs) Handles BTT_MERGE_SESSIONS.Click
|
||||||
Try
|
Try
|
||||||
Const msgTitle$ = "Merge feeds"
|
Const msgTitle$ = "Merge feeds"
|
||||||
Dim files As New List(Of SFile)
|
Dim files As New List(Of SFile)
|
||||||
@@ -580,7 +918,7 @@ Namespace DownloadObjects
|
|||||||
x.Dispose()
|
x.Dispose()
|
||||||
For i = 1 To files.Count - 1 : files(i).Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.ReturnValue) : Next
|
For i = 1 To files.Count - 1 : files(i).Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.ReturnValue) : Next
|
||||||
MsgBoxE({$"Session data was combined into '{files(0).Name}'.{vbCr}{vbCr}" &
|
MsgBoxE({$"Session data was combined into '{files(0).Name}'.{vbCr}{vbCr}" &
|
||||||
files.ListToStringE(, New CustomProvider(Function(ff As SFile) ff.Name),,, EDP.ReturnValue), msgTitle})
|
files.ListToStringE(vbCr, New CustomProvider(Function(ff As SFile) ff.Name),,, EDP.ReturnValue), msgTitle})
|
||||||
files.Clear()
|
files.Clear()
|
||||||
data.Clear()
|
data.Clear()
|
||||||
Else
|
Else
|
||||||
@@ -591,11 +929,62 @@ Namespace DownloadObjects
|
|||||||
Else
|
Else
|
||||||
MsgBoxE({"You haven't selected any feeds", msgTitle}, vbExclamation)
|
MsgBoxE({"You haven't selected any feeds", msgTitle}, vbExclamation)
|
||||||
End If
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[DownloadFeedForm.MergeSessions]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub BTT_MERGE_FEEDS_Click(sender As Object, e As EventArgs) Handles BTT_MERGE_FEEDS.Click
|
||||||
|
Try
|
||||||
|
Const msgTitle$ = "Merge feeds"
|
||||||
|
If Settings.Feeds.Count > 1 Then
|
||||||
|
Dim mFrom As List(Of FeedSpecial) = FeedSpecialCollection.ChooseFeeds(False, "[SOURCE]", True)
|
||||||
|
Dim mTo As FeedSpecial
|
||||||
|
If mFrom.ListExists(2) Then
|
||||||
|
mTo = FeedSpecialCollection.ChooseFeeds(True, "[DESTINATION]", True).FirstOrDefault
|
||||||
|
If Not mTo Is Nothing Then
|
||||||
|
Dim names$() = mFrom.Select(Function(f) f.Name).ToArray
|
||||||
|
If MsgBoxE({$"Are you sure you want to merge the following feeds into '{mTo.Name}'?{vbCr}{vbCr}" &
|
||||||
|
names.ListToString(vbCr), msgTitle}, vbQuestion + vbYesNo) = vbYes Then
|
||||||
|
mFrom.ForEach(Sub(f) mTo.Add(f, False))
|
||||||
|
mTo.Save()
|
||||||
|
mFrom.ForEach(Sub(f) If Not f.Equals(mTo) Then Settings.Feeds.Delete(f))
|
||||||
|
MsgBoxE({$"Feeds' data was combined into '{mTo.Name}'.{vbCr}It is highly recommended to restart SCrawler!{vbCr}{vbCr}" &
|
||||||
|
names.ListToStringE(vbCr), msgTitle})
|
||||||
|
Else
|
||||||
|
ShowOperationCanceledMsg(msgTitle)
|
||||||
|
End If
|
||||||
|
mFrom.Clear()
|
||||||
|
Else
|
||||||
|
MsgBoxE({"No destination selected", msgTitle}, vbExclamation)
|
||||||
|
End If
|
||||||
|
ElseIf mFrom.ListExists(1) Then
|
||||||
|
MsgBoxE({"You must select two or more files to merge feeds", msgTitle}, vbExclamation)
|
||||||
|
Else
|
||||||
|
MsgBoxE({"You haven't selected any feeds", msgTitle}, vbExclamation)
|
||||||
|
End If
|
||||||
|
ElseIf Settings.Feeds.Count = 1 Then
|
||||||
|
MsgBoxE({"You must have two or more files to merge feeds", msgTitle}, vbExclamation)
|
||||||
|
Else
|
||||||
|
MsgBoxE({"No feeds found", msgTitle}, vbExclamation)
|
||||||
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[DownloadFeedForm.MergeFeeds]")
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[DownloadFeedForm.MergeFeeds]")
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
Private Sub BTT_CHECK_ALL_NONE_Click(sender As Object, e As EventArgs) Handles BTT_CHECK_ALL.Click, BTT_CHECK_NONE.Click
|
||||||
|
Try
|
||||||
|
Dim checked As Boolean = sender Is BTT_CHECK_ALL
|
||||||
|
ControlInvokeFast(TP_DATA, Sub()
|
||||||
|
With TP_DATA
|
||||||
|
If .Controls.Count > 0 Then
|
||||||
|
For Each cnt As FeedMedia In .Controls : cnt.Checked = checked : Next
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End Sub, EDP.None)
|
||||||
|
Catch
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "View modes"
|
#Region "View modes"
|
||||||
Private Sub OPT_Click(ByVal Sender As ToolStripMenuItem, ByVal e As EventArgs) Handles OPT_DEFAULT.Click, OPT_SUBSCRIPTIONS.Click
|
Private Sub OPT_Click(ByVal Sender As ToolStripMenuItem, ByVal e As EventArgs) Handles OPT_DEFAULT.Click, OPT_SUBSCRIPTIONS.Click
|
||||||
@@ -622,11 +1011,21 @@ Namespace DownloadObjects
|
|||||||
BTT_REFRESH.ControlChangeColor(ToolbarTOP, Added, False)
|
BTT_REFRESH.ControlChangeColor(ToolbarTOP, Added, False)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click
|
Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click
|
||||||
IsSession = True
|
|
||||||
RefillList()
|
RefillList()
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Download"
|
#Region "FeedMedia handlers"
|
||||||
|
Private Sub FeedMedia_MediaMove(ByVal Sender As FeedMedia, ByVal MCTOptions As FeedMoveCopyTo, ByRef Result As Boolean)
|
||||||
|
Result = MoveCopyFiles(False, Nothing, MCTOptions, Sender)
|
||||||
|
End Sub
|
||||||
|
Private Sub FeedMedia_MediaDeleted(ByVal Sender As FeedMedia)
|
||||||
|
Try
|
||||||
|
ControlInvoke(TP_DATA, Sub() TPRemoveControl(Sender, True))
|
||||||
|
DataList.RemoveAll(Function(dd) dd.Data.File = Sender.File)
|
||||||
|
RefillAfterDelete()
|
||||||
|
Catch
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
Private Sub FeedMedia_Download(ByVal Sender As Object, ByVal e As EventArgs) Handles BTT_DOWN_ALL.Click, BTT_DOWN_SELECTED.Click
|
Private Sub FeedMedia_Download(ByVal Sender As Object, ByVal e As EventArgs) Handles BTT_DOWN_ALL.Click, BTT_DOWN_SELECTED.Click
|
||||||
Try
|
Try
|
||||||
Dim urls As New List(Of String)
|
Dim urls As New List(Of String)
|
||||||
@@ -650,22 +1049,45 @@ Namespace DownloadObjects
|
|||||||
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Download subscription media")
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Download subscription media")
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Sub FeedMedia_FeedAddWithRemove(ByVal Sender As FeedMedia, ByVal Feeds As IEnumerable(Of String), ByVal Media As UserMediaD, ByVal RemoveOperation As Boolean)
|
||||||
|
FeedRemoveCheckedMedia({Media},, False, Feeds, RemoveOperation)
|
||||||
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Delete"
|
#Region "Delete / Remove"
|
||||||
Private Sub BTT_DELETE_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_DELETE_SELECTED.Click
|
Private Sub BTT_DELETE_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_DELETE_SELECTED.Click
|
||||||
Const MsgTitle$ = "Deleting marked files"
|
Const MsgTitle$ = "Deleting marked files"
|
||||||
Try
|
Try
|
||||||
Dim c As IEnumerable(Of FeedMedia) = ControlInvoke(TP_DATA, Function() If(TP_DATA.Controls.Count > 0, TP_DATA.Controls.ToObjectsList.Cast(Of FeedMedia)().Where(Function(f) f.Checked), New FeedMedia() {}))
|
Dim c As IEnumerable(Of FeedMedia) = GetCheckedMediaControls()
|
||||||
If c.ListExists Then
|
If c.ListExists Then
|
||||||
If MsgBoxE({$"Are you sure you want to delete {c.Count} file(s)?", MsgTitle}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then
|
If MsgBoxE({$"Are you sure you want to delete {c.Count} file(s)?", MsgTitle}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then
|
||||||
Dim indx% = MyRange.CurrentIndex
|
Dim indx% = MyRange.CurrentIndex
|
||||||
|
Dim d% = RemoveCheckedMedia(True, c)
|
||||||
|
If d > 0 Then RefillAfterDelete()
|
||||||
|
MsgBoxE({$"{d}/{c.Count} file(s) deleted", MsgTitle})
|
||||||
|
Else
|
||||||
|
MsgBoxE({"Operation canceled", MsgTitle})
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
MsgBoxE({"No files selected", MsgTitle}, vbExclamation)
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, MsgTitle)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Function GetCheckedMediaControls() As IEnumerable(Of FeedMedia)
|
||||||
|
Return ControlInvoke(TP_DATA, Function() If(TP_DATA.Controls.Count > 0, TP_DATA.Controls.ToObjectsList.Cast(Of FeedMedia)().Where(Function(f) f.Checked), New FeedMedia() {}))
|
||||||
|
End Function
|
||||||
|
Private Function RemoveCheckedMedia(ByVal DeleteFiles As Boolean, Optional ByVal Controls As IEnumerable(Of FeedMedia) = Nothing) As Integer
|
||||||
|
Try
|
||||||
Dim d% = 0
|
Dim d% = 0
|
||||||
|
If Not Controls.ListExists Then Controls = GetCheckedMediaControls()
|
||||||
|
If Controls.ListExists Then
|
||||||
ControlInvoke(TP_DATA, Sub()
|
ControlInvoke(TP_DATA, Sub()
|
||||||
With TP_DATA
|
With TP_DATA
|
||||||
.SuspendLayout()
|
.SuspendLayout()
|
||||||
LatestScrollValueDisabled = True
|
LatestScrollValueDisabled = True
|
||||||
For Each fm As FeedMedia In c
|
For Each fm As FeedMedia In Controls
|
||||||
If fm.DeleteFile(True) Then
|
If Not DeleteFiles OrElse fm.DeleteFile(True) Then
|
||||||
d += 1
|
d += 1
|
||||||
DataList.RemoveAll(Function(dd) dd.Data.File = fm.File)
|
DataList.RemoveAll(Function(dd) dd.Data.File = fm.File)
|
||||||
TPRemoveControl(fm, False)
|
TPRemoveControl(fm, False)
|
||||||
@@ -682,26 +1104,12 @@ Namespace DownloadObjects
|
|||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
End Sub)
|
End Sub)
|
||||||
If d > 0 Then RefillAfterDelete()
|
|
||||||
MsgBoxE({$"{d}/{c.Count} file(s) deleted", MsgTitle})
|
|
||||||
Else
|
|
||||||
MsgBoxE({"Operation canceled", MsgTitle})
|
|
||||||
End If
|
|
||||||
Else
|
|
||||||
MsgBoxE({"No files selected", MsgTitle}, vbExclamation)
|
|
||||||
End If
|
End If
|
||||||
|
Return d
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, MsgTitle)
|
Return ErrorsDescriber.Execute(EDP.SendToLog, ex, "[DownloadFeedForm.RemoveCheckedMedia]", 0)
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Function
|
||||||
Private Sub FeedMedia_MediaDeleted(ByVal Sender As FeedMedia)
|
|
||||||
Try
|
|
||||||
ControlInvoke(TP_DATA, Sub() TPRemoveControl(Sender, True))
|
|
||||||
DataList.RemoveAll(Function(dd) dd.Data.File = Sender.File)
|
|
||||||
RefillAfterDelete()
|
|
||||||
Catch
|
|
||||||
End Try
|
|
||||||
End Sub
|
|
||||||
Private Sub TPRemoveControl(ByVal CNT As FeedMedia, ByVal Suspend As Boolean)
|
Private Sub TPRemoveControl(ByVal CNT As FeedMedia, ByVal Suspend As Boolean)
|
||||||
Dim HeightChanged As Boolean = False
|
Dim HeightChanged As Boolean = False
|
||||||
Try
|
Try
|
||||||
@@ -811,7 +1219,7 @@ Namespace DownloadObjects
|
|||||||
If d.ListExists AndAlso Not IsSubscription AndAlso d.All(FileNotExist) Then
|
If d.ListExists AndAlso Not IsSubscription AndAlso d.All(FileNotExist) Then
|
||||||
i = Sender.CurrentIndex
|
i = Sender.CurrentIndex
|
||||||
Sender.HandlersSuspended = True
|
Sender.HandlersSuspended = True
|
||||||
RefillList()
|
RefillList(False)
|
||||||
If Sender.Count > 0 Then
|
If Sender.Count > 0 Then
|
||||||
If i.ValueBetween(0, Sender.Count - 1) Then Sender.CurrentIndex = i
|
If i.ValueBetween(0, Sender.Count - 1) Then Sender.CurrentIndex = i
|
||||||
Sender.HandlersSuspended = False
|
Sender.HandlersSuspended = False
|
||||||
@@ -837,6 +1245,8 @@ Namespace DownloadObjects
|
|||||||
With fmList.Last
|
With fmList.Last
|
||||||
AddHandler .MediaDeleted, AddressOf FeedMedia_MediaDeleted
|
AddHandler .MediaDeleted, AddressOf FeedMedia_MediaDeleted
|
||||||
AddHandler .MediaDownload, AddressOf FeedMedia_Download
|
AddHandler .MediaDownload, AddressOf FeedMedia_Download
|
||||||
|
AddHandler .MediaMove, AddressOf FeedMedia_MediaMove
|
||||||
|
AddHandler .FeedAddWithRemove, AddressOf FeedMedia_FeedAddWithRemove
|
||||||
End With
|
End With
|
||||||
End Sub)
|
End Sub)
|
||||||
If fmList.Count > 0 Then fmList.ListDisposeRemoveAll(Function(fm) fm Is Nothing OrElse fm.HasError)
|
If fmList.Count > 0 Then fmList.ListDisposeRemoveAll(Function(fm) fm Is Nothing OrElse fm.HasError)
|
||||||
|
|||||||
312
SCrawler/Download/Feed/FeedCopyToForm.Designer.vb
generated
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
' Copyright (C) Andy https://github.com/AAndyProgram
|
||||||
|
' This program is free software: you can redistribute it and/or modify
|
||||||
|
' it under the terms of the GNU General Public License as published by
|
||||||
|
' the Free Software Foundation, either version 3 of the License, or
|
||||||
|
' (at your option) any later version.
|
||||||
|
'
|
||||||
|
' This program is distributed in the hope that it will be useful,
|
||||||
|
' but WITHOUT ANY WARRANTY
|
||||||
|
Namespace DownloadObjects
|
||||||
|
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||||
|
Partial Friend Class FeedCopyToForm : 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 CONTAINER_MAIN As System.Windows.Forms.ToolStripContainer
|
||||||
|
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
|
||||||
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(FeedCopyToForm))
|
||||||
|
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 FRM_FILES As System.Windows.Forms.GroupBox
|
||||||
|
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 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 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 ListColumn3 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
|
Dim ListColumn4 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn()
|
||||||
|
Dim TP_PROFILES As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim TT_MAIN As System.Windows.Forms.ToolTip
|
||||||
|
Me.CMB_DEST = New PersonalUtilities.Forms.Controls.ComboBoxExtended()
|
||||||
|
Me.TXT_FILES = New System.Windows.Forms.RichTextBox()
|
||||||
|
Me.CH_VIDEO_SEP = New System.Windows.Forms.CheckBox()
|
||||||
|
Me.CMB_PROFILE = New PersonalUtilities.Forms.Controls.ComboBoxExtended()
|
||||||
|
Me.CMB_PROFILE_PATH = New PersonalUtilities.Forms.Controls.ComboBoxExtended()
|
||||||
|
Me.CH_PROFILE_REPLACE = New System.Windows.Forms.CheckBox()
|
||||||
|
Me.CH_PROFILE_CREATE = New System.Windows.Forms.CheckBox()
|
||||||
|
CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
||||||
|
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
FRM_FILES = New System.Windows.Forms.GroupBox()
|
||||||
|
TP_PROFILES = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
TT_MAIN = New System.Windows.Forms.ToolTip(Me.components)
|
||||||
|
CONTAINER_MAIN.ContentPanel.SuspendLayout()
|
||||||
|
CONTAINER_MAIN.SuspendLayout()
|
||||||
|
TP_MAIN.SuspendLayout()
|
||||||
|
CType(Me.CMB_DEST, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
FRM_FILES.SuspendLayout()
|
||||||
|
CType(Me.CMB_PROFILE, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.CMB_PROFILE_PATH, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
TP_PROFILES.SuspendLayout()
|
||||||
|
Me.SuspendLayout()
|
||||||
|
'
|
||||||
|
'CONTAINER_MAIN
|
||||||
|
'
|
||||||
|
'
|
||||||
|
'CONTAINER_MAIN.ContentPanel
|
||||||
|
'
|
||||||
|
CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN)
|
||||||
|
CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(534, 266)
|
||||||
|
CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
CONTAINER_MAIN.LeftToolStripPanelVisible = False
|
||||||
|
CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0)
|
||||||
|
CONTAINER_MAIN.Name = "CONTAINER_MAIN"
|
||||||
|
CONTAINER_MAIN.RightToolStripPanelVisible = False
|
||||||
|
CONTAINER_MAIN.Size = New System.Drawing.Size(534, 266)
|
||||||
|
CONTAINER_MAIN.TabIndex = 0
|
||||||
|
CONTAINER_MAIN.TopToolStripPanelVisible = False
|
||||||
|
'
|
||||||
|
'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.CMB_DEST, 0, 0)
|
||||||
|
TP_MAIN.Controls.Add(FRM_FILES, 0, 5)
|
||||||
|
TP_MAIN.Controls.Add(Me.CH_VIDEO_SEP, 0, 1)
|
||||||
|
TP_MAIN.Controls.Add(Me.CMB_PROFILE, 0, 3)
|
||||||
|
TP_MAIN.Controls.Add(Me.CMB_PROFILE_PATH, 0, 4)
|
||||||
|
TP_MAIN.Controls.Add(TP_PROFILES, 0, 2)
|
||||||
|
TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_MAIN.Location = New System.Drawing.Point(0, 0)
|
||||||
|
TP_MAIN.Name = "TP_MAIN"
|
||||||
|
TP_MAIN.RowCount = 6
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
||||||
|
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_MAIN.Size = New System.Drawing.Size(534, 266)
|
||||||
|
TP_MAIN.TabIndex = 0
|
||||||
|
'
|
||||||
|
'CMB_DEST
|
||||||
|
'
|
||||||
|
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 a new location (Ctrl+O)"
|
||||||
|
ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton2.Name = "Add"
|
||||||
|
ActionButton2.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Add
|
||||||
|
ActionButton2.ToolTipText = "Choose a new location and add it to the list (Alt+O)"
|
||||||
|
ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton3.Name = "Clear"
|
||||||
|
ActionButton3.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton4.Name = "ArrowDown"
|
||||||
|
ActionButton4.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown
|
||||||
|
Me.CMB_DEST.Buttons.Add(ActionButton1)
|
||||||
|
Me.CMB_DEST.Buttons.Add(ActionButton2)
|
||||||
|
Me.CMB_DEST.Buttons.Add(ActionButton3)
|
||||||
|
Me.CMB_DEST.Buttons.Add(ActionButton4)
|
||||||
|
Me.CMB_DEST.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox
|
||||||
|
Me.CMB_DEST.CaptionText = "Destination"
|
||||||
|
Me.CMB_DEST.CaptionToolTipEnabled = True
|
||||||
|
Me.CMB_DEST.CaptionToolTipText = "If checked, the profile path will be ignored"
|
||||||
|
Me.CMB_DEST.CaptionVisible = True
|
||||||
|
Me.CMB_DEST.CaptionWidth = 90.0R
|
||||||
|
Me.CMB_DEST.ChangeControlsEnableOnCheckedChange = False
|
||||||
|
Me.CMB_DEST.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CMB_DEST.Location = New System.Drawing.Point(3, 3)
|
||||||
|
Me.CMB_DEST.Name = "CMB_DEST"
|
||||||
|
Me.CMB_DEST.Size = New System.Drawing.Size(528, 22)
|
||||||
|
Me.CMB_DEST.TabIndex = 0
|
||||||
|
Me.CMB_DEST.TextBoxBorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
|
||||||
|
'
|
||||||
|
'FRM_FILES
|
||||||
|
'
|
||||||
|
FRM_FILES.Controls.Add(Me.TXT_FILES)
|
||||||
|
FRM_FILES.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
FRM_FILES.Location = New System.Drawing.Point(3, 137)
|
||||||
|
FRM_FILES.Name = "FRM_FILES"
|
||||||
|
FRM_FILES.Size = New System.Drawing.Size(528, 126)
|
||||||
|
FRM_FILES.TabIndex = 5
|
||||||
|
FRM_FILES.TabStop = False
|
||||||
|
FRM_FILES.Text = "Files:"
|
||||||
|
'
|
||||||
|
'TXT_FILES
|
||||||
|
'
|
||||||
|
Me.TXT_FILES.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.TXT_FILES.Location = New System.Drawing.Point(3, 16)
|
||||||
|
Me.TXT_FILES.Name = "TXT_FILES"
|
||||||
|
Me.TXT_FILES.ReadOnly = True
|
||||||
|
Me.TXT_FILES.Size = New System.Drawing.Size(522, 107)
|
||||||
|
Me.TXT_FILES.TabIndex = 0
|
||||||
|
Me.TXT_FILES.Text = ""
|
||||||
|
'
|
||||||
|
'CH_VIDEO_SEP
|
||||||
|
'
|
||||||
|
Me.CH_VIDEO_SEP.AutoSize = True
|
||||||
|
Me.CH_VIDEO_SEP.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CH_VIDEO_SEP.Location = New System.Drawing.Point(3, 31)
|
||||||
|
Me.CH_VIDEO_SEP.Name = "CH_VIDEO_SEP"
|
||||||
|
Me.CH_VIDEO_SEP.Size = New System.Drawing.Size(528, 19)
|
||||||
|
Me.CH_VIDEO_SEP.TabIndex = 1
|
||||||
|
Me.CH_VIDEO_SEP.Text = "Place videos in a separate video folder"
|
||||||
|
Me.CH_VIDEO_SEP.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'CMB_PROFILE
|
||||||
|
'
|
||||||
|
ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton5.Enabled = False
|
||||||
|
ActionButton5.Name = "Clear"
|
||||||
|
ActionButton5.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
|
||||||
|
ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton6.Enabled = False
|
||||||
|
ActionButton6.Name = "ArrowDown"
|
||||||
|
ActionButton6.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown
|
||||||
|
Me.CMB_PROFILE.Buttons.Add(ActionButton5)
|
||||||
|
Me.CMB_PROFILE.Buttons.Add(ActionButton6)
|
||||||
|
Me.CMB_PROFILE.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.RadioButton
|
||||||
|
Me.CMB_PROFILE.CaptionPadding = New System.Windows.Forms.Padding(0, 0, 1, 0)
|
||||||
|
Me.CMB_PROFILE.CaptionText = "Profile"
|
||||||
|
Me.CMB_PROFILE.CaptionVisible = True
|
||||||
|
ListColumn1.DisplayMember = True
|
||||||
|
ListColumn1.Name = "COL_NAME"
|
||||||
|
ListColumn1.Text = "Name"
|
||||||
|
ListColumn1.Width = -1
|
||||||
|
ListColumn2.Name = "COL_VALUE"
|
||||||
|
ListColumn2.Text = "Value"
|
||||||
|
ListColumn2.ValueMember = True
|
||||||
|
ListColumn2.Visible = False
|
||||||
|
Me.CMB_PROFILE.Columns.Add(ListColumn1)
|
||||||
|
Me.CMB_PROFILE.Columns.Add(ListColumn2)
|
||||||
|
Me.CMB_PROFILE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CMB_PROFILE.Location = New System.Drawing.Point(3, 81)
|
||||||
|
Me.CMB_PROFILE.Name = "CMB_PROFILE"
|
||||||
|
Me.CMB_PROFILE.Size = New System.Drawing.Size(528, 22)
|
||||||
|
Me.CMB_PROFILE.TabIndex = 3
|
||||||
|
Me.CMB_PROFILE.TextBoxBorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
|
||||||
|
'
|
||||||
|
'CMB_PROFILE_PATH
|
||||||
|
'
|
||||||
|
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
|
||||||
|
ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image)
|
||||||
|
ActionButton8.Enabled = False
|
||||||
|
ActionButton8.Name = "ArrowDown"
|
||||||
|
ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown
|
||||||
|
Me.CMB_PROFILE_PATH.Buttons.Add(ActionButton7)
|
||||||
|
Me.CMB_PROFILE_PATH.Buttons.Add(ActionButton8)
|
||||||
|
Me.CMB_PROFILE_PATH.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.RadioButton
|
||||||
|
Me.CMB_PROFILE_PATH.CaptionPadding = New System.Windows.Forms.Padding(0, 0, 1, 0)
|
||||||
|
Me.CMB_PROFILE_PATH.CaptionText = "Profile (path)"
|
||||||
|
Me.CMB_PROFILE_PATH.CaptionVisible = True
|
||||||
|
ListColumn3.DisplayMember = True
|
||||||
|
ListColumn3.Name = "COL_NAME"
|
||||||
|
ListColumn3.Text = "Name"
|
||||||
|
ListColumn3.Width = -1
|
||||||
|
ListColumn4.Name = "COL_VALUE"
|
||||||
|
ListColumn4.Text = "Value"
|
||||||
|
ListColumn4.ValueMember = True
|
||||||
|
ListColumn4.Visible = False
|
||||||
|
Me.CMB_PROFILE_PATH.Columns.Add(ListColumn3)
|
||||||
|
Me.CMB_PROFILE_PATH.Columns.Add(ListColumn4)
|
||||||
|
Me.CMB_PROFILE_PATH.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CMB_PROFILE_PATH.Location = New System.Drawing.Point(3, 109)
|
||||||
|
Me.CMB_PROFILE_PATH.Name = "CMB_PROFILE_PATH"
|
||||||
|
Me.CMB_PROFILE_PATH.Size = New System.Drawing.Size(528, 22)
|
||||||
|
Me.CMB_PROFILE_PATH.TabIndex = 4
|
||||||
|
Me.CMB_PROFILE_PATH.TextBoxBorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
|
||||||
|
'
|
||||||
|
'TP_PROFILES
|
||||||
|
'
|
||||||
|
TP_PROFILES.ColumnCount = 2
|
||||||
|
TP_PROFILES.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_PROFILES.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||||
|
TP_PROFILES.Controls.Add(Me.CH_PROFILE_REPLACE, 0, 0)
|
||||||
|
TP_PROFILES.Controls.Add(Me.CH_PROFILE_CREATE, 1, 0)
|
||||||
|
TP_PROFILES.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
TP_PROFILES.Location = New System.Drawing.Point(0, 53)
|
||||||
|
TP_PROFILES.Margin = New System.Windows.Forms.Padding(0)
|
||||||
|
TP_PROFILES.Name = "TP_PROFILES"
|
||||||
|
TP_PROFILES.RowCount = 1
|
||||||
|
TP_PROFILES.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
|
TP_PROFILES.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
||||||
|
TP_PROFILES.Size = New System.Drawing.Size(534, 25)
|
||||||
|
TP_PROFILES.TabIndex = 2
|
||||||
|
'
|
||||||
|
'CH_PROFILE_REPLACE
|
||||||
|
'
|
||||||
|
Me.CH_PROFILE_REPLACE.AutoSize = True
|
||||||
|
Me.CH_PROFILE_REPLACE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CH_PROFILE_REPLACE.Location = New System.Drawing.Point(3, 3)
|
||||||
|
Me.CH_PROFILE_REPLACE.Name = "CH_PROFILE_REPLACE"
|
||||||
|
Me.CH_PROFILE_REPLACE.Size = New System.Drawing.Size(261, 19)
|
||||||
|
Me.CH_PROFILE_REPLACE.TabIndex = 0
|
||||||
|
Me.CH_PROFILE_REPLACE.Text = "Replace user profile"
|
||||||
|
TT_MAIN.SetToolTip(Me.CH_PROFILE_REPLACE, "The user profile will be replaced with the selected one")
|
||||||
|
Me.CH_PROFILE_REPLACE.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'CH_PROFILE_CREATE
|
||||||
|
'
|
||||||
|
Me.CH_PROFILE_CREATE.AutoSize = True
|
||||||
|
Me.CH_PROFILE_CREATE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CH_PROFILE_CREATE.Location = New System.Drawing.Point(270, 3)
|
||||||
|
Me.CH_PROFILE_CREATE.Name = "CH_PROFILE_CREATE"
|
||||||
|
Me.CH_PROFILE_CREATE.Size = New System.Drawing.Size(261, 19)
|
||||||
|
Me.CH_PROFILE_CREATE.TabIndex = 1
|
||||||
|
Me.CH_PROFILE_CREATE.Text = "Create path profile"
|
||||||
|
TT_MAIN.SetToolTip(Me.CH_PROFILE_CREATE, "Create a path profile if it doesn't exist")
|
||||||
|
Me.CH_PROFILE_CREATE.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
|
'FeedCopyToForm
|
||||||
|
'
|
||||||
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
|
Me.ClientSize = New System.Drawing.Size(534, 266)
|
||||||
|
Me.Controls.Add(CONTAINER_MAIN)
|
||||||
|
Me.KeyPreview = True
|
||||||
|
Me.MinimizeBox = False
|
||||||
|
Me.MinimumSize = New System.Drawing.Size(550, 305)
|
||||||
|
Me.Name = "FeedCopyToForm"
|
||||||
|
Me.ShowInTaskbar = False
|
||||||
|
Me.Text = "Copy to..."
|
||||||
|
CONTAINER_MAIN.ContentPanel.ResumeLayout(False)
|
||||||
|
CONTAINER_MAIN.ResumeLayout(False)
|
||||||
|
CONTAINER_MAIN.PerformLayout()
|
||||||
|
TP_MAIN.ResumeLayout(False)
|
||||||
|
TP_MAIN.PerformLayout()
|
||||||
|
CType(Me.CMB_DEST, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
FRM_FILES.ResumeLayout(False)
|
||||||
|
CType(Me.CMB_PROFILE, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
CType(Me.CMB_PROFILE_PATH, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
TP_PROFILES.ResumeLayout(False)
|
||||||
|
TP_PROFILES.PerformLayout()
|
||||||
|
Me.ResumeLayout(False)
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
Private WithEvents CMB_DEST As PersonalUtilities.Forms.Controls.ComboBoxExtended
|
||||||
|
Private WithEvents TXT_FILES As RichTextBox
|
||||||
|
Private WithEvents CH_VIDEO_SEP As CheckBox
|
||||||
|
Private WithEvents CMB_PROFILE As PersonalUtilities.Forms.Controls.ComboBoxExtended
|
||||||
|
Private WithEvents CMB_PROFILE_PATH As PersonalUtilities.Forms.Controls.ComboBoxExtended
|
||||||
|
Private WithEvents CH_PROFILE_REPLACE As CheckBox
|
||||||
|
Private WithEvents CH_PROFILE_CREATE As CheckBox
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
466
SCrawler/Download/Feed/FeedCopyToForm.resx
Normal file
@@ -0,0 +1,466 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="CONTAINER_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<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
|
||||||
|
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
|
||||||
|
WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP
|
||||||
|
aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+
|
||||||
|
5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8
|
||||||
|
vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB
|
||||||
|
cMaRN0UdBBkAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="ActionButton2.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="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>
|
||||||
|
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
|
||||||
|
AAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="FRM_FILES.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<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>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t
|
||||||
|
3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL
|
||||||
|
GlAKCkhEC4KgQlsLQkqhKi/lrYWWlxaw3dLddrerz/Q89+7dc2fbfTn3npf5fJJv2rS758z85nnOzJz5
|
||||||
|
nZktAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK3O3r79wVUIz65jfGNVxI/VIX69CvGO9M//a9P+e8o3B/8v
|
||||||
|
vKn9s+3fyX8dAJgmaWd+fl3E96Wd/E9XdvZHkfbvXNa+Rn45AGCS3bvjj/E/h3box5OrmxjPyy8PAEyS
|
||||||
|
XXO7zqhCeH/HDnwUOdCE+J6zdux4eH47YIrEGE8uy/Ls9Bnx/LooL0oH9b9Th/I1TVG+rCqKC+q6Xsh/
|
||||||
|
FJgmO8vy6WknfdPQTnsjckMdwlPy2wITLO3wF6si/lGas1ekuXvX0Fzuyg9S3psOCl6qDwimQB3ji9Ok
|
||||||
|
3btmEm907kpnEa/Mbw9Mlq1pB/6cdHZ/ZcfcPZrcXoXyrVVVFfl1gUmSdsS/libqPUMTd5NSvjktwrbB
|
||||||
|
kgDjVi1UT26K+Nnu+XrMuaud60uPWHpIfhtg3JqyfEaanHcPTdZNTRPCPy4uLj40LxIwBudt2fKAtOP/
|
||||||
|
0zQnN+5koIg3tpca81sC49J+LZcm5a3rJulYEq6LSV40YBOFEB6V5uFV6+flRiTsSwf9r81vDYzBCSO4
|
||||||
|
vjfq/KAuiqfm5QM2QRPjuWnubUbz71DCn6W33zpYCmDT1EX5m92Tcuy5q47xFXkxgQ3UduqnOXfn0Bzc
|
||||||
|
xJSvz4sCbIb2pzlp8v1w/WScnKSzkjekRT1hsMTAKC0vL5/Ydud3zb1NT1FelBcL2GiDm3d0TMTJy0ea
|
||||||
|
pjk1LzYwAu3NvtLc+uTQXBtn7tYYCJtja/vQno5JOJFpQrzWb4hhNJoQnpjm1Q3D82wCcnNRFKfnxQQ2
|
||||||
|
Qttk1zH5JjzhFmcIcHzyzb6O5aFem5J0sP/OvKjARmg7b7sm3xRkT3vDorwawJHb1t6Ep2NOTVoOtDch
|
||||||
|
yssMjFr6IPh8x8SbnsT4lrQamgPhCMzPzz+sifHjnXNpMnN5XnRglJaWlk5KE2z/0ISbxnzQQ0bgvlXz
|
||||||
|
1ePSXPnG0NyZ+DRF8Zi8CsCo7Azh0V0TbkrzRc2B0G3wIJ9429CcmZLce4MgYJTyff87JtzU5uayLM/J
|
||||||
|
qwcM7vD5+jQ3DgzNlWnKDXldgFFJZwW/2jHZpj1727uZ5VWE3mofqJXmw4eG5sdUpqqqXXm1gFGoQnhJ
|
||||||
|
12SbgRxoYvzjtIruK04vxRjPSvPgK0PzYmqTPqtemVcNGIU6xgu7JtusJH1ovH9ubu6UvLrQC2ncPyuN
|
||||||
|
/58Mz4fpTvnmvHrAKJQL5dO6J9ssJXxucWFhLq8yzLKtaUf5h2ncb9zz+8eUKsYP53UERmHX/PyOrsk2
|
||||||
|
g7nJDUWYZUuPWHpIE8oPdIz92UiMn86rCoxIOmOYta8KD5uftk2Peb1hZtTzdVOHcF3HmJ+ZVCF+Ia8u
|
||||||
|
MCppcl0+PNlmOG1zYPtYYc2BzIQ0np+ZxvWPh8b5LObqvMrAqEzRo4BHmctijCfnEsBUqkP5u2ksz8Kd
|
||||||
|
PI8g5SfyagOj0jbIpQk2c01DR5Brmh3NfC4DTI324LWO8V0dY3pm48mAsEGm7OEgo0sRb9wZ4+NzGWDi
|
||||||
|
lWUZ0ti9Zt1YnvUU8fdyCYBRmsFbAh9xqhDvqEN4Xi4FTKz8s93vD4/hPiSdpJyXywCMWPtrgKuGJ12P
|
||||||
|
ck/6gPmDXAuYOHVR/lY6UN3XMXb7kDv17MAGqhaqJ6WJ1sdegDUJ726a5oG5JDB2917vL+Kl3eO1N/lQ
|
||||||
|
LgewUdIO8E0dk69vubosy+25JDA2bYNuFeJnOsZovxLjhbkkwEZZXl4+0QfOvfl2Ogg4O5cFNl1dFE9N
|
||||||
|
4/B7Q+Oyj7mh/VzKZQE2UtM0j6iL+LWOidizhN3OPBiHuigvSmPwrvVjsn9pQnh1LguwGQa3Fo3fHp6M
|
||||||
|
Pcw97c1WcllgQy0tLZ2UDr7/qmMc9jJNiF/WkwNjMHhQ0GzfX/yIU8RLfRCxkdq+kzTfrugcf/3MgZ1l
|
||||||
|
+fRcHmCztU8Yq2P8h47J2cdcpTmQjdCE8IQ0vnzjdkjKP8nlAcZoWxXin3dP0n4l1eGb9UL92FwXOG51
|
||||||
|
Ub48ja09w2Otz2nvTJpKs21QIWDs0lnKb6TJqTEphN3NQvncXBY4VtvSju4N3WOs17l6cXHxoblGwKRo
|
||||||
|
r8mlHeAtHZO2b9mfDohem8sCR2XX3K4z0hj65NCYklSTGONpuUzApNlVFFWaqP81NHF7mvD2tnM7lwbu
|
||||||
|
V/vwqTR2vrV+LPU7VSjf4ff+MAU0B65NeWVd12fm0sBhpTnzosHDp7rGUV8T9lVFvDiXCJgSrmEezDea
|
||||||
|
onhMrgsM25rmyuvSODkwNG56nvZyYvi5XCNg2mgOXM3tVVH9ci4L3KtpmlN9W7Y+VYhfiEkuEzCt8n3L
|
||||||
|
fzA8yXuY/b7OZEVZlovt3ew6xknf8965ublTcpmAaac5cG3C2zQ09Vv7bVAaC/+7fmz0Og6QYVZpDlyT
|
||||||
|
GD/dPlgpl4b+2Nru5NIYuGfdmOhxmhB/VBblL+QaATNKc+DBfH1nCI/OdWHGtTewSdv874fGgIT4xfYb
|
||||||
|
wlwmYNZpDlzNbVUIz85lYUblJ2i6BDacGP/u7O3bH5zLBPSF5sDV7K+L+Nu5LMyYtJP7xbSNfzy0zfue
|
||||||
|
A+03gak8WwdVAnpHc+CaxHiJ5sCZsnK9f/+6bd3v3JZ2/r+SawT0mebAg0kfjB93v/Pp136t3X693bWN
|
||||||
|
e56v6nsBhmkOXE24Ph0EnJXrwpSp63qhDuXnu7dtn1P+U1VVP5PLBHAozYGDtD+LchvU6TN4Iqa+lqGs
|
||||||
|
XO8/YVAlgMPQHLiSsC+dNb0ml4UJVxflRWm73b1+O/Y5YXcVwvNziQDun+bANYnxkvO2bHlALg0TJsZ4
|
||||||
|
cl3ESzu3Xa8Trm+KYimXCeDIaQ48mKqIH9McOHl2zc/vaIr42a5t1vN8tCiK03OZAI6J5sCVFPFr7QNk
|
||||||
|
cl0Ys3yp6nvrtlO/s3K9f9ugSgDHSXPgILk58PxcFsYkX+93J8s1qUK8oynKF+YSAYyO5sCVhH3pgOjV
|
||||||
|
uSxsoqZpHpjq//bu7dLjFPHGND+Xc5kARk9z4JrE+JZUEl+1bpLFhYW5VPf/WLcd5N/ruj4zlwlg42gO
|
||||||
|
PCQfdXOVjdeE8MRU6xuGai9uXw2MgebA1YTrFkMoc10YsaYoX5rqfOf6uvc6e9LO/xW5RACbT3Pgam5N
|
||||||
|
B0Q/m8vCCLT3XnCQ2ZXwnWqhenIuE8D4aA5czV3OykZj19yuM1I9PzlUXwnhirIst+cyAYyf5sA1GTQH
|
||||||
|
uu/6MdoZ4+NTHb+1rq59j+v9wKTSHHhIPtI0zam5NByhNH5enGr306Fa9j1720ttuUQAE0tz4Epi/FJM
|
||||||
|
cl24b8ZNd25KdTk31whg8mkOXEm4pX1EbS4LHebn5x+WdnIf765fr3NVCOFRuUwA00Nz4Gr21kX58lwW
|
||||||
|
1qjmq8el+nxjqF4S4yVLS0sn5TIBTB/NgWuiOfAQTVE+J9XltnV16nXCvqqIF+cSAUw3zYGH5INnb9/+
|
||||||
|
4Fyavtra7uRSLe4Zqk3f88MmxvNyjQBmhiavg/liVVVFrkuvLC4uPjSt/4eG6iEhXlOWZchlApg9mgNX
|
||||||
|
c3P6wD8nl6UXqvlqZ1rv/xmqQ+/ThPJv5ufnH5TLBDC7NAeuZm97n/tclplWhfCstL4/GVr/nsf1fqCH
|
||||||
|
NAeu5kB7aSSVZFabA13v786tVVFckGsE0C+aAw8mnSG/f25u7pRcmpnQbt8mlB/oWt8+pwnxWk+PBNAc
|
||||||
|
uJoqxC/MSnNgs7BQ1yFc17WePc97Z+1AD+C4aA5czU3T/qjXdED3zLQePx5ar75nf77ev3VQJQBWaQ5c
|
||||||
|
zZ4qhJfkskyVuigvapvbOtapt2lC/FFTls/IJQKgi+bA1aw0B07FGWOM8eQ6xnd1rEe/E+OX2jGdywTA
|
||||||
|
fdEcuCYx/u2kXzNudjTz6az/c53L3+NUMX7YI6EBjp7mwIO5pt3J5rpMlHKhfFpavu8PLW/fM+s/7QTY
|
||||||
|
eJoDV/PduiiWc1kmwuB6f7x7aDn7ntvrGC/MJQLgeGgOHKQK8Y46hOflsoxN0zQPbEJ8Z9cy9jxf3RnC
|
||||||
|
o3OZABgFzYGrab9efl0qyViaAxcXFubSgchnOpar77k8xnhaLhMAo6Q5cE2K+L7NfoBMHcJT0nvfvG5Z
|
||||||
|
+h3X+wE2iebAg7m6LMvtuS4bKl/v14txSMLuKoQX5BIBsBk0B64kfCfV4om5LCN33pYtD3DA1ZVwfb1Q
|
||||||
|
PzaXCYDNpDlwJWH3RnSe75rbdUZ6/X9b/369z0eLojg9lwmAcdAcuJqV5sCRaEJ4QnrNbw+9R9+zcr1/
|
||||||
|
26BKAIyV5sBDcll7W95cmmPSPocgvc6dQ6/b9+xpivJluUQATBDNgQdz1TE2B6phV4p446TdhAmAIens
|
||||||
|
9ZXpQ1tz4KA58Am5LPfrrB07Hp7+zr90v1Z/UxXxU3Vdn5nLBMAk0xy4krC7WSifm8tyWGVZnl2F+M3u
|
||||||
|
1+hxYrxkeXn5xFwmAKaB5sDV7E9nsRfnsqyTdnIvGtxiuPPv9jV7Ul1ekUsEwLTRHHgwVSjfsbS0dFIu
|
||||||
|
TWtr+6uB9P8ODP/Znue7ZVmek2sEwBTT2Laa8sr2enb7jHoHRl0JV8QYH5nHDQCzwJ0DV/P1tKO7vuO/
|
||||||
|
9zpVKN/qej/AjNIcKB3Z24TyVXmIADCrNAfKmtzUxHhuHhoAzDrNgZJyVQjhUXlIANAjmgN7m/Du471d
|
||||||
|
MgBTzp0D+5Sw777uiQBAz2gO7EPCLSnn500OAAOaA2c615RlGfKmBoBDaQ6cvTQhvmd+fv5BeRMDwGFp
|
||||||
|
DpyJuN4PwDHQHDjVubUqigvypgSAo6M5cPrShHjtYghl3oQAcGw0B05Rivi+ubm5U/KmA4Djozlw4rM/
|
||||||
|
X+/fOthiADA6mgMnME2IP2rK8hl5GwHAxtAcOFH5SozxrLxpAGBjaQ4cf6oYP9w0zal5kwDA5tAcOLYc
|
||||||
|
aC/FpE1wwmBLAMAm0xy46bk91fvCXH4AGCvNgZuRIn6tKYrH5JoDwGTQHLihuTzGeFouNQBMFs2BI4/r
|
||||||
|
/QBMB82Bo0rYXYXwglxWAJh8mgOPN+H6eqF+bC4nAEwVzYHHkiL+c1EUp+caAsB00hx4FInxLalk2waV
|
||||||
|
A4AppznwfrOnLsqX53IBwOzQHHiYFPHGaqF6Ui4TAMwezYGHpirip+q6PjOXBwBmmubANjFesry8fGKu
|
||||||
|
CQD0Q4+bA/dWMf56LgMA9E8PmwO/W5blOXn1AaC/+tMcWF4ZY3xkXm0AYOabA2O8ZGlp6aS8ugDAGrPY
|
||||||
|
HLi3CeWr8voBAIczQ82BN6UDmnPzagEA92f6mwPLz1dVVeTVAQCO1LQ2B1Yh/PX8/PyD8moAAEdrupoD
|
||||||
|
w76qiBfnRQcAjtMUNAeGW1LOz8sLAIzKBDcHXlOWZciLCQCM2gQ2B142Nzd3Sl48AGCjTEhz4H7X+wFg
|
||||||
|
k425OfDWqqh+Pi8KALDJtqWDgDemHfKBoR30hqUJ8dqY5PcHAMalKcrnpJ3z94Z31qNO+/t+1/sBYIKk
|
||||||
|
k/LT6hD+Mu2oR/4rgXTW/+X02r+U3woAmDTtz/GaIv5F2nH/ZHhHfpS5J+Vf01n/S9LLbhu8OgAw0dpb
|
||||||
|
8TYL5XPTmfvb0o78v/MOvWtHvybtzXzKT1Qx/n5d1wv5pQCAaXXvAUFRLLXd+3WMFzZF+cKUl7X/rIri
|
||||||
|
gsWFhbn8RwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6LEtW/4flgYiLD1qeX0A
|
||||||
|
AAAASUVORK5CYII=
|
||||||
|
</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>
|
||||||
|
<data name="ActionButton8.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="TP_PROFILES.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TT_MAIN.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="TT_MAIN.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
</root>
|
||||||
278
SCrawler/Download/Feed/FeedCopyToForm.vb
Normal file
@@ -0,0 +1,278 @@
|
|||||||
|
' Copyright (C) Andy https://github.com/AAndyProgram
|
||||||
|
' This program is free software: you can redistribute it and/or modify
|
||||||
|
' it under the terms of the GNU General Public License as published by
|
||||||
|
' the Free Software Foundation, either version 3 of the License, or
|
||||||
|
' (at your option) any later version.
|
||||||
|
'
|
||||||
|
' This program is distributed in the hope that it will be useful,
|
||||||
|
' but WITHOUT ANY WARRANTY
|
||||||
|
Imports SCrawler.API
|
||||||
|
Imports SCrawler.API.Base
|
||||||
|
Imports PersonalUtilities.Tools
|
||||||
|
Imports PersonalUtilities.Forms
|
||||||
|
Imports PersonalUtilities.Forms.Controls
|
||||||
|
Imports PersonalUtilities.Forms.Controls.Base
|
||||||
|
Imports ADB = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons
|
||||||
|
Namespace DownloadObjects
|
||||||
|
Friend Class FeedCopyToForm
|
||||||
|
#Region "Declarations"
|
||||||
|
Private WithEvents MyDefs As DefaultFormOptions
|
||||||
|
Private _Result As FeedMoveCopyTo
|
||||||
|
Friend ReadOnly Property Result As FeedMoveCopyTo
|
||||||
|
Get
|
||||||
|
Return _Result
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Private ReadOnly Profiles As List(Of IUserData)
|
||||||
|
#End Region
|
||||||
|
#Region "Initializer"
|
||||||
|
Friend Sub New(ByVal Files As IEnumerable(Of SFile), ByVal IsCopy As Boolean)
|
||||||
|
InitializeComponent()
|
||||||
|
MyDefs = New DefaultFormOptions(Me, Settings.Design)
|
||||||
|
If Files.ListExists Then TXT_FILES.Text = Files.ListToString(vbNewLine)
|
||||||
|
Profiles = New List(Of IUserData)
|
||||||
|
Text = $"{IIf(IsCopy, "Copy", "Move")} files to..."
|
||||||
|
Try
|
||||||
|
If IsCopy Then
|
||||||
|
Icon = ImageRenderer.GetIcon(My.Resources.PastePic_32, EDP.ThrowException)
|
||||||
|
Else
|
||||||
|
Icon = ImageRenderer.GetIcon(My.Resources.CutPic_48, EDP.ThrowException)
|
||||||
|
End If
|
||||||
|
Catch
|
||||||
|
ShowIcon = False
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Form handlers"
|
||||||
|
Private Sub FeedCopyToForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||||
|
Try
|
||||||
|
With MyDefs
|
||||||
|
.MyViewInitialize()
|
||||||
|
.AddOkCancelToolbar()
|
||||||
|
.MyFieldsCheckerE = New FieldsChecker
|
||||||
|
With .MyFieldsCheckerE
|
||||||
|
.AddControl(Of String)(CMB_DEST, "Destination")
|
||||||
|
.EndLoaderOperations()
|
||||||
|
End With
|
||||||
|
Settings.DownloadLocations.PopulateComboBox(CMB_DEST)
|
||||||
|
With Settings
|
||||||
|
CMB_DEST.Text = .FeedMoveCopyLastLocation.Value
|
||||||
|
CH_VIDEO_SEP.Checked = .FeedMoveCopySeparateVideo
|
||||||
|
CH_PROFILE_REPLACE.Checked = .FeedMoveCopyReplaceUserProfile
|
||||||
|
CH_PROFILE_CREATE.Checked = .FeedMoveCopyCreatePathProfile
|
||||||
|
End With
|
||||||
|
If Settings.Users.Count > 0 Then _
|
||||||
|
Profiles.AddRange(Settings.Users.SelectMany(Of IUserData)(Function(ByVal p As IUserData) As IEnumerable(Of IUserData)
|
||||||
|
If p.IsCollection Then
|
||||||
|
Return DirectCast(p, UserDataBind).Collections
|
||||||
|
Else
|
||||||
|
Return {p}
|
||||||
|
End If
|
||||||
|
End Function))
|
||||||
|
If Profiles.Count > 0 Then
|
||||||
|
CMB_PROFILE.BeginUpdate()
|
||||||
|
CMB_PROFILE_PATH.BeginUpdate()
|
||||||
|
For i% = 0 To Profiles.Count - 1
|
||||||
|
With DirectCast(Profiles(i), UserDataBase)
|
||||||
|
If If(.HOST?.Key, String.Empty) = PathPlugin.PluginKey Then
|
||||||
|
CMB_PROFILE_PATH.Items.Add(New ListItem({ .Self.ToStringForLog, i}))
|
||||||
|
Else
|
||||||
|
CMB_PROFILE.Items.Add(New ListItem({ .Self.ToStringForLog, i}))
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
Next
|
||||||
|
CMB_PROFILE.EndUpdate()
|
||||||
|
CMB_PROFILE_PATH.EndUpdate()
|
||||||
|
End If
|
||||||
|
UpdateCombo()
|
||||||
|
If Not CMB_DEST.Text.IsEmptyString Then
|
||||||
|
_ComboChangingByDest = True
|
||||||
|
UpdateComboIndex(CMB_PROFILE)
|
||||||
|
UpdateComboIndex(CMB_PROFILE_PATH)
|
||||||
|
_ComboChangingByDest = False
|
||||||
|
End If
|
||||||
|
UpdateComboCheck()
|
||||||
|
.EndLoaderOperations()
|
||||||
|
.MyOkCancel.EnableOK = True
|
||||||
|
End With
|
||||||
|
Catch ex As Exception
|
||||||
|
MyDefs.InvokeLoaderError(ex)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub FeedCopyToForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
||||||
|
Dim b As Boolean = True
|
||||||
|
If e.KeyCode = Keys.O And e.Control Then
|
||||||
|
Settings.DownloadLocations.ChooseNewLocation(CMB_DEST, False, False)
|
||||||
|
ElseIf e.KeyCode = Keys.O And e.Alt Then
|
||||||
|
Settings.DownloadLocations.ChooseNewLocation(CMB_DEST, True, True)
|
||||||
|
Else
|
||||||
|
b = False
|
||||||
|
End If
|
||||||
|
If b Then e.Handled = True
|
||||||
|
End Sub
|
||||||
|
Private Sub FeedCopyToForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
||||||
|
Profiles.Clear()
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Ok, Cancel"
|
||||||
|
Private Sub MyDefs_ButtonOkClick(ByVal Sender As Object, ByVal e As KeyHandleEventArgs) Handles MyDefs.ButtonOkClick
|
||||||
|
Try
|
||||||
|
If MyDefs.MyFieldsChecker.AllParamsOK Then
|
||||||
|
_Result = New FeedMoveCopyTo With {
|
||||||
|
.Destination = CMB_DEST.Text,
|
||||||
|
.SeparateVideoFolder = CH_VIDEO_SEP.Checked,
|
||||||
|
.ReplaceUserProfile = CH_PROFILE_REPLACE.Checked,
|
||||||
|
.ReplaceUserProfile_CreateIfNull = CH_PROFILE_CREATE.Checked
|
||||||
|
}
|
||||||
|
If CH_PROFILE_REPLACE.Checked Then
|
||||||
|
If CMB_PROFILE.Enabled And CMB_PROFILE.Checked Then
|
||||||
|
With CMB_PROFILE
|
||||||
|
If .SelectedIndex >= 0 Then _
|
||||||
|
_Result.ReplaceUserProfile_Profile = Settings.GetUser(GetComboProfile(.Self), False)
|
||||||
|
End With
|
||||||
|
ElseIf CMB_PROFILE_PATH.Enabled And CMB_PROFILE_PATH.Checked Then
|
||||||
|
With CMB_PROFILE_PATH
|
||||||
|
If .SelectedIndex >= 0 Then _
|
||||||
|
_Result.ReplaceUserProfile_Profile = Settings.GetUser(GetComboProfile(.Self), False)
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
With Settings
|
||||||
|
.BeginUpdate()
|
||||||
|
.FeedMoveCopyLastLocation.Value = CMB_DEST.Text
|
||||||
|
.FeedMoveCopyIsProfileChecked.Value = CMB_PROFILE.Checked
|
||||||
|
.FeedMoveCopySeparateVideo.Value = CH_VIDEO_SEP.Checked
|
||||||
|
.FeedMoveCopyReplaceUserProfile.Value = CH_PROFILE_REPLACE.Checked
|
||||||
|
.FeedMoveCopyCreatePathProfile.Value = CH_PROFILE_CREATE.Checked
|
||||||
|
.EndUpdate()
|
||||||
|
End With
|
||||||
|
MyDefs.CloseForm()
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "[FeedCopyToForm.OK]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "Controls"
|
||||||
|
Private _TextChangingByCombo As Boolean = False
|
||||||
|
Private _ComboChangingByDest As Boolean = False
|
||||||
|
Private Sub CMB_DEST_ActionOnButtonClick(ByVal Sender As Object, ByVal e As ActionButtonEventArgs) Handles CMB_DEST.ActionOnButtonClick
|
||||||
|
If Sender.DefaultButton = ADB.Open Or Sender.DefaultButton = ADB.Add Then _
|
||||||
|
Settings.DownloadLocations.ChooseNewLocation(CMB_DEST, Sender.DefaultButton = ADB.Add, Sender.DefaultButton = ADB.Add)
|
||||||
|
End Sub
|
||||||
|
Private Sub CMB_DEST_ActionOnTextChanged(ByVal Sender As Object, ByVal e As EventArgs) Handles CMB_DEST.ActionOnTextChanged
|
||||||
|
If Not _TextChangingByCombo And Not CMB_DEST.Checked And Not CMB_DEST.Text.IsEmptyString Then
|
||||||
|
_ComboChangingByDest = True
|
||||||
|
UpdateComboIndex(CMB_PROFILE)
|
||||||
|
UpdateComboIndex(CMB_PROFILE_PATH)
|
||||||
|
UpdateComboCheck()
|
||||||
|
_ComboChangingByDest = False
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub UpdateComboIndex(ByVal CMB As ComboBoxExtended)
|
||||||
|
Try
|
||||||
|
With CMB
|
||||||
|
If .Count > 0 Then
|
||||||
|
Dim t$ = CMB_DEST.Text.CSFilePSN.StringToLower
|
||||||
|
Dim lvi_check As Func(Of ListItem, Boolean, Boolean) =
|
||||||
|
Function(ByVal lvi As ListItem, ByVal exact As Boolean) As Boolean
|
||||||
|
Dim ii% = lvi.Value(1)
|
||||||
|
If ii.ValueBetween(0, Profiles.Count - 1) Then
|
||||||
|
With DirectCast(Profiles(ii), UserDataBase)
|
||||||
|
If exact Then
|
||||||
|
Return t = .MyFile.CutPath.PathNoSeparator.StringToLower
|
||||||
|
Else
|
||||||
|
Return t.StartsWith(.MyFile.CutPath.PathNoSeparator.StringToLower)
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
End If
|
||||||
|
Return False
|
||||||
|
End Function
|
||||||
|
Dim i% = CMB.Items.ListIndexOf(Function(lvi) lvi_check.Invoke(lvi, True))
|
||||||
|
If i = -1 Then i = CMB.Items.ListIndexOf(Function(lvi) lvi_check.Invoke(lvi, False))
|
||||||
|
CMB.SelectedIndex = i
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
Catch ex As Exception
|
||||||
|
CMB.SelectedIndex = -1
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub UpdateComboCheck()
|
||||||
|
Try
|
||||||
|
Dim isProfile As Boolean
|
||||||
|
If CMB_PROFILE.SelectedIndex >= 0 And CMB_PROFILE_PATH.SelectedIndex >= 0 Then
|
||||||
|
isProfile = Settings.FeedMoveCopyIsProfileChecked
|
||||||
|
ElseIf CMB_PROFILE.SelectedIndex >= 0 Then
|
||||||
|
isProfile = True
|
||||||
|
ElseIf CMB_PROFILE_PATH.SelectedIndex >= 0 Then
|
||||||
|
isProfile = False
|
||||||
|
Else
|
||||||
|
isProfile = Settings.FeedMoveCopyIsProfileChecked
|
||||||
|
End If
|
||||||
|
If isProfile Then
|
||||||
|
CMB_PROFILE.Checked = True
|
||||||
|
Else
|
||||||
|
CMB_PROFILE_PATH.Checked = True
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[FeedCopyToForm.UpdateComboCheck]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Sub CH_PROFILE_REPLACE_CheckedChanged(sender As Object, e As EventArgs) Handles CH_PROFILE_REPLACE.CheckedChanged
|
||||||
|
UpdateCombo()
|
||||||
|
End Sub
|
||||||
|
Private Sub UpdateCombo()
|
||||||
|
Dim e As Boolean = CH_PROFILE_REPLACE.Checked
|
||||||
|
CH_PROFILE_CREATE.Enabled = e
|
||||||
|
CMB_PROFILE.Enabled(True) = e And CMB_PROFILE.Count > 0
|
||||||
|
CMB_PROFILE_PATH.Enabled(True) = e And CMB_PROFILE_PATH.Count > 0
|
||||||
|
End Sub
|
||||||
|
#Region "Comboboxes"
|
||||||
|
Private Sub CMB_PROFILE_ActionSelectedItemChanged(ByVal Sender As Object, ByVal e As EventArgs, ByVal Item As ListViewItem) Handles CMB_PROFILE.ActionSelectedItemChanged
|
||||||
|
If Not MyDefs.Initializing Then SetDestinationByCombo(CMB_PROFILE)
|
||||||
|
End Sub
|
||||||
|
Private Sub CMB_PROFILE_ActionOnCheckedChange(ByVal Sender As Object, ByVal e As EventArgs, ByVal Checked As Boolean) Handles CMB_PROFILE.ActionOnCheckedChange
|
||||||
|
If Checked And Not MyDefs.Initializing And Not _ComboChangingByDest Then SetDestinationByCombo(CMB_PROFILE)
|
||||||
|
End Sub
|
||||||
|
Private Sub CMB_PROFILE_ActionOnButtonClick(ByVal Sender As Object, ByVal e As ActionButtonEventArgs) Handles CMB_PROFILE.ActionOnButtonClick
|
||||||
|
If e.DefaultButton = ADB.Clear Then CMB_PROFILE.SelectedIndex = -1
|
||||||
|
End Sub
|
||||||
|
Private Sub CMB_PROFILE_PATH_ActionSelectedItemChanged(ByVal Sender As Object, ByVal e As EventArgs, ByVal Item As ListViewItem) Handles CMB_PROFILE_PATH.ActionSelectedItemChanged
|
||||||
|
If Not MyDefs.Initializing Then SetDestinationByCombo(CMB_PROFILE_PATH)
|
||||||
|
End Sub
|
||||||
|
Private Sub CMB_PROFILE_PATH_ActionOnButtonClick(ByVal Sender As Object, ByVal e As ActionButtonEventArgs) Handles CMB_PROFILE_PATH.ActionOnButtonClick
|
||||||
|
If e.DefaultButton = ADB.Clear Then CMB_PROFILE_PATH.SelectedIndex = -1
|
||||||
|
End Sub
|
||||||
|
Private Sub CMB_PROFILE_PATH_ActionOnCheckedChange(ByVal Sender As Object, ByVal e As EventArgs, ByVal Checked As Boolean) Handles CMB_PROFILE_PATH.ActionOnCheckedChange
|
||||||
|
If Checked And Not MyDefs.Initializing And Not _ComboChangingByDest Then SetDestinationByCombo(CMB_PROFILE_PATH)
|
||||||
|
End Sub
|
||||||
|
Private Sub SetDestinationByCombo(ByVal CMB As ComboBoxExtended)
|
||||||
|
Try
|
||||||
|
With CMB
|
||||||
|
If .Checked And .Enabled And Not CMB_DEST.Checked And Not _ComboChangingByDest And .SelectedIndex >= 0 Then
|
||||||
|
_TextChangingByCombo = True
|
||||||
|
CMB_DEST.Text = GetComboProfile(.Self).MyFile.CutPath.PathWithSeparator
|
||||||
|
_TextChangingByCombo = False
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[FeedCopyToForm.SetDestinationByCombo]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Private Function GetComboProfile(ByVal CMB As ComboBoxExtended) As UserDataBase
|
||||||
|
Try
|
||||||
|
With CMB
|
||||||
|
If .SelectedIndex >= 0 Then
|
||||||
|
Dim i% = .Items(.SelectedIndex).Value(1)
|
||||||
|
If i.ValueBetween(0, Profiles.Count - 1) Then Return Profiles(i)
|
||||||
|
End If
|
||||||
|
End With
|
||||||
|
Return Nothing
|
||||||
|
Catch ex As Exception
|
||||||
|
Return ErrorsDescriber.Execute(EDP.SendToLog + EDP.ReturnValue, ex, "[FeedCopyToForm.GetComboProfile]")
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
|
#End Region
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
163
SCrawler/Download/Feed/FeedMedia.Designer.vb
generated
@@ -24,8 +24,10 @@ Namespace DownloadObjects
|
|||||||
Private Sub InitializeComponent()
|
Private Sub InitializeComponent()
|
||||||
Me.components = New System.ComponentModel.Container()
|
Me.components = New System.ComponentModel.Container()
|
||||||
Dim CONTEXT_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
Dim CONTEXT_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||||
Dim CONTEXT_SEP_2 As System.Windows.Forms.ToolStripSeparator
|
|
||||||
Dim TP_LBL As System.Windows.Forms.TableLayoutPanel
|
Dim TP_LBL As System.Windows.Forms.TableLayoutPanel
|
||||||
|
Dim CONTEXT_SEP_3 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Dim CONTEXT_SEP_4 As System.Windows.Forms.ToolStripSeparator
|
||||||
|
Me.CONTEXT_SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.CH_CHECKED = New System.Windows.Forms.CheckBox()
|
Me.CH_CHECKED = New System.Windows.Forms.CheckBox()
|
||||||
Me.LBL_INFO = New System.Windows.Forms.Label()
|
Me.LBL_INFO = New System.Windows.Forms.Label()
|
||||||
Me.CONTEXT_DATA = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
Me.CONTEXT_DATA = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
||||||
@@ -35,21 +37,25 @@ Namespace DownloadObjects
|
|||||||
Me.BTT_CONTEXT_OPEN_USER = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_OPEN_USER = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_OPEN_USER_URL = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_OPEN_USER_URL = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_OPEN_USER_POST = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_OPEN_USER_POST = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_COPY_TO = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_MOVE_TO = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_FEED_ADD_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_FEED_ADD_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_FEED_REMOVE_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
|
Me.BTT_FEED_REMOVE_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_FIND_USER = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_FIND_USER = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.BTT_CONTEXT_INFO = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_INFO = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.CONTEXT_SEP_3 = New System.Windows.Forms.ToolStripSeparator()
|
Me.CONTEXT_SEP_5 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
Me.BTT_CONTEXT_DELETE = New System.Windows.Forms.ToolStripMenuItem()
|
Me.BTT_CONTEXT_DELETE = New System.Windows.Forms.ToolStripMenuItem()
|
||||||
Me.ICON_SITE = New System.Windows.Forms.PictureBox()
|
Me.ICON_SITE = New System.Windows.Forms.PictureBox()
|
||||||
Me.TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
Me.TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
||||||
Me.LBL_TITLE = New System.Windows.Forms.Label()
|
Me.LBL_TITLE = New System.Windows.Forms.Label()
|
||||||
Me.CONTEXT_SEP_4 = New System.Windows.Forms.ToolStripSeparator()
|
|
||||||
Me.BTT_FEED_ADD_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
|
||||||
Me.BTT_FEED_ADD_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
|
||||||
Me.BTT_FEED_REMOVE_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
|
||||||
Me.BTT_FEED_REMOVE_SPEC = New System.Windows.Forms.ToolStripMenuItem()
|
|
||||||
CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
CONTEXT_SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
|
||||||
TP_LBL = New System.Windows.Forms.TableLayoutPanel()
|
TP_LBL = New System.Windows.Forms.TableLayoutPanel()
|
||||||
|
CONTEXT_SEP_3 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
|
CONTEXT_SEP_4 = New System.Windows.Forms.ToolStripSeparator()
|
||||||
TP_LBL.SuspendLayout()
|
TP_LBL.SuspendLayout()
|
||||||
Me.CONTEXT_DATA.SuspendLayout()
|
Me.CONTEXT_DATA.SuspendLayout()
|
||||||
CType(Me.ICON_SITE, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.ICON_SITE, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
@@ -59,12 +65,12 @@ Namespace DownloadObjects
|
|||||||
'CONTEXT_SEP_1
|
'CONTEXT_SEP_1
|
||||||
'
|
'
|
||||||
CONTEXT_SEP_1.Name = "CONTEXT_SEP_1"
|
CONTEXT_SEP_1.Name = "CONTEXT_SEP_1"
|
||||||
CONTEXT_SEP_1.Size = New System.Drawing.Size(217, 6)
|
CONTEXT_SEP_1.Size = New System.Drawing.Size(302, 6)
|
||||||
'
|
'
|
||||||
'CONTEXT_SEP_2
|
'CONTEXT_SEP_2
|
||||||
'
|
'
|
||||||
CONTEXT_SEP_2.Name = "CONTEXT_SEP_2"
|
Me.CONTEXT_SEP_2.Name = "CONTEXT_SEP_2"
|
||||||
CONTEXT_SEP_2.Size = New System.Drawing.Size(217, 6)
|
Me.CONTEXT_SEP_2.Size = New System.Drawing.Size(302, 6)
|
||||||
'
|
'
|
||||||
'TP_LBL
|
'TP_LBL
|
||||||
'
|
'
|
||||||
@@ -108,76 +114,142 @@ Namespace DownloadObjects
|
|||||||
'
|
'
|
||||||
'CONTEXT_DATA
|
'CONTEXT_DATA
|
||||||
'
|
'
|
||||||
Me.CONTEXT_DATA.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.CONTEXT_SEP_0, Me.BTT_CONTEXT_OPEN_MEDIA, Me.BTT_CONTEXT_OPEN_USER, CONTEXT_SEP_1, Me.BTT_CONTEXT_OPEN_USER_URL, Me.BTT_CONTEXT_OPEN_USER_POST, CONTEXT_SEP_2, Me.BTT_FEED_ADD_FAV, Me.BTT_FEED_ADD_SPEC, Me.BTT_FEED_REMOVE_FAV, Me.BTT_FEED_REMOVE_SPEC, Me.CONTEXT_SEP_3, Me.BTT_CONTEXT_FIND_USER, Me.BTT_CONTEXT_INFO, Me.CONTEXT_SEP_4, Me.BTT_CONTEXT_DELETE})
|
Me.CONTEXT_DATA.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.CONTEXT_SEP_0, Me.BTT_CONTEXT_OPEN_MEDIA, Me.BTT_CONTEXT_OPEN_USER, CONTEXT_SEP_1, Me.BTT_CONTEXT_OPEN_USER_URL, Me.BTT_CONTEXT_OPEN_USER_POST, Me.CONTEXT_SEP_2, Me.BTT_COPY_TO, Me.BTT_MOVE_TO, CONTEXT_SEP_3, Me.BTT_FEED_ADD_FAV, Me.BTT_FEED_ADD_FAV_REMOVE, Me.BTT_FEED_ADD_SPEC, Me.BTT_FEED_ADD_SPEC_REMOVE, Me.BTT_FEED_REMOVE_FAV, Me.BTT_FEED_REMOVE_SPEC, CONTEXT_SEP_4, Me.BTT_CONTEXT_FIND_USER, Me.BTT_CONTEXT_INFO, Me.CONTEXT_SEP_5, Me.BTT_CONTEXT_DELETE})
|
||||||
Me.CONTEXT_DATA.Name = "CONTEXT_PIC"
|
Me.CONTEXT_DATA.Name = "CONTEXT_PIC"
|
||||||
Me.CONTEXT_DATA.Size = New System.Drawing.Size(221, 320)
|
Me.CONTEXT_DATA.Size = New System.Drawing.Size(306, 414)
|
||||||
'
|
'
|
||||||
'BTT_CONTEXT_DOWN
|
'BTT_CONTEXT_DOWN
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_Green_16
|
Me.BTT_CONTEXT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_Green_16
|
||||||
Me.BTT_CONTEXT_DOWN.Name = "BTT_CONTEXT_DOWN"
|
Me.BTT_CONTEXT_DOWN.Name = "BTT_CONTEXT_DOWN"
|
||||||
Me.BTT_CONTEXT_DOWN.Size = New System.Drawing.Size(220, 22)
|
Me.BTT_CONTEXT_DOWN.Size = New System.Drawing.Size(305, 22)
|
||||||
Me.BTT_CONTEXT_DOWN.Text = "Download"
|
Me.BTT_CONTEXT_DOWN.Text = "Download"
|
||||||
Me.BTT_CONTEXT_DOWN.Visible = False
|
Me.BTT_CONTEXT_DOWN.Visible = False
|
||||||
'
|
'
|
||||||
'CONTEXT_SEP_0
|
'CONTEXT_SEP_0
|
||||||
'
|
'
|
||||||
Me.CONTEXT_SEP_0.Name = "CONTEXT_SEP_0"
|
Me.CONTEXT_SEP_0.Name = "CONTEXT_SEP_0"
|
||||||
Me.CONTEXT_SEP_0.Size = New System.Drawing.Size(217, 6)
|
Me.CONTEXT_SEP_0.Size = New System.Drawing.Size(302, 6)
|
||||||
Me.CONTEXT_SEP_0.Visible = False
|
Me.CONTEXT_SEP_0.Visible = False
|
||||||
'
|
'
|
||||||
'BTT_CONTEXT_OPEN_MEDIA
|
'BTT_CONTEXT_OPEN_MEDIA
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_OPEN_MEDIA.Image = Global.SCrawler.My.Resources.Resources.FolderPic_32
|
Me.BTT_CONTEXT_OPEN_MEDIA.Image = Global.SCrawler.My.Resources.Resources.FolderPic_32
|
||||||
Me.BTT_CONTEXT_OPEN_MEDIA.Name = "BTT_CONTEXT_OPEN_MEDIA"
|
Me.BTT_CONTEXT_OPEN_MEDIA.Name = "BTT_CONTEXT_OPEN_MEDIA"
|
||||||
Me.BTT_CONTEXT_OPEN_MEDIA.Size = New System.Drawing.Size(220, 22)
|
Me.BTT_CONTEXT_OPEN_MEDIA.Size = New System.Drawing.Size(305, 22)
|
||||||
Me.BTT_CONTEXT_OPEN_MEDIA.Text = "Open"
|
Me.BTT_CONTEXT_OPEN_MEDIA.Text = "Open"
|
||||||
'
|
'
|
||||||
'BTT_CONTEXT_OPEN_USER
|
'BTT_CONTEXT_OPEN_USER
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_OPEN_USER.Image = Global.SCrawler.My.Resources.Resources.FolderPic_32
|
Me.BTT_CONTEXT_OPEN_USER.Image = Global.SCrawler.My.Resources.Resources.FolderPic_32
|
||||||
Me.BTT_CONTEXT_OPEN_USER.Name = "BTT_CONTEXT_OPEN_USER"
|
Me.BTT_CONTEXT_OPEN_USER.Name = "BTT_CONTEXT_OPEN_USER"
|
||||||
Me.BTT_CONTEXT_OPEN_USER.Size = New System.Drawing.Size(220, 22)
|
Me.BTT_CONTEXT_OPEN_USER.Size = New System.Drawing.Size(305, 22)
|
||||||
Me.BTT_CONTEXT_OPEN_USER.Text = "Open user"
|
Me.BTT_CONTEXT_OPEN_USER.Text = "Open user"
|
||||||
'
|
'
|
||||||
'BTT_CONTEXT_OPEN_USER_URL
|
'BTT_CONTEXT_OPEN_USER_URL
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_OPEN_USER_URL.Image = Global.SCrawler.My.Resources.Resources.GlobePic_32
|
Me.BTT_CONTEXT_OPEN_USER_URL.Image = Global.SCrawler.My.Resources.Resources.GlobePic_32
|
||||||
Me.BTT_CONTEXT_OPEN_USER_URL.Name = "BTT_CONTEXT_OPEN_USER_URL"
|
Me.BTT_CONTEXT_OPEN_USER_URL.Name = "BTT_CONTEXT_OPEN_USER_URL"
|
||||||
Me.BTT_CONTEXT_OPEN_USER_URL.Size = New System.Drawing.Size(220, 22)
|
Me.BTT_CONTEXT_OPEN_USER_URL.Size = New System.Drawing.Size(305, 22)
|
||||||
Me.BTT_CONTEXT_OPEN_USER_URL.Text = "Open user"
|
Me.BTT_CONTEXT_OPEN_USER_URL.Text = "Open user"
|
||||||
'
|
'
|
||||||
'BTT_CONTEXT_OPEN_USER_POST
|
'BTT_CONTEXT_OPEN_USER_POST
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_OPEN_USER_POST.Image = Global.SCrawler.My.Resources.Resources.GlobePic_32
|
Me.BTT_CONTEXT_OPEN_USER_POST.Image = Global.SCrawler.My.Resources.Resources.GlobePic_32
|
||||||
Me.BTT_CONTEXT_OPEN_USER_POST.Name = "BTT_CONTEXT_OPEN_USER_POST"
|
Me.BTT_CONTEXT_OPEN_USER_POST.Name = "BTT_CONTEXT_OPEN_USER_POST"
|
||||||
Me.BTT_CONTEXT_OPEN_USER_POST.Size = New System.Drawing.Size(220, 22)
|
Me.BTT_CONTEXT_OPEN_USER_POST.Size = New System.Drawing.Size(305, 22)
|
||||||
Me.BTT_CONTEXT_OPEN_USER_POST.Text = "Open post"
|
Me.BTT_CONTEXT_OPEN_USER_POST.Text = "Open post"
|
||||||
'
|
'
|
||||||
|
'BTT_COPY_TO
|
||||||
|
'
|
||||||
|
Me.BTT_COPY_TO.Image = Global.SCrawler.My.Resources.Resources.PastePic_32
|
||||||
|
Me.BTT_COPY_TO.Name = "BTT_COPY_TO"
|
||||||
|
Me.BTT_COPY_TO.Size = New System.Drawing.Size(305, 22)
|
||||||
|
Me.BTT_COPY_TO.Text = "Copy to..."
|
||||||
|
'
|
||||||
|
'BTT_MOVE_TO
|
||||||
|
'
|
||||||
|
Me.BTT_MOVE_TO.Image = Global.SCrawler.My.Resources.Resources.CutPic_48
|
||||||
|
Me.BTT_MOVE_TO.Name = "BTT_MOVE_TO"
|
||||||
|
Me.BTT_MOVE_TO.Size = New System.Drawing.Size(305, 22)
|
||||||
|
Me.BTT_MOVE_TO.Text = "Move to..."
|
||||||
|
'
|
||||||
|
'CONTEXT_SEP_3
|
||||||
|
'
|
||||||
|
CONTEXT_SEP_3.Name = "CONTEXT_SEP_3"
|
||||||
|
CONTEXT_SEP_3.Size = New System.Drawing.Size(302, 6)
|
||||||
|
'
|
||||||
|
'BTT_FEED_ADD_FAV
|
||||||
|
'
|
||||||
|
Me.BTT_FEED_ADD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
|
||||||
|
Me.BTT_FEED_ADD_FAV.Name = "BTT_FEED_ADD_FAV"
|
||||||
|
Me.BTT_FEED_ADD_FAV.Size = New System.Drawing.Size(305, 22)
|
||||||
|
Me.BTT_FEED_ADD_FAV.Text = "Add to Favorite"
|
||||||
|
'
|
||||||
|
'BTT_FEED_ADD_FAV_REMOVE
|
||||||
|
'
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE.Name = "BTT_FEED_ADD_FAV_REMOVE"
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE.Size = New System.Drawing.Size(305, 22)
|
||||||
|
Me.BTT_FEED_ADD_FAV_REMOVE.Text = "Add to Favorite (remove from current)"
|
||||||
|
'
|
||||||
|
'BTT_FEED_ADD_SPEC
|
||||||
|
'
|
||||||
|
Me.BTT_FEED_ADD_SPEC.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
|
||||||
|
Me.BTT_FEED_ADD_SPEC.Name = "BTT_FEED_ADD_SPEC"
|
||||||
|
Me.BTT_FEED_ADD_SPEC.Size = New System.Drawing.Size(305, 22)
|
||||||
|
Me.BTT_FEED_ADD_SPEC.Text = "Add to special feed..."
|
||||||
|
'
|
||||||
|
'BTT_FEED_ADD_SPEC_REMOVE
|
||||||
|
'
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE.Name = "BTT_FEED_ADD_SPEC_REMOVE"
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE.Size = New System.Drawing.Size(305, 22)
|
||||||
|
Me.BTT_FEED_ADD_SPEC_REMOVE.Text = "Add to special feed (remove from current)..."
|
||||||
|
'
|
||||||
|
'BTT_FEED_REMOVE_FAV
|
||||||
|
'
|
||||||
|
Me.BTT_FEED_REMOVE_FAV.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
||||||
|
Me.BTT_FEED_REMOVE_FAV.Name = "BTT_FEED_REMOVE_FAV"
|
||||||
|
Me.BTT_FEED_REMOVE_FAV.Size = New System.Drawing.Size(305, 22)
|
||||||
|
Me.BTT_FEED_REMOVE_FAV.Text = "Remove from Favorite"
|
||||||
|
'
|
||||||
|
'BTT_FEED_REMOVE_SPEC
|
||||||
|
'
|
||||||
|
Me.BTT_FEED_REMOVE_SPEC.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
||||||
|
Me.BTT_FEED_REMOVE_SPEC.Name = "BTT_FEED_REMOVE_SPEC"
|
||||||
|
Me.BTT_FEED_REMOVE_SPEC.Size = New System.Drawing.Size(305, 22)
|
||||||
|
Me.BTT_FEED_REMOVE_SPEC.Text = "Remove from special feed..."
|
||||||
|
'
|
||||||
|
'CONTEXT_SEP_4
|
||||||
|
'
|
||||||
|
CONTEXT_SEP_4.Name = "CONTEXT_SEP_4"
|
||||||
|
CONTEXT_SEP_4.Size = New System.Drawing.Size(302, 6)
|
||||||
|
'
|
||||||
'BTT_CONTEXT_FIND_USER
|
'BTT_CONTEXT_FIND_USER
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_FIND_USER.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32
|
Me.BTT_CONTEXT_FIND_USER.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32
|
||||||
Me.BTT_CONTEXT_FIND_USER.Name = "BTT_CONTEXT_FIND_USER"
|
Me.BTT_CONTEXT_FIND_USER.Name = "BTT_CONTEXT_FIND_USER"
|
||||||
Me.BTT_CONTEXT_FIND_USER.Size = New System.Drawing.Size(220, 22)
|
Me.BTT_CONTEXT_FIND_USER.Size = New System.Drawing.Size(305, 22)
|
||||||
Me.BTT_CONTEXT_FIND_USER.Text = "Find user"
|
Me.BTT_CONTEXT_FIND_USER.Text = "Find user"
|
||||||
'
|
'
|
||||||
'BTT_CONTEXT_INFO
|
'BTT_CONTEXT_INFO
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32
|
Me.BTT_CONTEXT_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32
|
||||||
Me.BTT_CONTEXT_INFO.Name = "BTT_CONTEXT_INFO"
|
Me.BTT_CONTEXT_INFO.Name = "BTT_CONTEXT_INFO"
|
||||||
Me.BTT_CONTEXT_INFO.Size = New System.Drawing.Size(220, 22)
|
Me.BTT_CONTEXT_INFO.Size = New System.Drawing.Size(305, 22)
|
||||||
Me.BTT_CONTEXT_INFO.Text = "Information"
|
Me.BTT_CONTEXT_INFO.Text = "Information"
|
||||||
'
|
'
|
||||||
'CONTEXT_SEP_3
|
'CONTEXT_SEP_5
|
||||||
'
|
'
|
||||||
Me.CONTEXT_SEP_3.Name = "CONTEXT_SEP_3"
|
Me.CONTEXT_SEP_5.Name = "CONTEXT_SEP_5"
|
||||||
Me.CONTEXT_SEP_3.Size = New System.Drawing.Size(217, 6)
|
Me.CONTEXT_SEP_5.Size = New System.Drawing.Size(302, 6)
|
||||||
'
|
'
|
||||||
'BTT_CONTEXT_DELETE
|
'BTT_CONTEXT_DELETE
|
||||||
'
|
'
|
||||||
Me.BTT_CONTEXT_DELETE.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
Me.BTT_CONTEXT_DELETE.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
||||||
Me.BTT_CONTEXT_DELETE.Name = "BTT_CONTEXT_DELETE"
|
Me.BTT_CONTEXT_DELETE.Name = "BTT_CONTEXT_DELETE"
|
||||||
Me.BTT_CONTEXT_DELETE.Size = New System.Drawing.Size(220, 22)
|
Me.BTT_CONTEXT_DELETE.Size = New System.Drawing.Size(305, 22)
|
||||||
Me.BTT_CONTEXT_DELETE.Text = "Delete"
|
Me.BTT_CONTEXT_DELETE.Text = "Delete"
|
||||||
'
|
'
|
||||||
'ICON_SITE
|
'ICON_SITE
|
||||||
@@ -217,39 +289,6 @@ Namespace DownloadObjects
|
|||||||
Me.LBL_TITLE.Size = New System.Drawing.Size(140, 25)
|
Me.LBL_TITLE.Size = New System.Drawing.Size(140, 25)
|
||||||
Me.LBL_TITLE.TabIndex = 1
|
Me.LBL_TITLE.TabIndex = 1
|
||||||
'
|
'
|
||||||
'CONTEXT_SEP_4
|
|
||||||
'
|
|
||||||
Me.CONTEXT_SEP_4.Name = "CONTEXT_SEP_4"
|
|
||||||
Me.CONTEXT_SEP_4.Size = New System.Drawing.Size(217, 6)
|
|
||||||
'
|
|
||||||
'BTT_FEED_ADD_FAV
|
|
||||||
'
|
|
||||||
Me.BTT_FEED_ADD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
|
|
||||||
Me.BTT_FEED_ADD_FAV.Name = "BTT_FEED_ADD_FAV"
|
|
||||||
Me.BTT_FEED_ADD_FAV.Size = New System.Drawing.Size(220, 22)
|
|
||||||
Me.BTT_FEED_ADD_FAV.Text = "Add to Favorite"
|
|
||||||
'
|
|
||||||
'BTT_FEED_ADD_SPEC
|
|
||||||
'
|
|
||||||
Me.BTT_FEED_ADD_SPEC.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
|
|
||||||
Me.BTT_FEED_ADD_SPEC.Name = "BTT_FEED_ADD_SPEC"
|
|
||||||
Me.BTT_FEED_ADD_SPEC.Size = New System.Drawing.Size(220, 22)
|
|
||||||
Me.BTT_FEED_ADD_SPEC.Text = "Add to special feed..."
|
|
||||||
'
|
|
||||||
'BTT_FEED_REMOVE_FAV
|
|
||||||
'
|
|
||||||
Me.BTT_FEED_REMOVE_FAV.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
|
||||||
Me.BTT_FEED_REMOVE_FAV.Name = "BTT_FEED_REMOVE_FAV"
|
|
||||||
Me.BTT_FEED_REMOVE_FAV.Size = New System.Drawing.Size(220, 22)
|
|
||||||
Me.BTT_FEED_REMOVE_FAV.Text = "Remove from Favorite"
|
|
||||||
'
|
|
||||||
'BTT_FEED_REMOVE_SPEC
|
|
||||||
'
|
|
||||||
Me.BTT_FEED_REMOVE_SPEC.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
|
|
||||||
Me.BTT_FEED_REMOVE_SPEC.Name = "BTT_FEED_REMOVE_SPEC"
|
|
||||||
Me.BTT_FEED_REMOVE_SPEC.Size = New System.Drawing.Size(220, 22)
|
|
||||||
Me.BTT_FEED_REMOVE_SPEC.Text = "Remove from special feed..."
|
|
||||||
'
|
|
||||||
'FeedMedia
|
'FeedMedia
|
||||||
'
|
'
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
@@ -283,7 +322,6 @@ Namespace DownloadObjects
|
|||||||
Private WithEvents LBL_INFO As Label
|
Private WithEvents LBL_INFO As Label
|
||||||
Private WithEvents BTT_CONTEXT_INFO As ToolStripMenuItem
|
Private WithEvents BTT_CONTEXT_INFO As ToolStripMenuItem
|
||||||
Private WithEvents ICON_SITE As PictureBox
|
Private WithEvents ICON_SITE As PictureBox
|
||||||
Private WithEvents CONTEXT_SEP_3 As ToolStripSeparator
|
|
||||||
Private WithEvents BTT_CONTEXT_DOWN As ToolStripMenuItem
|
Private WithEvents BTT_CONTEXT_DOWN As ToolStripMenuItem
|
||||||
Private WithEvents CONTEXT_SEP_0 As ToolStripSeparator
|
Private WithEvents CONTEXT_SEP_0 As ToolStripSeparator
|
||||||
Private WithEvents LBL_TITLE As Label
|
Private WithEvents LBL_TITLE As Label
|
||||||
@@ -291,6 +329,11 @@ Namespace DownloadObjects
|
|||||||
Private WithEvents BTT_FEED_ADD_SPEC As ToolStripMenuItem
|
Private WithEvents BTT_FEED_ADD_SPEC As ToolStripMenuItem
|
||||||
Private WithEvents BTT_FEED_REMOVE_FAV As ToolStripMenuItem
|
Private WithEvents BTT_FEED_REMOVE_FAV As ToolStripMenuItem
|
||||||
Private WithEvents BTT_FEED_REMOVE_SPEC As ToolStripMenuItem
|
Private WithEvents BTT_FEED_REMOVE_SPEC As ToolStripMenuItem
|
||||||
Private WithEvents CONTEXT_SEP_4 As ToolStripSeparator
|
Private WithEvents BTT_FEED_ADD_FAV_REMOVE As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_FEED_ADD_SPEC_REMOVE As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_COPY_TO As ToolStripMenuItem
|
||||||
|
Private WithEvents BTT_MOVE_TO As ToolStripMenuItem
|
||||||
|
Private WithEvents CONTEXT_SEP_5 As ToolStripSeparator
|
||||||
|
Private WithEvents CONTEXT_SEP_2 As ToolStripSeparator
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -120,13 +120,16 @@
|
|||||||
<metadata name="CONTEXT_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="CONTEXT_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="CONTEXT_SEP_2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>False</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="TP_LBL.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="TP_LBL.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="CONTEXT_DATA.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="CONTEXT_DATA.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<metadata name="CONTEXT_SEP_3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="CONTEXT_SEP_4.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>False</value>
|
||||||
|
</metadata>
|
||||||
</root>
|
</root>
|
||||||
@@ -17,6 +17,8 @@ Namespace DownloadObjects
|
|||||||
#Region "Events"
|
#Region "Events"
|
||||||
Friend Event MediaDeleted(ByVal Sender As Object)
|
Friend Event MediaDeleted(ByVal Sender As Object)
|
||||||
Friend Event MediaDownload As EventHandler
|
Friend Event MediaDownload As EventHandler
|
||||||
|
Friend Event FeedAddWithRemove(ByVal Sender As FeedMedia, ByVal Feeds As IEnumerable(Of String), ByVal Media As UserMediaD, ByVal RemoveOperation As Boolean)
|
||||||
|
Friend Event MediaMove(ByVal Sender As FeedMedia, ByVal MCTOptions As FeedMoveCopyTo, ByRef Result As Boolean)
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
Private Const VideoHeight As Integer = 450
|
Private Const VideoHeight As Integer = 450
|
||||||
@@ -74,7 +76,7 @@ Namespace DownloadObjects
|
|||||||
Private ReadOnly Property IsSubscription As Boolean = False
|
Private ReadOnly Property IsSubscription As Boolean = False
|
||||||
Private Function GetImageResize(ByVal Width As Integer, ByVal Height As Integer) As Size
|
Private Function GetImageResize(ByVal Width As Integer, ByVal Height As Integer) As Size
|
||||||
If Height > 0 Then
|
If Height > 0 Then
|
||||||
Dim h% = Height = ObjectsPaddingHeight
|
Dim h% = Height - ObjectsPaddingHeight
|
||||||
If h <= 0 Then h = Height
|
If h <= 0 Then h = Height
|
||||||
Dim s As Size = MyImage.FitToHeightF(h)
|
Dim s As Size = MyImage.FitToHeightF(h)
|
||||||
s = MyImage.FitToWidthF(s, Width, False)
|
s = MyImage.FitToWidthF(s, Width, False)
|
||||||
@@ -176,9 +178,13 @@ Namespace DownloadObjects
|
|||||||
BTT_CONTEXT_DOWN.Visible = True
|
BTT_CONTEXT_DOWN.Visible = True
|
||||||
CONTEXT_SEP_0.Visible = True
|
CONTEXT_SEP_0.Visible = True
|
||||||
BTT_CONTEXT_OPEN_USER.Visible = False
|
BTT_CONTEXT_OPEN_USER.Visible = False
|
||||||
CONTEXT_SEP_4.Visible = False
|
CONTEXT_SEP_5.Visible = False
|
||||||
BTT_CONTEXT_DELETE.Visible = False
|
BTT_CONTEXT_DELETE.Visible = False
|
||||||
|
|
||||||
|
CONTEXT_SEP_2.Visible = False
|
||||||
|
BTT_COPY_TO.Visible = False
|
||||||
|
BTT_MOVE_TO.Visible = False
|
||||||
|
|
||||||
If Not Media.Data.URL.IsEmptyString Then
|
If Not Media.Data.URL.IsEmptyString Then
|
||||||
Dim ext$ = Media.Data.URL.CSFile.Extension
|
Dim ext$ = Media.Data.URL.CSFile.Extension
|
||||||
Dim imgFile As New SFile With {.Path = Settings.Cache.RootDirectory.Path}
|
Dim imgFile As New SFile With {.Path = Settings.Cache.RootDirectory.Path}
|
||||||
@@ -191,8 +197,7 @@ Namespace DownloadObjects
|
|||||||
End With
|
End With
|
||||||
If Not imgFile.Exists Then
|
If Not imgFile.Exists Then
|
||||||
Settings.Cache.Validate()
|
Settings.Cache.Validate()
|
||||||
GetWebFile(Media.Data.URL, imgFile, EDP.None)
|
If GetWebFile(Media.Data.URL, imgFile, EDP.None) AndAlso imgFile.Exists Then File = ConvertWebp(imgFile)
|
||||||
If imgFile.Exists Then File = ConvertWebp(imgFile)
|
|
||||||
Else
|
Else
|
||||||
File = imgFile
|
File = imgFile
|
||||||
End If
|
End If
|
||||||
@@ -228,7 +233,12 @@ Namespace DownloadObjects
|
|||||||
Case UserMedia.Types.Picture, UserMedia.Types.GIF
|
Case UserMedia.Types.Picture, UserMedia.Types.GIF
|
||||||
Dim tmpMediaFile As SFile = ConvertWebp(File, True)
|
Dim tmpMediaFile As SFile = ConvertWebp(File, True)
|
||||||
If tmpMediaFile.IsEmptyString Then Throw New ArgumentNullException With {.HelpLink = 1}
|
If tmpMediaFile.IsEmptyString Then Throw New ArgumentNullException With {.HelpLink = 1}
|
||||||
MyImage = New ImageRenderer(tmpMediaFile)
|
Try
|
||||||
|
MyImage = New ImageRenderer(tmpMediaFile, EDP.ThrowException)
|
||||||
|
Catch
|
||||||
|
MyImage.DisposeIfReady
|
||||||
|
MyImage = New ImageRenderer(New Bitmap(10, 10))
|
||||||
|
End Try
|
||||||
Dim a As AnchorStyles = AnchorStyles.Top + If(Height > 0, 0, AnchorStyles.Left)
|
Dim a As AnchorStyles = AnchorStyles.Top + If(Height > 0, 0, AnchorStyles.Left)
|
||||||
s = GetImageResize(Width, Height)
|
s = GetImageResize(Width, Height)
|
||||||
h = s.Height
|
h = s.Height
|
||||||
@@ -314,6 +324,7 @@ Namespace DownloadObjects
|
|||||||
For Each fItem As FeedSpecial In .Self
|
For Each fItem As FeedSpecial In .Self
|
||||||
If Not fItem.IsFavorite Then
|
If Not fItem.IsFavorite Then
|
||||||
DownloadFeedForm.AddNewFeedItem(BTT_FEED_ADD_SPEC, CONTEXT_DATA, fItem, Nothing, AddressOf Feed_SPEC_ADD)
|
DownloadFeedForm.AddNewFeedItem(BTT_FEED_ADD_SPEC, CONTEXT_DATA, fItem, Nothing, AddressOf Feed_SPEC_ADD)
|
||||||
|
DownloadFeedForm.AddNewFeedItem(BTT_FEED_ADD_SPEC_REMOVE, CONTEXT_DATA, fItem, Nothing, AddressOf Feed_SPEC_ADD_REMOVE)
|
||||||
DownloadFeedForm.AddNewFeedItem(BTT_FEED_REMOVE_SPEC, CONTEXT_DATA, fItem, Nothing, AddressOf Feed_SPEC_REMOVE)
|
DownloadFeedForm.AddNewFeedItem(BTT_FEED_REMOVE_SPEC, CONTEXT_DATA, fItem, Nothing, AddressOf Feed_SPEC_REMOVE)
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
@@ -333,6 +344,7 @@ Namespace DownloadObjects
|
|||||||
#Region "Feed handlers"
|
#Region "Feed handlers"
|
||||||
Private Sub Feed_FeedAdded(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
|
Private Sub Feed_FeedAdded(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
|
||||||
DownloadFeedForm.AddNewFeedItem(BTT_FEED_ADD_SPEC, CONTEXT_DATA, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD, True)
|
DownloadFeedForm.AddNewFeedItem(BTT_FEED_ADD_SPEC, CONTEXT_DATA, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD, True)
|
||||||
|
DownloadFeedForm.AddNewFeedItem(BTT_FEED_ADD_SPEC_REMOVE, CONTEXT_DATA, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD_REMOVE, True)
|
||||||
DownloadFeedForm.AddNewFeedItem(BTT_FEED_REMOVE_SPEC, CONTEXT_DATA, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_REMOVE, True)
|
DownloadFeedForm.AddNewFeedItem(BTT_FEED_REMOVE_SPEC, CONTEXT_DATA, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_REMOVE, True)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Feed_FeedRemoved(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
|
Private Sub Feed_FeedRemoved(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
|
||||||
@@ -340,12 +352,20 @@ Namespace DownloadObjects
|
|||||||
DownloadFeedForm.Feed_FeedRemoved(BTT_FEED_REMOVE_SPEC, CONTEXT_DATA, Feed)
|
DownloadFeedForm.Feed_FeedRemoved(BTT_FEED_REMOVE_SPEC, CONTEXT_DATA, Feed)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Feed_SPEC_ADD(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
Private Sub Feed_SPEC_ADD(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
||||||
|
Feed_SPEC_ADD_Impl(Source)
|
||||||
|
End Sub
|
||||||
|
Private Function Feed_SPEC_ADD_Impl(ByVal Source As ToolStripMenuItem) As FeedSpecial
|
||||||
Dim f As FeedSpecial = Source.Tag
|
Dim f As FeedSpecial = Source.Tag
|
||||||
If Not f Is Nothing AndAlso Not f.Disposed Then f.Add(Media)
|
If Not f Is Nothing AndAlso Not f.Disposed Then f.Add(Media) : Return f
|
||||||
|
Return Nothing
|
||||||
|
End Function
|
||||||
|
Private Sub Feed_SPEC_ADD_REMOVE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
||||||
|
Dim f As FeedSpecial = Feed_SPEC_ADD_Impl(Source)
|
||||||
|
If Not f Is Nothing Then RaiseEvent FeedAddWithRemove(Me, {f.Name}, Media, False)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Feed_SPEC_REMOVE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
Private Sub Feed_SPEC_REMOVE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
|
||||||
Dim f As FeedSpecial = Source.Tag
|
Dim f As FeedSpecial = Source.Tag
|
||||||
If Not f Is Nothing AndAlso Not f.Disposed Then f.Remove(Media)
|
If Not f Is Nothing AndAlso Not f.Disposed Then f.Remove(Media) : RaiseEvent FeedAddWithRemove(Me, {f.Name}, Media, True)
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Dispose"
|
#Region "Dispose"
|
||||||
@@ -463,27 +483,64 @@ Namespace DownloadObjects
|
|||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "Copy, Move"
|
||||||
|
Private Sub BTT_COPY_MOVE_TO_Click(sender As Object, e As EventArgs) Handles BTT_COPY_TO.Click, BTT_MOVE_TO.Click
|
||||||
|
Const MsgTitle$ = "Copy/Move checked files"
|
||||||
|
Try
|
||||||
|
If Not File.IsEmptyString Then
|
||||||
|
Dim isCopy As Boolean = sender Is BTT_COPY_TO
|
||||||
|
Dim moveOptions As FeedMoveCopyTo = Nothing
|
||||||
|
Dim ff As SFile = File
|
||||||
|
Dim result As Boolean = False
|
||||||
|
|
||||||
|
Using f As New FeedCopyToForm({File}, isCopy)
|
||||||
|
f.ShowDialog()
|
||||||
|
If f.DialogResult = DialogResult.OK Then moveOptions = f.Result
|
||||||
|
End Using
|
||||||
|
If Not moveOptions.Destination.IsEmptyString Then
|
||||||
|
ff.Path = moveOptions.Destination.Path
|
||||||
|
If isCopy Then
|
||||||
|
result = File.Copy(ff)
|
||||||
|
Else
|
||||||
|
RaiseEvent MediaMove(Me, moveOptions, result)
|
||||||
|
End If
|
||||||
|
If result Then MsgBoxE({$"File {IIf(isCopy, "copied", "moved")}{vbCr}Source: '{File}'{vbCr}Destination: '{ff}'", MsgTitle})
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, MsgTitle)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
#Region "Feed"
|
#Region "Feed"
|
||||||
Private Sub BTT_FEED_ADD_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_FAV.Click
|
Private Sub BTT_FEED_ADD_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_FAV.Click, BTT_FEED_ADD_FAV_REMOVE.Click
|
||||||
With Settings.Feeds.Favorite
|
With Settings.Feeds.Favorite
|
||||||
If Not .Contains(Media) Then .Add(Media)
|
If Not .Contains(Media) Then .Add(Media)
|
||||||
BTT_FEED_ADD_FAV.ControlChangeColor(True, False)
|
BTT_FEED_ADD_FAV.ControlChangeColor(True, False)
|
||||||
|
If sender Is BTT_FEED_ADD_FAV_REMOVE Then RaiseEvent FeedAddWithRemove(Me, {FeedSpecial.FavoriteName}, Media, False)
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_FEED_ADD_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_SPEC.Click
|
Private Sub BTT_FEED_ADD_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_SPEC.Click, BTT_FEED_ADD_SPEC_REMOVE.Click
|
||||||
With FeedSpecialCollection.ChooseFeeds(True)
|
With FeedSpecialCollection.ChooseFeeds(True)
|
||||||
If .ListExists Then .ForEach(Sub(f) f.Add(Media))
|
If .ListExists Then
|
||||||
|
.ForEach(Sub(f) f.Add(Media))
|
||||||
|
If sender Is BTT_FEED_ADD_SPEC_REMOVE Then RaiseEvent FeedAddWithRemove(Me, .Select(Function(f) f.Name), Media, False)
|
||||||
|
End If
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_FEED_REMOVE_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_FAV.Click
|
Private Sub BTT_FEED_REMOVE_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_FAV.Click
|
||||||
With Settings.Feeds.Favorite
|
With Settings.Feeds.Favorite
|
||||||
If .Contains(Media) Then .Remove(Media)
|
If .Contains(Media) Then .Remove(Media)
|
||||||
BTT_FEED_ADD_FAV.ControlChangeColor(True)
|
BTT_FEED_ADD_FAV.ControlChangeColor(True)
|
||||||
|
RaiseEvent FeedAddWithRemove(Me, {FeedSpecial.FavoriteName}, Media, True)
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub BTT_FEED_REMOVE_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_SPEC.Click
|
Private Sub BTT_FEED_REMOVE_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_SPEC.Click
|
||||||
With FeedSpecialCollection.ChooseFeeds(False)
|
With FeedSpecialCollection.ChooseFeeds(False)
|
||||||
If .ListExists Then .ForEach(Sub(f) f.Remove(Media))
|
If .ListExists Then
|
||||||
|
.ForEach(Sub(f) f.Remove(Media))
|
||||||
|
RaiseEvent FeedAddWithRemove(Me, .Select(Function(f) f.Name), Media, True)
|
||||||
|
End If
|
||||||
End With
|
End With
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
|
|||||||
31
SCrawler/Download/Feed/FeedMoveCopyTo.vb
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
' Copyright (C) Andy https://github.com/AAndyProgram
|
||||||
|
' This program is free software: you can redistribute it and/or modify
|
||||||
|
' it under the terms of the GNU General Public License as published by
|
||||||
|
' the Free Software Foundation, either version 3 of the License, or
|
||||||
|
' (at your option) any later version.
|
||||||
|
'
|
||||||
|
' This program is distributed in the hope that it will be useful,
|
||||||
|
' but WITHOUT ANY WARRANTY
|
||||||
|
Imports UTypes = SCrawler.API.Base.UserMedia.Types
|
||||||
|
Namespace DownloadObjects
|
||||||
|
Friend Structure FeedMoveCopyTo
|
||||||
|
Friend Destination As SFile
|
||||||
|
Friend SeparateVideoFolder As Boolean
|
||||||
|
Friend ReplaceUserProfile As Boolean
|
||||||
|
Friend ReplaceUserProfile_CreateIfNull As Boolean
|
||||||
|
Friend ReplaceUserProfile_Profile As API.Base.IUserData
|
||||||
|
Friend ReadOnly Property DestinationTrue(ByVal Media As TDownloader.UserMediaD) As SFile
|
||||||
|
Get
|
||||||
|
If SeparateVideoFolder Then
|
||||||
|
Dim f$ = Destination.PathWithSeparator
|
||||||
|
With Media.Data
|
||||||
|
If Not (.Type = UTypes.Picture Or .Type = UTypes.GIF) Then f &= "Video\"
|
||||||
|
End With
|
||||||
|
Return f
|
||||||
|
Else
|
||||||
|
Return Destination
|
||||||
|
End If
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
End Structure
|
||||||
|
End Namespace
|
||||||
@@ -30,6 +30,7 @@ Namespace DownloadObjects
|
|||||||
Friend Const FavoriteName As String = "Favorite"
|
Friend Const FavoriteName As String = "Favorite"
|
||||||
Friend Const SpecialName As String = "Special"
|
Friend Const SpecialName As String = "Special"
|
||||||
Private ReadOnly Items As List(Of UserMediaD)
|
Private ReadOnly Items As List(Of UserMediaD)
|
||||||
|
Private _FilesUpdated As Boolean = False
|
||||||
Private _File As SFile
|
Private _File As SFile
|
||||||
Friend ReadOnly Property File As SFile
|
Friend ReadOnly Property File As SFile
|
||||||
Get
|
Get
|
||||||
@@ -167,6 +168,26 @@ Namespace DownloadObjects
|
|||||||
Return Item
|
Return Item
|
||||||
End Function
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
|
#Region "UpdateDataByFile"
|
||||||
|
Friend Sub UpdateDataByFile(ByVal InitialFile As SFile, ByVal NewFile As SFile, ByVal MCTOptions As FeedMoveCopyTo)
|
||||||
|
Try
|
||||||
|
Dim indx% = Items.FindIndex(Function(ii) ii.Data.File = InitialFile)
|
||||||
|
If indx >= 0 Then
|
||||||
|
Dim m As UserMediaD = Items(indx)
|
||||||
|
Dim mm As UserMedia = m.Data
|
||||||
|
mm.File = NewFile
|
||||||
|
m = New UserMediaD(mm, If(MCTOptions.ReplaceUserProfile_Profile, m.User), m.Session, m.Date)
|
||||||
|
Items(indx) = m
|
||||||
|
_FilesUpdated = True
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
ErrorsDescriber.Execute(EDP.SendToLog, ex, "[FeedSpecial.UpdateDataByFile]")
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
Friend Sub UpdateIfRequired()
|
||||||
|
If _FilesUpdated Then Save() : _FilesUpdated = False
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
#Region "Add"
|
#Region "Add"
|
||||||
Friend Overloads Function Add(ByVal Item As UserMediaD, Optional ByVal AutoSave As Boolean = True) As Boolean
|
Friend Overloads Function Add(ByVal Item As UserMediaD, Optional ByVal AutoSave As Boolean = True) As Boolean
|
||||||
If Not Items.Contains(Item) Then
|
If Not Items.Contains(Item) Then
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
' but WITHOUT ANY WARRANTY
|
' but WITHOUT ANY WARRANTY
|
||||||
Imports PersonalUtilities.Tools
|
Imports PersonalUtilities.Tools
|
||||||
Imports PersonalUtilities.Forms
|
Imports PersonalUtilities.Forms
|
||||||
|
Imports ADB = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons
|
||||||
Namespace DownloadObjects
|
Namespace DownloadObjects
|
||||||
Friend Class FeedSpecialCollection : Implements IEnumerable(Of FeedSpecial), IMyEnumerator(Of FeedSpecial)
|
Friend Class FeedSpecialCollection : Implements IEnumerable(Of FeedSpecial), IMyEnumerator(Of FeedSpecial)
|
||||||
#Region "Events"
|
#Region "Events"
|
||||||
@@ -115,33 +116,41 @@ Namespace DownloadObjects
|
|||||||
End Sub
|
End Sub
|
||||||
Private Sub Feeds_FeedDeleted(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
|
Private Sub Feeds_FeedDeleted(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
|
||||||
RaiseEvent FeedRemoved(Me, Feed)
|
RaiseEvent FeedRemoved(Me, Feed)
|
||||||
If Count > 0 Then Feeds.Remove(Feed)
|
If Count > 0 And Not Feed Is Nothing Then Feeds.Remove(Feed)
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
#Region "ChooseFeeds"
|
#Region "ChooseFeeds"
|
||||||
Friend Shared Function ChooseFeeds(ByVal AllowAdd As Boolean) As List(Of FeedSpecial)
|
Friend Shared Function ChooseFeeds(ByVal AllowAdd As Boolean, Optional ByVal AdditText As String = Nothing,
|
||||||
|
Optional ByVal ReplaceOriginalText As Boolean = False) As List(Of FeedSpecial)
|
||||||
Try
|
Try
|
||||||
Dim newFeed$ = String.Empty
|
Dim newFeed$ = String.Empty
|
||||||
|
If Not AdditText.IsEmptyString And Not ReplaceOriginalText Then AdditText = $" {AdditText}"
|
||||||
Using f As New SimpleListForm(Of String)(Settings.Feeds.Select(Function(ff) ff.Name), Settings.Design) With {
|
Using f As New SimpleListForm(Of String)(Settings.Feeds.Select(Function(ff) ff.Name), Settings.Design) With {
|
||||||
.DesignXMLNodeName = "FeedsChooserForm",
|
.DesignXMLNodeName = "FeedsChooserForm",
|
||||||
.Icon = My.Resources.RSSIcon_32,
|
.Icon = My.Resources.RSSIcon_32,
|
||||||
.FormText = "Feeds"
|
.FormText = $"{IIf(ReplaceOriginalText, String.Empty, "Feeds")}{AdditText}"
|
||||||
}
|
}
|
||||||
If AllowAdd Then f.AddFunction = Sub(ByVal sender As Object, ByVal e As SimpleListFormEventArgs)
|
If AllowAdd Then
|
||||||
|
f.Buttons = {ADB.Add, ADB.Clear}
|
||||||
|
f.AddFunction = Sub(ByVal sender As Object, ByVal e As SimpleListFormEventArgs)
|
||||||
If newFeed.IsEmptyString Then
|
If newFeed.IsEmptyString Then
|
||||||
Dim nf$ = InputBoxE("Enter a new feed name:", "New feed")
|
Dim nf$ = InputBoxE("Enter a new feed name:", "New feed")
|
||||||
If Not nf.IsEmptyString Then
|
If Not nf.IsEmptyString Then
|
||||||
If Settings.Feeds.ListExists(Function(ff) ff.Name.StringToLower = nf.ToLower) Then
|
If Settings.Feeds.ListExists(Function(ff) ff.Name.StringToLower = nf.ToLower) Then
|
||||||
MsgBoxE({$"A feed named '{nf}' already exists", "New feed"}, vbCritical)
|
MsgBoxE({$"A feed named '{nf}' already exists", "New feed"}, vbCritical)
|
||||||
|
e.Result = False
|
||||||
Else
|
Else
|
||||||
newFeed = nf
|
newFeed = nf
|
||||||
e.Item = nf
|
e.Item = nf
|
||||||
End If
|
End If
|
||||||
|
Else
|
||||||
|
e.Result = False
|
||||||
|
End If
|
||||||
Else
|
Else
|
||||||
MsgBoxE({"You can only create one feed at a time", "New feed"}, vbCritical)
|
MsgBoxE({"You can only create one feed at a time", "New feed"}, vbCritical)
|
||||||
End If
|
End If
|
||||||
End If
|
|
||||||
End Sub
|
End Sub
|
||||||
|
End If
|
||||||
If f.ShowDialog = DialogResult.OK AndAlso f.DataResult.Count > 0 Then
|
If f.ShowDialog = DialogResult.OK AndAlso f.DataResult.Count > 0 Then
|
||||||
If Not newFeed.IsEmptyString AndAlso f.DataResult.Contains(newFeed) Then Settings.Feeds.Add(newFeed)
|
If Not newFeed.IsEmptyString AndAlso f.DataResult.Contains(newFeed) Then Settings.Feeds.Add(newFeed)
|
||||||
Return Settings.Feeds.Where(Function(ff) f.DataResult.Contains(ff.Name)).ToList
|
Return Settings.Feeds.Where(Function(ff) f.DataResult.Contains(ff.Name)).ToList
|
||||||
@@ -165,7 +174,7 @@ Namespace DownloadObjects
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
#End Region
|
#End Region
|
||||||
#Region "Add, Delete"
|
#Region "Add, Delete, UpdateDataByFile, UpdateWhereDataReplaced"
|
||||||
Friend Function Add(ByVal Name As String) As Integer
|
Friend Function Add(ByVal Name As String) As Integer
|
||||||
Dim i% = -1
|
Dim i% = -1
|
||||||
If Not Name.IsEmptyString Then
|
If Not Name.IsEmptyString Then
|
||||||
@@ -174,7 +183,7 @@ Namespace DownloadObjects
|
|||||||
Feeds.Last.Save()
|
Feeds.Last.Save()
|
||||||
i = Count - 1
|
i = Count - 1
|
||||||
Else
|
Else
|
||||||
i = Feeds.FindIndex(Function(f) f.Name = Name)
|
i = IndexOf(Name)
|
||||||
If i = -1 Then
|
If i = -1 Then
|
||||||
Feeds.Add(FeedSpecial.CreateSpecial(Name))
|
Feeds.Add(FeedSpecial.CreateSpecial(Name))
|
||||||
Feeds.Last.Save()
|
Feeds.Last.Save()
|
||||||
@@ -184,7 +193,7 @@ Namespace DownloadObjects
|
|||||||
End If
|
End If
|
||||||
If i >= 0 Then
|
If i >= 0 Then
|
||||||
Feeds.Sort(ComparerFeeds)
|
Feeds.Sort(ComparerFeeds)
|
||||||
i = Feeds.FindIndex(Function(f) f.Name = Name)
|
i = IndexOf(Name)
|
||||||
If i >= 0 Then RaiseEvent FeedAdded(Me, Feeds(i))
|
If i >= 0 Then RaiseEvent FeedAdded(Me, Feeds(i))
|
||||||
End If
|
End If
|
||||||
Return i
|
Return i
|
||||||
@@ -194,11 +203,14 @@ Namespace DownloadObjects
|
|||||||
Dim i% = Feeds.IndexOf(Item)
|
Dim i% = Feeds.IndexOf(Item)
|
||||||
If i >= 0 Then
|
If i >= 0 Then
|
||||||
With Feeds(i)
|
With Feeds(i)
|
||||||
|
Dim name$ = .Name
|
||||||
If .IsFavorite Then
|
If .IsFavorite Then
|
||||||
result = .Clear
|
result = .Clear
|
||||||
Else
|
Else
|
||||||
result = .Delete
|
result = .Delete
|
||||||
If result Then
|
i = -1
|
||||||
|
If Feeds.Count > 0 Then i = Feeds.FindIndex(Function(f) f.Name = name And Not f.IsFavorite)
|
||||||
|
If result And i >= 0 Then
|
||||||
.Dispose()
|
.Dispose()
|
||||||
Feeds.RemoveAt(i)
|
Feeds.RemoveAt(i)
|
||||||
End If
|
End If
|
||||||
@@ -207,6 +219,18 @@ Namespace DownloadObjects
|
|||||||
End If
|
End If
|
||||||
Return result
|
Return result
|
||||||
End Function
|
End Function
|
||||||
|
Friend Sub UpdateDataByFile(ByVal InitialFile As SFile, ByVal NewFile As SFile, ByVal MCTOptions As FeedMoveCopyTo)
|
||||||
|
If Count > 0 Then Feeds.ForEach(Sub(f) f.UpdateDataByFile(InitialFile, NewFile, MCTOptions))
|
||||||
|
End Sub
|
||||||
|
Friend Sub UpdateWhereDataReplaced()
|
||||||
|
If Count > 0 Then Feeds.ForEach(Sub(f) f.UpdateIfRequired())
|
||||||
|
End Sub
|
||||||
|
#End Region
|
||||||
|
#Region "IndexOf"
|
||||||
|
Friend Function IndexOf(ByVal Name As String) As Integer
|
||||||
|
If Feeds.Count > 0 Then Return Feeds.FindIndex(Function(f) f.Name = Name)
|
||||||
|
Return -1
|
||||||
|
End Function
|
||||||
#End Region
|
#End Region
|
||||||
#Region "UpdateUsers"
|
#Region "UpdateUsers"
|
||||||
Friend Sub UpdateUsers(ByVal InitialUser As UserInfo, ByVal NewUser As UserInfo)
|
Friend Sub UpdateUsers(ByVal InitialUser As UserInfo, ByVal NewUser As UserInfo)
|
||||||
|
|||||||
@@ -138,6 +138,7 @@ Namespace DownloadObjects.STDownloader
|
|||||||
Me.TXT_URLS.MaxLength = 2147483647
|
Me.TXT_URLS.MaxLength = 2147483647
|
||||||
Me.TXT_URLS.Multiline = True
|
Me.TXT_URLS.Multiline = True
|
||||||
Me.TXT_URLS.Name = "TXT_URLS"
|
Me.TXT_URLS.Name = "TXT_URLS"
|
||||||
|
Me.TXT_URLS.ScrollBars = System.Windows.Forms.ScrollBars.Both
|
||||||
Me.TXT_URLS.Size = New System.Drawing.Size(372, 180)
|
Me.TXT_URLS.Size = New System.Drawing.Size(372, 180)
|
||||||
Me.TXT_URLS.TabIndex = 0
|
Me.TXT_URLS.TabIndex = 0
|
||||||
'
|
'
|
||||||
|
|||||||
40
SCrawler/Editors/GlobalSettingsForm.Designer.vb
generated
@@ -133,6 +133,7 @@ Namespace Editors
|
|||||||
Me.CH_STD_SNAP_CACHE_PERMANENT = New System.Windows.Forms.CheckBox()
|
Me.CH_STD_SNAP_CACHE_PERMANENT = New System.Windows.Forms.CheckBox()
|
||||||
Me.CH_STD_YT_CREATE_URL = New System.Windows.Forms.CheckBox()
|
Me.CH_STD_YT_CREATE_URL = New System.Windows.Forms.CheckBox()
|
||||||
Me.CH_USE_DEF_ACC = New System.Windows.Forms.CheckBox()
|
Me.CH_USE_DEF_ACC = New System.Windows.Forms.CheckBox()
|
||||||
|
Me.CH_NOTIFY_LOG = New System.Windows.Forms.CheckBox()
|
||||||
Me.TXT_CHANNELS_ROWS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_CHANNELS_ROWS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.TXT_CHANNELS_COLUMNS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
Me.TXT_CHANNELS_COLUMNS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
|
||||||
Me.CH_DOWN_IMAGES_NATIVE = New System.Windows.Forms.CheckBox()
|
Me.CH_DOWN_IMAGES_NATIVE = New System.Windows.Forms.CheckBox()
|
||||||
@@ -178,7 +179,7 @@ Namespace Editors
|
|||||||
Me.TAB_MAIN = New System.Windows.Forms.TabControl()
|
Me.TAB_MAIN = New System.Windows.Forms.TabControl()
|
||||||
Me.TAB_ENVIR = New System.Windows.Forms.TabPage()
|
Me.TAB_ENVIR = New System.Windows.Forms.TabPage()
|
||||||
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
||||||
Me.CH_NOTIFY_LOG = New System.Windows.Forms.CheckBox()
|
Me.CH_FEED_UP_FILE_LOC_MOVE = New System.Windows.Forms.CheckBox()
|
||||||
TP_BASIS = New System.Windows.Forms.TableLayoutPanel()
|
TP_BASIS = New System.Windows.Forms.TableLayoutPanel()
|
||||||
TP_IMAGES = New System.Windows.Forms.TableLayoutPanel()
|
TP_IMAGES = New System.Windows.Forms.TableLayoutPanel()
|
||||||
TP_FILE_NAME = New System.Windows.Forms.TableLayoutPanel()
|
TP_FILE_NAME = New System.Windows.Forms.TableLayoutPanel()
|
||||||
@@ -1037,6 +1038,18 @@ Namespace Editors
|
|||||||
TT_MAIN.SetToolTip(Me.CH_USE_DEF_ACC, "Use the default account if you deleted an account that you used for some users")
|
TT_MAIN.SetToolTip(Me.CH_USE_DEF_ACC, "Use the default account if you deleted an account that you used for some users")
|
||||||
Me.CH_USE_DEF_ACC.UseVisualStyleBackColor = True
|
Me.CH_USE_DEF_ACC.UseVisualStyleBackColor = True
|
||||||
'
|
'
|
||||||
|
'CH_NOTIFY_LOG
|
||||||
|
'
|
||||||
|
Me.CH_NOTIFY_LOG.AutoSize = True
|
||||||
|
Me.CH_NOTIFY_LOG.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
|
Me.CH_NOTIFY_LOG.Location = New System.Drawing.Point(4, 212)
|
||||||
|
Me.CH_NOTIFY_LOG.Name = "CH_NOTIFY_LOG"
|
||||||
|
Me.CH_NOTIFY_LOG.Size = New System.Drawing.Size(568, 19)
|
||||||
|
Me.CH_NOTIFY_LOG.TabIndex = 8
|
||||||
|
Me.CH_NOTIFY_LOG.Text = "The log contains new data"
|
||||||
|
TT_MAIN.SetToolTip(Me.CH_NOTIFY_LOG, "Show a notification when the new data is added to the log.")
|
||||||
|
Me.CH_NOTIFY_LOG.UseVisualStyleBackColor = True
|
||||||
|
'
|
||||||
'TP_CHANNELS_IMGS
|
'TP_CHANNELS_IMGS
|
||||||
'
|
'
|
||||||
TP_CHANNELS_IMGS.ColumnCount = 2
|
TP_CHANNELS_IMGS.ColumnCount = 2
|
||||||
@@ -1507,10 +1520,11 @@ Namespace Editors
|
|||||||
TP_FEED.Controls.Add(Me.CH_FEED_OPEN_LAST_MODE, 0, 7)
|
TP_FEED.Controls.Add(Me.CH_FEED_OPEN_LAST_MODE, 0, 7)
|
||||||
TP_FEED.Controls.Add(Me.CH_FEED_SHOW_FRIENDLY, 0, 8)
|
TP_FEED.Controls.Add(Me.CH_FEED_SHOW_FRIENDLY, 0, 8)
|
||||||
TP_FEED.Controls.Add(Me.CH_FEED_SHOW_SPEC_MEDIAITEM, 0, 9)
|
TP_FEED.Controls.Add(Me.CH_FEED_SHOW_SPEC_MEDIAITEM, 0, 9)
|
||||||
|
TP_FEED.Controls.Add(Me.CH_FEED_UP_FILE_LOC_MOVE, 0, 10)
|
||||||
TP_FEED.Dock = System.Windows.Forms.DockStyle.Fill
|
TP_FEED.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
TP_FEED.Location = New System.Drawing.Point(0, 0)
|
TP_FEED.Location = New System.Drawing.Point(0, 0)
|
||||||
TP_FEED.Name = "TP_FEED"
|
TP_FEED.Name = "TP_FEED"
|
||||||
TP_FEED.RowCount = 11
|
TP_FEED.RowCount = 12
|
||||||
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
||||||
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
||||||
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
||||||
@@ -1521,6 +1535,7 @@ Namespace Editors
|
|||||||
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
||||||
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
||||||
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
||||||
|
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!))
|
||||||
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||||
TP_FEED.Size = New System.Drawing.Size(576, 399)
|
TP_FEED.Size = New System.Drawing.Size(576, 399)
|
||||||
TP_FEED.TabIndex = 0
|
TP_FEED.TabIndex = 0
|
||||||
@@ -2154,17 +2169,17 @@ Namespace Editors
|
|||||||
Me.CONTAINER_MAIN.TabIndex = 0
|
Me.CONTAINER_MAIN.TabIndex = 0
|
||||||
Me.CONTAINER_MAIN.TopToolStripPanelVisible = False
|
Me.CONTAINER_MAIN.TopToolStripPanelVisible = False
|
||||||
'
|
'
|
||||||
'CH_NOTIFY_LOG
|
'CH_FEED_UP_FILE_LOC_MOVE
|
||||||
'
|
'
|
||||||
Me.CH_NOTIFY_LOG.AutoSize = True
|
Me.CH_FEED_UP_FILE_LOC_MOVE.AutoSize = True
|
||||||
Me.CH_NOTIFY_LOG.Dock = System.Windows.Forms.DockStyle.Fill
|
Me.CH_FEED_UP_FILE_LOC_MOVE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||||
Me.CH_NOTIFY_LOG.Location = New System.Drawing.Point(4, 212)
|
Me.CH_FEED_UP_FILE_LOC_MOVE.Location = New System.Drawing.Point(4, 273)
|
||||||
Me.CH_NOTIFY_LOG.Name = "CH_NOTIFY_LOG"
|
Me.CH_FEED_UP_FILE_LOC_MOVE.Name = "CH_FEED_UP_FILE_LOC_MOVE"
|
||||||
Me.CH_NOTIFY_LOG.Size = New System.Drawing.Size(568, 19)
|
Me.CH_FEED_UP_FILE_LOC_MOVE.Size = New System.Drawing.Size(568, 19)
|
||||||
Me.CH_NOTIFY_LOG.TabIndex = 8
|
Me.CH_FEED_UP_FILE_LOC_MOVE.TabIndex = 10
|
||||||
Me.CH_NOTIFY_LOG.Text = "The log contains new data"
|
Me.CH_FEED_UP_FILE_LOC_MOVE.Text = "Update file location when moved"
|
||||||
TT_MAIN.SetToolTip(Me.CH_NOTIFY_LOG, "Show a notification when the new data is added to the log.")
|
TT_MAIN.SetToolTip(Me.CH_FEED_UP_FILE_LOC_MOVE, "The file location will be updated in the session data and in the feeds data")
|
||||||
Me.CH_NOTIFY_LOG.UseVisualStyleBackColor = True
|
Me.CH_FEED_UP_FILE_LOC_MOVE.UseVisualStyleBackColor = True
|
||||||
'
|
'
|
||||||
'GlobalSettingsForm
|
'GlobalSettingsForm
|
||||||
'
|
'
|
||||||
@@ -2357,5 +2372,6 @@ Namespace Editors
|
|||||||
Private WithEvents CH_USE_DEF_ACC As CheckBox
|
Private WithEvents CH_USE_DEF_ACC As CheckBox
|
||||||
Private WithEvents CH_FEED_SHOW_SPEC_MEDIAITEM As CheckBox
|
Private WithEvents CH_FEED_SHOW_SPEC_MEDIAITEM As CheckBox
|
||||||
Private WithEvents CH_NOTIFY_LOG As CheckBox
|
Private WithEvents CH_NOTIFY_LOG As CheckBox
|
||||||
|
Private WithEvents CH_FEED_UP_FILE_LOC_MOVE As CheckBox
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -143,6 +143,7 @@ Namespace Editors
|
|||||||
CH_FEED_OPEN_LAST_MODE.Checked = .FeedOpenLastMode
|
CH_FEED_OPEN_LAST_MODE.Checked = .FeedOpenLastMode
|
||||||
CH_FEED_SHOW_FRIENDLY.Checked = .FeedShowFriendlyNames
|
CH_FEED_SHOW_FRIENDLY.Checked = .FeedShowFriendlyNames
|
||||||
CH_FEED_SHOW_SPEC_MEDIAITEM.Checked = .FeedShowSpecialFeedsMediaItem
|
CH_FEED_SHOW_SPEC_MEDIAITEM.Checked = .FeedShowSpecialFeedsMediaItem
|
||||||
|
CH_FEED_UP_FILE_LOC_MOVE.Checked = .FeedMoveCopyUpdateFileLocationOnMove
|
||||||
End With
|
End With
|
||||||
.MyFieldsChecker = New FieldsChecker
|
.MyFieldsChecker = New FieldsChecker
|
||||||
With .MyFieldsCheckerE
|
With .MyFieldsCheckerE
|
||||||
@@ -316,10 +317,10 @@ Namespace Editors
|
|||||||
.FeedOpenLastMode.Value = CH_FEED_OPEN_LAST_MODE.Checked
|
.FeedOpenLastMode.Value = CH_FEED_OPEN_LAST_MODE.Checked
|
||||||
.FeedShowFriendlyNames.Value = CH_FEED_SHOW_FRIENDLY.Checked
|
.FeedShowFriendlyNames.Value = CH_FEED_SHOW_FRIENDLY.Checked
|
||||||
.FeedShowSpecialFeedsMediaItem.Value = CH_FEED_SHOW_SPEC_MEDIAITEM.Checked
|
.FeedShowSpecialFeedsMediaItem.Value = CH_FEED_SHOW_SPEC_MEDIAITEM.Checked
|
||||||
|
.FeedMoveCopyUpdateFileLocationOnMove.Value = CH_FEED_UP_FILE_LOC_MOVE.Checked
|
||||||
FeedParametersChanged = .FeedDataRows.ChangesDetected Or .FeedDataColumns.ChangesDetected Or
|
FeedParametersChanged = .FeedDataRows.ChangesDetected Or .FeedDataColumns.ChangesDetected Or
|
||||||
.FeedEndless.ChangesDetected Or .FeedStoreSessionsData.ChangesDetected Or
|
.FeedEndless.ChangesDetected Or .FeedBackColor.ChangesDetected Or
|
||||||
.FeedBackColor.ChangesDetected Or .FeedForeColor.ChangesDetected Or
|
.FeedForeColor.ChangesDetected Or .FeedCenterImage.ChangesDetected
|
||||||
.FeedCenterImage.ChangesDetected
|
|
||||||
|
|
||||||
.EndUpdate()
|
.EndUpdate()
|
||||||
End With
|
End With
|
||||||
|
|||||||
@@ -484,10 +484,11 @@ CloseResume:
|
|||||||
MyUserMetrics.FormShow(EDP.LogMessageValue)
|
MyUserMetrics.FormShow(EDP.LogMessageValue)
|
||||||
End Sub
|
End Sub
|
||||||
#End Region
|
#End Region
|
||||||
Private Sub ShowFeed() Handles BTT_FEED.Click, BTT_TRAY_FEED_SHOW.Click
|
Friend Sub ShowFeed() Handles BTT_FEED.Click, BTT_TRAY_FEED_SHOW.Click
|
||||||
If MyFeed Is Nothing Then
|
If MyFeed Is Nothing Then
|
||||||
MyFeed = New DownloadFeedForm
|
MyFeed = New DownloadFeedForm
|
||||||
AddHandler Downloader.FeedFilesChanged, AddressOf MyFeed.Downloader_FilesChanged
|
AddHandler Downloader.FeedFilesChanged, AddressOf MyFeed.Downloader_FilesChanged
|
||||||
|
AddHandler MyFeed.UsersAdded, AddressOf OnUsersAddedHandler
|
||||||
If Not MySavedPosts Is Nothing Then AddHandler MySavedPosts.FeedFilesChanged, AddressOf MyFeed.Downloader_FilesChanged
|
If Not MySavedPosts Is Nothing Then AddHandler MySavedPosts.FeedFilesChanged, AddressOf MyFeed.Downloader_FilesChanged
|
||||||
End If
|
End If
|
||||||
If MyFeed.Visible Then MyFeed.BringToFront() Else MyFeed.Show()
|
If MyFeed.Visible Then MyFeed.BringToFront() Else MyFeed.Show()
|
||||||
|
|||||||
@@ -82,9 +82,14 @@ Friend Class MainFrameObjects : Implements INotificator
|
|||||||
If Settings.ProcessNotification(NotifyObj.STDownloader) Then Notification.ShowNotification(Text,, $"{NotificationInternalKey}_{NotifyObj.STDownloader}", Image)
|
If Settings.ProcessNotification(NotifyObj.STDownloader) Then Notification.ShowNotification(Text,, $"{NotificationInternalKey}_{NotifyObj.STDownloader}", Image)
|
||||||
End Sub
|
End Sub
|
||||||
Private Const NotificationInternalKey As String = "NotificationInternalKey"
|
Private Const NotificationInternalKey As String = "NotificationInternalKey"
|
||||||
|
Private Const DEF_BTT_FEED As String = "DEF_BTT_FEED"
|
||||||
|
Private Const DEF_BTT_DISABLE As String = "DEF_BTT_DISABLE"
|
||||||
Friend Sub ShowNotification(ByVal Sender As NotifyObj, ByVal Message As String)
|
Friend Sub ShowNotification(ByVal Sender As NotifyObj, ByVal Message As String)
|
||||||
If Settings.ProcessNotification(Sender) Then
|
If Settings.ProcessNotification(Sender) Then
|
||||||
Using n As New Notification(Message) With {.Key = $"{NotificationInternalKey}_{Sender}"} : n.Show() : End Using
|
Dim b As List(Of IButton) = Nothing
|
||||||
|
If Sender = NotifyObj.Profiles Or Sender = NotifyObj.AutoDownloader Or Sender = NotifyObj.SavedPosts Then _
|
||||||
|
b = New List(Of IButton) From {New ToastButton(DEF_BTT_FEED, "Feed"), New ToastButton(DEF_BTT_DISABLE, "Disable")}
|
||||||
|
Using n As New Notification(Message) With {.Key = $"{NotificationInternalKey}_{Sender}", .Buttons = b} : n.Show() : End Using
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Friend Sub ClearNotifications() Implements INotificator.Clear
|
Friend Sub ClearNotifications() Implements INotificator.Clear
|
||||||
@@ -94,7 +99,11 @@ Friend Class MainFrameObjects : Implements INotificator
|
|||||||
If Not Key.IsEmptyString Then
|
If Not Key.IsEmptyString Then
|
||||||
Dim found As Boolean = False
|
Dim found As Boolean = False
|
||||||
Dim activateForm As Boolean = False
|
Dim activateForm As Boolean = False
|
||||||
If Key.StartsWith(NotificationInternalKey) Then
|
If Key = DEF_BTT_FEED Then
|
||||||
|
ControlInvokeFast(MF, AddressOf MF.ShowFeed, EDP.LogMessageValue)
|
||||||
|
ElseIf Key = DEF_BTT_DISABLE Then
|
||||||
|
Exit Sub
|
||||||
|
ElseIf Key.StartsWith(NotificationInternalKey) Then
|
||||||
Select Case Key
|
Select Case Key
|
||||||
Case $"{NotificationInternalKey}_{NotifyObj.Channels}" : MF.MyChannels.FormShowS()
|
Case $"{NotificationInternalKey}_{NotifyObj.Channels}" : MF.MyChannels.FormShowS()
|
||||||
Case $"{NotificationInternalKey}_{NotifyObj.SavedPosts}" : MF.MySavedPosts.FormShowS()
|
Case $"{NotificationInternalKey}_{NotifyObj.SavedPosts}" : MF.MySavedPosts.FormShowS()
|
||||||
|
|||||||
@@ -16,10 +16,12 @@ Imports SCrawler.DownloadObjects
|
|||||||
Friend Module MainMod
|
Friend Module MainMod
|
||||||
Friend Settings As SettingsCLS
|
Friend Settings As SettingsCLS
|
||||||
Friend Const SettingsFolderName As String = XML.XmlFile.SettingsFolder
|
Friend Const SettingsFolderName As String = XML.XmlFile.SettingsFolder
|
||||||
|
Friend Const UserRegexDefaultPattern As String = "{0}([^/\?&]+)"
|
||||||
Friend ReadOnly LinkPattern As RParams = RParams.DMS("[htps:]{0,6}[/]{0,2}(.+)", 1)
|
Friend ReadOnly LinkPattern As RParams = RParams.DMS("[htps:]{0,6}[/]{0,2}(.+)", 1)
|
||||||
Friend ReadOnly FilesPattern As RParams = RParams.DM("[^\./]+?\.\w+", 1, EDP.ReturnValue)
|
Friend ReadOnly FilesPattern As RParams = RParams.DM("[^\./]+?\.\w+", 1, EDP.ReturnValue)
|
||||||
Friend Delegate Sub NotificationEventHandler(ByVal Sender As SettingsCLS.NotificationObjects, ByVal Message As String)
|
Friend Delegate Sub NotificationEventHandler(ByVal Sender As SettingsCLS.NotificationObjects, ByVal Message As String)
|
||||||
Friend Delegate Sub UserDownloadStateChangedEventHandler(ByVal User As IUserData, ByVal IsDownloading As Boolean)
|
Friend Delegate Sub UserDownloadStateChangedEventHandler(ByVal User As IUserData, ByVal IsDownloading As Boolean)
|
||||||
|
Friend Delegate Sub UsersAddedEventHandler(ByVal StartIndex As Integer)
|
||||||
Friend Delegate Function PathMoverHandler(ByVal User As UserInfo, ByVal DestinationPattern As SFile) As SFile
|
Friend Delegate Function PathMoverHandler(ByVal User As UserInfo, ByVal DestinationPattern As SFile) As SFile
|
||||||
Friend Const LVI_TempOption As String = "Temp"
|
Friend Const LVI_TempOption As String = "Temp"
|
||||||
Friend Const LVI_FavOption As String = "Favorite"
|
Friend Const LVI_FavOption As String = "Favorite"
|
||||||
|
|||||||
@@ -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("2024.1.12.1")>
|
<Assembly: AssemblyVersion("2024.2.25.0")>
|
||||||
<Assembly: AssemblyFileVersion("2024.1.12.1")>
|
<Assembly: AssemblyFileVersion("2024.2.25.0")>
|
||||||
<Assembly: NeutralResourcesLanguage("en")>
|
<Assembly: NeutralResourcesLanguage("en")>
|
||||||
|
|||||||
10
SCrawler/My Project/Resources.Designer.vb
generated
@@ -120,6 +120,16 @@ Namespace My.Resources
|
|||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
'''</summary>
|
||||||
|
Friend ReadOnly Property CutPic_48() As System.Drawing.Bitmap
|
||||||
|
Get
|
||||||
|
Dim obj As Object = ResourceManager.GetObject("CutPic_48", 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>
|
||||||
|
|||||||
@@ -220,4 +220,7 @@
|
|||||||
<data name="BrushToolPic_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="BrushToolPic_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Content\Pictures\BrushToolPic_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Content\Pictures\BrushToolPic_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="CutPic_48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Content\Pictures\CutPic_48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -12,7 +12,7 @@ Imports PersonalUtilities.Functions.XML
|
|||||||
Imports PersonalUtilities.Functions.XML.Objects
|
Imports PersonalUtilities.Functions.XML.Objects
|
||||||
Imports PersonalUtilities.Tools.WEB.GitHub
|
Imports PersonalUtilities.Tools.WEB.GitHub
|
||||||
Namespace Plugin.Hosts
|
Namespace Plugin.Hosts
|
||||||
Friend Class PluginHost
|
Friend Class PluginHost : Implements IDisposable
|
||||||
Friend Const PluginsPath As String = "Plugins\"
|
Friend Const PluginsPath As String = "Plugins\"
|
||||||
Friend ReadOnly Property Settings As SettingsHostCollection
|
Friend ReadOnly Property Settings As SettingsHostCollection
|
||||||
Friend ReadOnly Property Name As String
|
Friend ReadOnly Property Name As String
|
||||||
@@ -25,6 +25,16 @@ Namespace Plugin.Hosts
|
|||||||
Return Settings.Key
|
Return Settings.Key
|
||||||
End Get
|
End Get
|
||||||
End Property
|
End Property
|
||||||
|
Friend ReadOnly Property Replacer As ReplaceInternalPluginAttribute
|
||||||
|
Get
|
||||||
|
Return Settings.Default.Replacer
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Friend ReadOnly Property IsReplacer As Boolean
|
||||||
|
Get
|
||||||
|
Return Settings.Default.IsReplacer
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
Friend ReadOnly Property Exists As Boolean
|
Friend ReadOnly Property Exists As Boolean
|
||||||
Get
|
Get
|
||||||
Return Not Settings Is Nothing
|
Return Not Settings Is Nothing
|
||||||
@@ -113,5 +123,22 @@ Namespace Plugin.Hosts
|
|||||||
Return Nothing
|
Return Nothing
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
#Region "IDisposable Support"
|
||||||
|
Private disposedValue As Boolean = False
|
||||||
|
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
|
||||||
|
If Not disposedValue Then
|
||||||
|
If disposing Then Settings.Dispose()
|
||||||
|
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
|
||||||
@@ -107,6 +107,12 @@ Namespace Plugin.Hosts
|
|||||||
#End Region
|
#End Region
|
||||||
#Region "Host declarations"
|
#Region "Host declarations"
|
||||||
Friend ReadOnly Property Source As ISiteSettings
|
Friend ReadOnly Property Source As ISiteSettings
|
||||||
|
Friend Property Replacer As ReplaceInternalPluginAttribute = Nothing
|
||||||
|
Friend ReadOnly Property IsReplacer As Boolean
|
||||||
|
Get
|
||||||
|
Return Not Replacer Is Nothing AndAlso (Not Replacer.PluginKey.IsEmptyString Or Not Replacer.SiteName.IsEmptyString)
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
Friend ReadOnly Property PropList As List(Of PropertyValueHost)
|
Friend ReadOnly Property PropList As List(Of PropertyValueHost)
|
||||||
Friend ReadOnly Property Name As String
|
Friend ReadOnly Property Name As String
|
||||||
Get
|
Get
|
||||||
@@ -251,6 +257,8 @@ Namespace Plugin.Hosts
|
|||||||
HasSpecialOptions = True
|
HasSpecialOptions = True
|
||||||
End If
|
End If
|
||||||
End With
|
End With
|
||||||
|
ElseIf TypeOf a Is ReplaceInternalPluginAttribute Then
|
||||||
|
Replacer = a
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Imports Download = SCrawler.Plugin.ISiteSettings.Download
|
|||||||
Imports PauseModes = SCrawler.DownloadObjects.AutoDownloader.PauseModes
|
Imports PauseModes = SCrawler.DownloadObjects.AutoDownloader.PauseModes
|
||||||
Imports MsgBoxButton = PersonalUtilities.Functions.Messaging.MsgBoxButton
|
Imports MsgBoxButton = PersonalUtilities.Functions.Messaging.MsgBoxButton
|
||||||
Namespace Plugin.Hosts
|
Namespace Plugin.Hosts
|
||||||
Friend Class SettingsHostCollection : Implements IEnumerable(Of SettingsHost), IMyEnumerator(Of SettingsHost)
|
Friend Class SettingsHostCollection : Implements IEnumerable(Of SettingsHost), IMyEnumerator(Of SettingsHost), IDisposable
|
||||||
#Region "Declarations"
|
#Region "Declarations"
|
||||||
Private Const FileNamePrefix As String = "Host_"
|
Private Const FileNamePrefix As String = "Host_"
|
||||||
Private Const FileNamePattern As String = FileNamePrefix & "{0}_{1}_"
|
Private Const FileNamePattern As String = FileNamePrefix & "{0}_{1}_"
|
||||||
@@ -437,6 +437,33 @@ Namespace Plugin.Hosts
|
|||||||
Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
|
Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
|
||||||
Return GetEnumerator()
|
Return GetEnumerator()
|
||||||
End Function
|
End Function
|
||||||
|
#End Region
|
||||||
|
#Region "IDisposable Support"
|
||||||
|
Private disposedValue As Boolean = False
|
||||||
|
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
|
||||||
|
If Not disposedValue Then
|
||||||
|
If disposing Then
|
||||||
|
Hosts.ListClearDispose(, False, EDP.SendToLog)
|
||||||
|
HostsUnavailableIndexes.Clear()
|
||||||
|
HostsXml.ListClearDispose(, False, EDP.SendToLog)
|
||||||
|
BTT_SETTINGS.DisposeIfReady
|
||||||
|
BTT_SETTINGS_SEP_1.DisposeIfReady
|
||||||
|
BTT_SETTINGS_ACTIONS_ADD.DisposeIfReady
|
||||||
|
End If
|
||||||
|
BTT_SETTINGS = Nothing
|
||||||
|
BTT_SETTINGS_SEP_1 = Nothing
|
||||||
|
BTT_SETTINGS_ACTIONS_ADD = Nothing
|
||||||
|
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 Region
|
||||||
End Class
|
End Class
|
||||||
End Namespace
|
End Namespace
|
||||||
@@ -267,12 +267,19 @@
|
|||||||
<Compile Include="Download\Feed\DownloadFeedForm.vb">
|
<Compile Include="Download\Feed\DownloadFeedForm.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Download\Feed\FeedCopyToForm.Designer.vb">
|
||||||
|
<DependentUpon>FeedCopyToForm.vb</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Download\Feed\FeedCopyToForm.vb">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Download\Feed\FeedMedia.Designer.vb">
|
<Compile Include="Download\Feed\FeedMedia.Designer.vb">
|
||||||
<DependentUpon>FeedMedia.vb</DependentUpon>
|
<DependentUpon>FeedMedia.vb</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Download\Feed\FeedMedia.vb">
|
<Compile Include="Download\Feed\FeedMedia.vb">
|
||||||
<SubType>UserControl</SubType>
|
<SubType>UserControl</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Download\Feed\FeedMoveCopyTo.vb" />
|
||||||
<Compile Include="Download\Feed\FeedSpecial.vb" />
|
<Compile Include="Download\Feed\FeedSpecial.vb" />
|
||||||
<Compile Include="Download\Feed\FeedSpecialCollection.vb" />
|
<Compile Include="Download\Feed\FeedSpecialCollection.vb" />
|
||||||
<Compile Include="Download\Feed\FeedVideo.Designer.vb">
|
<Compile Include="Download\Feed\FeedVideo.Designer.vb">
|
||||||
@@ -524,6 +531,9 @@
|
|||||||
<EmbeddedResource Include="Download\DownloadSavedPostsForm.resx">
|
<EmbeddedResource Include="Download\DownloadSavedPostsForm.resx">
|
||||||
<DependentUpon>DownloadSavedPostsForm.vb</DependentUpon>
|
<DependentUpon>DownloadSavedPostsForm.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Download\Feed\FeedCopyToForm.resx">
|
||||||
|
<DependentUpon>FeedCopyToForm.vb</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Download\Feed\FeedMedia.resx">
|
<EmbeddedResource Include="Download\Feed\FeedMedia.resx">
|
||||||
<DependentUpon>FeedMedia.vb</DependentUpon>
|
<DependentUpon>FeedMedia.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
@@ -732,6 +742,9 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Content\Pictures\SitePictures\FacebookPic_37.png" />
|
<None Include="Content\Pictures\SitePictures\FacebookPic_37.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="Content\Pictures\CutPic_48.png" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
|
|||||||
Friend ReadOnly Property DownloadLocations As STDownloader.DownloadLocationsCollection
|
Friend ReadOnly Property DownloadLocations As STDownloader.DownloadLocationsCollection
|
||||||
Friend ReadOnly Property GlobalLocations As STDownloader.DownloadLocationsCollection
|
Friend ReadOnly Property GlobalLocations As STDownloader.DownloadLocationsCollection
|
||||||
Friend Property Automation As Scheduler
|
Friend Property Automation As Scheduler
|
||||||
Friend ReadOnly Property AutomationFile As XMLValue(Of SFile)
|
Friend ReadOnly Property AutomationFile As XMLValue(Of String)
|
||||||
Friend ReadOnly Property Feeds As FeedSpecialCollection
|
Friend ReadOnly Property Feeds As FeedSpecialCollection
|
||||||
Friend ReadOnly Property BlackList As List(Of UserBan)
|
Friend ReadOnly Property BlackList As List(Of UserBan)
|
||||||
Private ReadOnly BlackListFile As SFile = $"{SettingsFolderName}\BlackList.txt"
|
Private ReadOnly BlackListFile As SFile = $"{SettingsFolderName}\BlackList.txt"
|
||||||
@@ -179,7 +179,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
|
|||||||
|
|
||||||
SeparateVideoFolder = New XMLValue(Of Boolean)("SeparateVideoFolder", True, MyXML)
|
SeparateVideoFolder = New XMLValue(Of Boolean)("SeparateVideoFolder", True, MyXML)
|
||||||
CollectionsPath = New XMLValue(Of String)("CollectionsPath", CollectionsFolderName, MyXML)
|
CollectionsPath = New XMLValue(Of String)("CollectionsPath", CollectionsFolderName, MyXML)
|
||||||
AutomationFile = New XMLValue(Of SFile)("AutomationFile",, MyXML)
|
AutomationFile = New XMLValue(Of String)("AutomationFile",, MyXML)
|
||||||
|
|
||||||
UserAgent = New XMLValue(Of String)("UserAgent",, MyXML)
|
UserAgent = New XMLValue(Of String)("UserAgent",, MyXML)
|
||||||
If Not UserAgent.IsEmptyString Then DefaultUserAgent = UserAgent
|
If Not UserAgent.IsEmptyString Then DefaultUserAgent = UserAgent
|
||||||
@@ -210,7 +210,21 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
|
|||||||
Plugins.AddRange(PluginHost.GetMyHosts(MyXML, GlobalPath.Value, DefaultTemporary, DefaultDownloadImages, DefaultDownloadVideos))
|
Plugins.AddRange(PluginHost.GetMyHosts(MyXML, GlobalPath.Value, DefaultTemporary, DefaultDownloadImages, DefaultDownloadVideos))
|
||||||
Dim tmpPluginList As IEnumerable(Of PluginHost) = PluginHost.GetPluginsHosts(MyXML, GlobalPath.Value, DefaultTemporary,
|
Dim tmpPluginList As IEnumerable(Of PluginHost) = PluginHost.GetPluginsHosts(MyXML, GlobalPath.Value, DefaultTemporary,
|
||||||
DefaultDownloadImages, DefaultDownloadVideos)
|
DefaultDownloadImages, DefaultDownloadVideos)
|
||||||
If tmpPluginList.ListExists Then Plugins.AddRange(tmpPluginList)
|
If tmpPluginList.ListExists Then
|
||||||
|
Dim tplIndx% = -1
|
||||||
|
For Each tpl As PluginHost In tmpPluginList
|
||||||
|
If tpl.IsReplacer Then
|
||||||
|
tplIndx = Plugins.FindIndex(Function(pl) pl.Key.StringToLower = tpl.Replacer.PluginKey.StringToLower Or
|
||||||
|
pl.Name.StringToLower = tpl.Replacer.SiteName.StringToLower)
|
||||||
|
If tplIndx >= 0 Then
|
||||||
|
Plugins(tplIndx).Dispose()
|
||||||
|
Plugins.RemoveAt(tplIndx)
|
||||||
|
If Plugins.Count = 0 Then Exit For
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
Plugins.AddRange(tmpPluginList)
|
||||||
|
End If
|
||||||
|
|
||||||
MainFrameUsersShowDefaults = New XMLValue(Of Boolean)("UsersShowDefaults", True, MyXML)
|
MainFrameUsersShowDefaults = New XMLValue(Of Boolean)("UsersShowDefaults", True, MyXML)
|
||||||
MainFrameUsersShowSubscriptions = New XMLValue(Of Boolean)("UsersShowSubscriptions", True, MyXML)
|
MainFrameUsersShowSubscriptions = New XMLValue(Of Boolean)("UsersShowSubscriptions", True, MyXML)
|
||||||
@@ -306,6 +320,13 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
|
|||||||
FeedLastModeSubscriptions = New XMLValue(Of Boolean)("LastModeSubscriptions", False, MyXML, n)
|
FeedLastModeSubscriptions = New XMLValue(Of Boolean)("LastModeSubscriptions", False, MyXML, n)
|
||||||
FeedShowFriendlyNames = New XMLValue(Of Boolean)("ShowFriendlyNames", True, MyXML, n)
|
FeedShowFriendlyNames = New XMLValue(Of Boolean)("ShowFriendlyNames", True, MyXML, n)
|
||||||
FeedShowSpecialFeedsMediaItem = New XMLValue(Of Boolean)("ShowSpecialFeedsMediaItem", False, MyXML, n)
|
FeedShowSpecialFeedsMediaItem = New XMLValue(Of Boolean)("ShowSpecialFeedsMediaItem", False, MyXML, n)
|
||||||
|
n = {"Feed", "MoveCopy"}
|
||||||
|
FeedMoveCopyLastLocation = New XMLValue(Of SFile)("LastLocation",, MyXML, n)
|
||||||
|
FeedMoveCopyUpdateFileLocationOnMove = New XMLValue(Of Boolean)("UpdateFileLocationOnMove", True, MyXML, n)
|
||||||
|
FeedMoveCopyIsProfileChecked = New XMLValue(Of Boolean)("IsProfileChecked", True, MyXML, n)
|
||||||
|
FeedMoveCopySeparateVideo = New XMLValue(Of Boolean)("SeparateVideo",, MyXML, n)
|
||||||
|
FeedMoveCopyReplaceUserProfile = New XMLValue(Of Boolean)("ReplaceUserProfile",, MyXML, n)
|
||||||
|
FeedMoveCopyCreatePathProfile = New XMLValue(Of Boolean)("CreatePathProfile",, MyXML, n)
|
||||||
|
|
||||||
n = {"Users"}
|
n = {"Users"}
|
||||||
FromChannelDownloadTop = New XMLValue(Of Integer)("FromChannelDownloadTop", 10, MyXML, n)
|
FromChannelDownloadTop = New XMLValue(Of Integer)("FromChannelDownloadTop", 10, MyXML, n)
|
||||||
@@ -940,6 +961,14 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
|
|||||||
Friend ReadOnly Property FeedLastModeSubscriptions As XMLValue(Of Boolean)
|
Friend ReadOnly Property FeedLastModeSubscriptions As XMLValue(Of Boolean)
|
||||||
Friend ReadOnly Property FeedShowFriendlyNames As XMLValue(Of Boolean)
|
Friend ReadOnly Property FeedShowFriendlyNames As XMLValue(Of Boolean)
|
||||||
Friend ReadOnly Property FeedShowSpecialFeedsMediaItem As XMLValue(Of Boolean)
|
Friend ReadOnly Property FeedShowSpecialFeedsMediaItem As XMLValue(Of Boolean)
|
||||||
|
#Region "MoveCopy"
|
||||||
|
Friend ReadOnly Property FeedMoveCopyLastLocation As XMLValue(Of SFile)
|
||||||
|
Friend ReadOnly Property FeedMoveCopyUpdateFileLocationOnMove As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property FeedMoveCopyIsProfileChecked As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property FeedMoveCopySeparateVideo As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property FeedMoveCopyReplaceUserProfile As XMLValue(Of Boolean)
|
||||||
|
Friend ReadOnly Property FeedMoveCopyCreatePathProfile As XMLValue(Of Boolean)
|
||||||
|
#End Region
|
||||||
#End Region
|
#End Region
|
||||||
#Region "New version properties"
|
#Region "New version properties"
|
||||||
Friend ReadOnly Property CheckUpdatesAtStart As XMLValue(Of Boolean)
|
Friend ReadOnly Property CheckUpdatesAtStart As XMLValue(Of Boolean)
|
||||||
|
|||||||
@@ -1 +1,7 @@
|
|||||||
|
REM This script is written for WinRAR. It only archives user data files. Not user content!
|
||||||
|
REM Replace 'd:\Downloads\SocialNetworks\SCrawlerBackup.rar' with the archive destination.
|
||||||
|
REM Replace 'd:\Downloads\SocialNetworks\' with the path to your SCrawler data folder.
|
||||||
|
REM THIS SCRIPT IS NOT SUITABLE FOR 7ZIP OR OTHER ARCHIVING PROGRAMS.
|
||||||
|
REM But I believe 7Zip also has CLI commands
|
||||||
|
|
||||||
"C:\Program Files\WinRAR\WinRAR.exe" a -r -ep1 -o+ -ag_YYYYMMDD_HHMMSS -m5 -tl -n*.txt -n*.xml "d:\Downloads\SocialNetworks\SCrawlerBackup.rar" "d:\Downloads\SocialNetworks\"
|
"C:\Program Files\WinRAR\WinRAR.exe" a -r -ep1 -o+ -ag_YYYYMMDD_HHMMSS -m5 -tl -n*.txt -n*.xml "d:\Downloads\SocialNetworks\SCrawlerBackup.rar" "d:\Downloads\SocialNetworks\"
|
||||||