mirror of
https://github.com/AAndyProgram/SCrawler.git
synced 2026-03-15 16:22:17 +00:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11a590f14e | ||
|
|
975d46715c | ||
|
|
726fc486ce | ||
|
|
ede81f9d05 |
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -26,8 +26,10 @@ A clear and concise description of what you expected to happen.
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Release information (please complete the following information):**
|
||||
- OS [e.g. Windows 10, Windows 11]
|
||||
- Architecture [e.g. x86, x64]
|
||||
- Version [e.g. 2.0.0.0]
|
||||
- NET.Framework version
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
22
Changelog.md
22
Changelog.md
@@ -1,3 +1,25 @@
|
||||
# 3.0.0.5
|
||||
|
||||
- Added
|
||||
- ```New```, ```Hot```, ```Top``` Reddit channel and user download modes
|
||||
|
||||
# 3.0.0.4
|
||||
|
||||
- Fixed
|
||||
- External plugins do not save information about downloaded files
|
||||
- The user cannot be added to the collection if a special path has been specified.
|
||||
|
||||
# 3.0.0.3
|
||||
|
||||
- Added
|
||||
- Download all by specific sites
|
||||
- Download all, ignoring the ```Ready for download``` option
|
||||
- Download all by specific sites, ignoring the ```Ready for download``` option
|
||||
- Fixed
|
||||
- (Issue #19) Typo in default Instagram settings (Post limit timer)
|
||||
- Typo when applying "Download UHD" in XVIDEOS plugin
|
||||
- The sites filter does not work unless the "Fast profiles loading" option is enabled.
|
||||
|
||||
# 3.0.0.2
|
||||
|
||||
- Added
|
||||
|
||||
34
FAQ.md
34
FAQ.md
@@ -2,6 +2,8 @@
|
||||
|
||||
**Please read the [GUIDE](https://github.com/AAndyProgram/SCrawler/wiki/) Before asking a question!**
|
||||
|
||||
**Also read [here](README.md) for basic information.**
|
||||
|
||||
Most of your questions are already answered. All settings, functions, buttons and everything else described in the guide.
|
||||
|
||||
Any other questions I will keep in this file.
|
||||
@@ -44,6 +46,30 @@ A: Check your credentials. Both of these sites require cookies. Check your [Twit
|
||||
|
||||
----
|
||||
|
||||
#### Q: **I have set credentials but still nothing is downloading**
|
||||
|
||||
A: Click the ```Start downloading``` button
|
||||
|
||||
----
|
||||
|
||||
#### Q: **Where can I find the release?**
|
||||
|
||||
A: https://github.com/AAndyProgram/SCrawler/releases/latest
|
||||
|
||||
----
|
||||
|
||||
#### Q: **How to run the program?**
|
||||
|
||||
A: Double-click ```SCrawler.exe```
|
||||
|
||||
----
|
||||
|
||||
#### Q: **Where to find binaries?**
|
||||
|
||||
A: https://github.com/AAndyProgram/SCrawler/releases/latest
|
||||
|
||||
----
|
||||
|
||||
#### Q: **Does the program remember the last download and check for new posts, downloading only new posts? Or does the program download the entire profile every time?**
|
||||
|
||||
A: The program stored posts IDs in users' folders. For the first time, the program downloads the entire profile. All subsequent times the program will check for new posts and download **only new posts**!
|
||||
@@ -64,4 +90,10 @@ A: There is no functionality to remove an individual label. You can open the ```
|
||||
|
||||
#### 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.
|
||||
|
||||
----
|
||||
|
||||
#### Q: **Can you add a step-by-step guide or video on how to use the program?**
|
||||
|
||||
A: **NO**! I will not do it. If you want, you can create a video tutorial and send it to me. Then I add it. All options and what each option does described on the wiki. The wiki also contains a description of all settings and how-to configure them. For complex settings, there is a steep-by-steep guide. Read the [main](README.md) information and [GUIDE](https://github.com/AAndyProgram/SCrawler/wiki/) and you won't have any problems. I have developed a program with an intuitive interface. There is a Settings button, download buttons, a context menu that drops down when a user is clicked, and other controls. Anyone can use it.
|
||||
@@ -2,7 +2,7 @@ Your support is very valuable to me. Any support is greatly appreciated. Your su
|
||||
|
||||
You can support the program by:
|
||||
- **Bitcoin**: bitcoin:BC1Q0NH839FT5TA44DD7L7RLR97XDQAG9V8D6N7XET
|
||||
- :heavy_dollar_sign: making donaion making donations on this site: https://ko-fi.com/andyprogram
|
||||
- :heavy_dollar_sign: make a donation on this site: https://ko-fi.com/andyprogram
|
||||
- :repeat: make a post about my program on your profile (Reddit, Twitter, Instagram and any other social networks)
|
||||
- :speech_balloon: tell your friends about the program
|
||||
- :heart: like the program on this site: https://alternativeto.net/software/scrawler/about/
|
||||
|
||||
BIN
ProgramScreenshots/SettingsRedditView.png
Normal file
BIN
ProgramScreenshots/SettingsRedditView.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
@@ -75,7 +75,7 @@ Read [here](CONTRIBUTING.md#how-to-request-a-new-site) about
|
||||
|
||||
# Requirements
|
||||
|
||||
- Windows 7, 8, 9, 10, 11 with NET Framework 4.6.1 or higher
|
||||
- Windows 7, 8, 9, 10, 11 with NET Framework 4.6.1 or higher (v4.6.1 must be installed). You can check version compatibility with this [tool](Tools/NET.FrameworkVersion.ps1).
|
||||
- Authorization [cookies](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-set-up-cookies) and [tokens](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-twitter-tokens) for Twitter (if you want to download data from Twitter)
|
||||
- Authorization [cookies](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-set-up-cookies) and [Hash](https://github.com/AAndyProgram/SCrawler/wiki/Settings#instagram) for Instagram (if you want to download data from Instagram), [Hash 2](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-instagram-hash-2) for saved Instagram posts, Instagram [stories authorization headers](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-instagram-stories-authorization-headers) for Stories and Tagged data
|
||||
- ffmpeg library for downloading videos hosted on Reddit (you can download it from the [official repo](https://github.com/GyanD/codexffmpeg/releases/tag/2021-01-12-git-ca21cb1e36) or [from my first release](https://github.com/AAndyProgram/SCrawler/releases/download/1.0.0.0/ffmpeg.zip)). **ffmpeg only works with the x64 version of the program.**
|
||||
@@ -116,7 +116,7 @@ You need to set up authorization for Twitter and Instagram:
|
||||
- Authorization [cookies](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-set-up-cookies) and [tokens](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-twitter-tokens) for **Twitter** (if you want to download data from Twitter)
|
||||
- Authorization [cookies](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-set-up-cookies) and [Hash](https://github.com/AAndyProgram/SCrawler/wiki/Settings#instagram) for **Instagram** (if you want to download data from Instagram), [Hash 2](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-instagram-hash-2) for **saved Instagram posts**, Instagram [stories authorization headers](https://github.com/AAndyProgram/SCrawler/wiki/Settings#how-to-find-instagram-stories-authorization-headers) for **Stories** and **Tagged data**
|
||||
|
||||
Just add a user profile and click the ```Start downloading``` button.
|
||||
Just add a user profile and **click the ```Start downloading``` button**.
|
||||
|
||||
You can add users by patterns:
|
||||
- https://www.instagram.com/SomeUserName
|
||||
|
||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
||||
' by using the '*' as shown below:
|
||||
' <Assembly: AssemblyVersion("1.0.*")>
|
||||
|
||||
<Assembly: AssemblyVersion("1.0.0.0")>
|
||||
<Assembly: AssemblyFileVersion("1.0.0.0")>
|
||||
<Assembly: AssemblyVersion("1.0.0.1")>
|
||||
<Assembly: AssemblyFileVersion("1.0.0.1")>
|
||||
<Assembly: NeutralResourcesLanguage("en")>
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
' This program is distributed in the hope that it will be useful,
|
||||
' but WITHOUT ANY WARRANTY
|
||||
Imports PersonalUtilities.Functions.RegularExpressions
|
||||
Imports UStates = SCrawler.Plugin.PluginUserMedia.States
|
||||
Imports UTypes = SCrawler.Plugin.PluginUserMedia.Types
|
||||
Public Class UserData : Implements IPluginContentProvider
|
||||
#Region "XML names"
|
||||
Private Const Name_LatestPage As String = "LatestPage"
|
||||
@@ -65,7 +67,7 @@ Public Class UserData : Implements IPluginContentProvider
|
||||
With Responser : .Copy(Settings.Responser) : .Error = EDP.ThrowException : End With
|
||||
|
||||
Dim l As List(Of String) = Nothing
|
||||
Dim NextPage$ = String.Empty
|
||||
Dim NextPage$
|
||||
Dim r$
|
||||
Dim _LPage As Func(Of String) = Function() If(LatestPage.IsEmptyString, String.Empty, $"page-{LatestPage}")
|
||||
|
||||
@@ -90,7 +92,7 @@ Public Class UserData : Implements IPluginContentProvider
|
||||
f = CStr(RegexReplace(u, FileRegEx))
|
||||
f.Path = DataPath.CSFilePSN
|
||||
f.Separator = "\"
|
||||
TempMediaList.Add(New PluginUserMedia With {.ContentType = PluginUserMedia.Types.Picture, .URL = u, .File = f})
|
||||
TempMediaList.Add(New PluginUserMedia With {.ContentType = UTypes.Picture, .URL = u, .File = f})
|
||||
End If
|
||||
Next
|
||||
If TempMediaList.ListExists And ExistingContentList.ListExists Then _
|
||||
@@ -112,15 +114,16 @@ Public Class UserData : Implements IPluginContentProvider
|
||||
For i% = 0 To TempMediaList.Count - 1
|
||||
Thrower.ThrowAny()
|
||||
m = TempMediaList(i)
|
||||
m.DownloadState = PluginUserMedia.States.Tried
|
||||
m.DownloadState = UStates.Tried
|
||||
Try
|
||||
If Not m.URL.IsEmptyString And Not m.File.IsEmptyString Then
|
||||
Responser.DownloadFile(m.URL, m.File, eweb)
|
||||
m.DownloadState = PluginUserMedia.States.Downloaded
|
||||
m.DownloadState = UStates.Downloaded
|
||||
Else
|
||||
m.DownloadState = PluginUserMedia.States.Skipped
|
||||
m.DownloadState = UStates.Skipped
|
||||
End If
|
||||
Catch ex As Exception
|
||||
m.DownloadState = UStates.Skipped
|
||||
End Try
|
||||
RaiseEvent ProgressChanged(1)
|
||||
TempMediaList(i) = m
|
||||
|
||||
@@ -41,7 +41,8 @@ Friend NotInheritable Class M3U8
|
||||
Return Nothing
|
||||
Catch ex As Exception
|
||||
Logger.Add(ex, "[M3U8.Save]")
|
||||
Return Nothing
|
||||
ex.HelpLink = 1
|
||||
Throw ex
|
||||
Finally
|
||||
CachePath.Delete(SFO.Path, SFODelete.None, EDP.None)
|
||||
End Try
|
||||
@@ -61,8 +62,8 @@ Friend NotInheritable Class M3U8
|
||||
End If
|
||||
Return Nothing
|
||||
Catch ex As Exception
|
||||
Logger.Add(ex, "[M3U8.Download]")
|
||||
Return Nothing
|
||||
If Not ex.HelpLink = 1 Then Logger.Add(ex, "[M3U8.Download]")
|
||||
Throw ex
|
||||
End Try
|
||||
End Function
|
||||
End Class
|
||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
||||
' by using the '*' as shown below:
|
||||
' <Assembly: AssemblyVersion("1.0.*")>
|
||||
|
||||
<Assembly: AssemblyVersion("1.0.0.0")>
|
||||
<Assembly: AssemblyFileVersion("1.0.0.0")>
|
||||
<Assembly: AssemblyVersion("1.0.0.2")>
|
||||
<Assembly: AssemblyFileVersion("1.0.0.2")>
|
||||
<Assembly: NeutralResourcesLanguage("en")>
|
||||
|
||||
@@ -10,6 +10,8 @@ Imports PersonalUtilities.Functions.RegularExpressions
|
||||
Imports PersonalUtilities.Functions.XML
|
||||
Imports PersonalUtilities.Tools.WEB
|
||||
Imports PersonalUtilities.Tools.WebDocuments.JSON
|
||||
Imports UStates = SCrawler.Plugin.PluginUserMedia.States
|
||||
Imports UTypes = SCrawler.Plugin.PluginUserMedia.Types
|
||||
Public Class UserData : Implements IPluginContentProvider
|
||||
#Region "Interface declarations"
|
||||
Public Event ProgressChanged(Count As Integer) Implements IPluginContentProvider.ProgressChanged
|
||||
@@ -71,7 +73,7 @@ Public Class UserData : Implements IPluginContentProvider
|
||||
Thrower.ThrowAny()
|
||||
r = Responser.GetResponse($"https://www.xvideos.com/{user}/videos/new/{If(NextPage = 0, String.Empty, NextPage)}",, e)
|
||||
If Not r.IsEmptyString Then
|
||||
If Not EnvirSet Then UserExists = True : UserSuspended = False
|
||||
If Not EnvirSet Then UserExists = True : UserSuspended = False : EnvirSet = True
|
||||
j = JsonDocument.Parse(r).XmlIfNothing
|
||||
With j
|
||||
If .Contains("videos") Then
|
||||
@@ -90,6 +92,7 @@ Public Class UserData : Implements IPluginContentProvider
|
||||
End If
|
||||
End With
|
||||
Else
|
||||
.Dispose()
|
||||
Exit Do
|
||||
End If
|
||||
.Dispose()
|
||||
@@ -147,7 +150,7 @@ Public Class UserData : Implements IPluginContentProvider
|
||||
r = resp.GetResponse(m,, EDP.ThrowException)
|
||||
If Not r.IsEmptyString Then
|
||||
Dim ls As List(Of VSize) = FNF.RegexFields(Of VSize)(r, {M3U8Reparse}, {1, 2})
|
||||
If ls.ListExists And DownloadUHD Then ls.RemoveAll(Function(v) v.Size > 1080)
|
||||
If ls.ListExists And Not DownloadUHD Then ls.RemoveAll(Function(v) v.Size > 1080)
|
||||
If ls.ListExists Then
|
||||
ls.Sort()
|
||||
m = $"{appender}/{ls(0).Value}"
|
||||
@@ -164,7 +167,7 @@ Public Class UserData : Implements IPluginContentProvider
|
||||
End If
|
||||
If Not m.IsEmptyString Then
|
||||
Return New PluginUserMedia With {
|
||||
.ContentType = PluginUserMedia.Types.m3u8,
|
||||
.ContentType = UTypes.m3u8,
|
||||
.PostID = pID,
|
||||
.URL = m,
|
||||
.File = $"{t}.mp4",
|
||||
@@ -194,9 +197,14 @@ Public Class UserData : Implements IPluginContentProvider
|
||||
m = TempMediaList(i)
|
||||
f = m.File
|
||||
f.Path = DefPath
|
||||
m.DownloadState = UStates.Tried
|
||||
Try
|
||||
f = M3U8.Download(m.URL, m.SpecialFolder, Settings.FfmpegFile, f, LogProvider)
|
||||
m.File = f
|
||||
If Not f.IsEmptyString Then m.DownloadState = PluginUserMedia.States.Downloaded
|
||||
m.DownloadState = UStates.Downloaded
|
||||
Catch ex As Exception
|
||||
m.DownloadState = UStates.Skipped
|
||||
End Try
|
||||
TempMediaList(i) = m
|
||||
RaiseEvent ProgressChanged(1)
|
||||
Next
|
||||
|
||||
@@ -248,7 +248,7 @@ BlockPictureFolder:
|
||||
End If
|
||||
BlockPictureScan:
|
||||
On Error GoTo BlockDeletePictureFolder
|
||||
Dim NewPicFile As SFile = SFile.GetFiles(MyFile.CutPath, "*.jpg|*.png",,
|
||||
Dim NewPicFile As SFile = SFile.GetFiles(MyFile.CutPath, "*.jpg|*.jpeg|*.png",,
|
||||
New ErrorsDescriber(EDP.ReturnValue) With {
|
||||
.ReturnValue = New List(Of SFile),
|
||||
.ReturnValueExists = True}).FirstOrDefault
|
||||
@@ -941,16 +941,13 @@ BlockNullPicture:
|
||||
#End Region
|
||||
#Region "Delete, Move, Merge"
|
||||
Friend Overridable Function Delete() As Integer Implements IUserData.Delete
|
||||
Return DeleteF(Me)
|
||||
End Function
|
||||
Friend Function DeleteF(ByVal Instance As IUserData) As Integer
|
||||
Dim f As SFile = SFile.GetPath(MyFile.CutPath.Path)
|
||||
If f.Exists(SFO.Path, False) AndAlso (User.Merged OrElse f.Delete(SFO.Path, Settings.DeleteMode)) Then
|
||||
ImageHandler(Me, False)
|
||||
Settings.UsersList.Remove(User)
|
||||
Settings.UpdateUsersList()
|
||||
Settings.Users.Remove(Instance)
|
||||
Downloader.UserRemove(Instance)
|
||||
Settings.Users.Remove(Me)
|
||||
Downloader.UserRemove(Me)
|
||||
Dispose(True)
|
||||
Return 1
|
||||
Else
|
||||
@@ -958,24 +955,22 @@ BlockNullPicture:
|
||||
End If
|
||||
End Function
|
||||
Friend Overridable Function MoveFiles(ByVal __CollectionName As String) As Boolean Implements IUserData.MoveFiles
|
||||
Return MoveFilesF(Me, __CollectionName)
|
||||
End Function
|
||||
Friend Function MoveFilesF(ByRef Instance As IUserData, ByVal __CollectionName As String) As Boolean
|
||||
Dim UserBefore As UserInfo = User
|
||||
Dim Removed As Boolean = True
|
||||
Dim _TurnBack As Boolean = False
|
||||
Try
|
||||
Dim f As SFile
|
||||
If IncludedInCollection Then
|
||||
Settings.Users.Add(Instance)
|
||||
Settings.Users.Add(Me)
|
||||
Removed = False
|
||||
User.CollectionName = String.Empty
|
||||
User.IncludedInCollection = False
|
||||
Else
|
||||
Settings.Users.Remove(Instance)
|
||||
Settings.Users.Remove(Me)
|
||||
Removed = True
|
||||
User.CollectionName = __CollectionName
|
||||
User.IncludedInCollection = True
|
||||
User.SpecialPath = Nothing
|
||||
End If
|
||||
_TurnBack = True
|
||||
User.UpdateUserFile()
|
||||
@@ -987,7 +982,7 @@ BlockNullPicture:
|
||||
"Destination directory is not empty!"}, MsgBoxStyle.Exclamation,,, {"Delete", "Cancel"}) = 1 Then
|
||||
MsgBoxE("Operation canceled", MsgBoxStyle.Exclamation)
|
||||
User = UserBefore
|
||||
If Removed Then Settings.Users.Add(Instance) Else Settings.Users.Remove(Instance)
|
||||
If Removed Then Settings.Users.Add(Me) Else Settings.Users.Remove(Me)
|
||||
_TurnBack = False
|
||||
Return False
|
||||
End If
|
||||
@@ -1003,7 +998,7 @@ BlockNullPicture:
|
||||
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Files moving error")
|
||||
User = UserBefore
|
||||
If _TurnBack Then
|
||||
If Removed Then Settings.Users.Add(Instance) Else Settings.Users.Remove(Instance)
|
||||
If Removed Then Settings.Users.Add(Me) Else Settings.Users.Remove(Me)
|
||||
End If
|
||||
Return False
|
||||
End Try
|
||||
@@ -1093,25 +1088,6 @@ BlockNullPicture:
|
||||
Else
|
||||
Return IIf(FriendlyName.IsEmptyString, Name, FriendlyName)
|
||||
End If
|
||||
'If Settings.ViewModeIsPicture Then
|
||||
' If IsCollection Then
|
||||
' Return CollectionName
|
||||
' Else
|
||||
' Return IIf(FriendlyName.IsEmptyString, Name, FriendlyName)
|
||||
' End If
|
||||
'Else
|
||||
' Dim t$ = String.Empty
|
||||
' If Temporary Then
|
||||
' t = " (T)"
|
||||
' ElseIf Favorite Then
|
||||
' t = " (F)"
|
||||
' End If
|
||||
' If IsCollection Then
|
||||
' Return $"Collection [{CollectionName}]{t}"
|
||||
' Else
|
||||
' Return $"[{Site}]{t} {IIf(FriendlyName.IsEmptyString, Name, FriendlyName)}"
|
||||
' End If
|
||||
'End If
|
||||
End Function
|
||||
#Region "Buttons actions"
|
||||
Private Sub BTT_CONTEXT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN.Click
|
||||
|
||||
@@ -164,7 +164,7 @@ Namespace API.Instagram
|
||||
RequestsWaitTimerProvider = New TimersChecker(100)
|
||||
RequestsWaitTimerTaskCount = New PropertyValue(1)
|
||||
RequestsWaitTimerTaskCountProvider = New TimersChecker(1)
|
||||
SleepTimerOnPostsLimit = New PropertyValue(6000)
|
||||
SleepTimerOnPostsLimit = New PropertyValue(60000)
|
||||
SleepTimerOnPostsLimitProvider = New TimersChecker(10000)
|
||||
|
||||
GetStories = New PropertyValue(False)
|
||||
|
||||
@@ -138,7 +138,7 @@ Namespace API.Instagram
|
||||
End Function
|
||||
Private Sub ReconfigureAwaiter()
|
||||
If WaitNotificationMode = WNM.SkipTemp Then WaitNotificationMode = WNM.Notify
|
||||
If Caught429 Then Caught429 = False ': RequestsCount = 0
|
||||
If Caught429 Then Caught429 = False
|
||||
ProgressTempSet = False
|
||||
End Sub
|
||||
Private Sub NextRequest(ByVal StartWait As Boolean)
|
||||
|
||||
@@ -12,9 +12,12 @@ Imports PersonalUtilities.Functions.XML
|
||||
Imports SCrawler.API.Base
|
||||
Imports SCrawler.Plugin.Hosts
|
||||
Imports System.Threading
|
||||
Imports SCrawler.API.Reddit.RedditViewExchange
|
||||
Imports View = SCrawler.API.Reddit.IRedditView.View
|
||||
Imports Period = SCrawler.API.Reddit.IRedditView.Period
|
||||
Namespace API.Reddit
|
||||
Friend Class Channel : Implements ICollection(Of UserPost), IEquatable(Of Channel), IComparable(Of Channel),
|
||||
IRangeSwitcherContainer(Of UserPost), ILoaderSaver, IMyEnumerator(Of UserPost), IChannelLimits, IDisposable
|
||||
IRangeSwitcherContainer(Of UserPost), ILoaderSaver, IMyEnumerator(Of UserPost), IChannelLimits, IRedditView, IDisposable
|
||||
#Region "XML Nodes' Names"
|
||||
Private Const Name_Name As String = "Name"
|
||||
Private Const Name_ID As String = "ID"
|
||||
@@ -35,6 +38,7 @@ Namespace API.Reddit
|
||||
End Property
|
||||
Friend ReadOnly Property PostsLatest As List(Of UserPost)
|
||||
Friend ReadOnly Property Posts As List(Of UserPost)
|
||||
Friend ReadOnly Property PostsNames As List(Of String)
|
||||
Friend ReadOnly Property PostsAll As List(Of UserPost)
|
||||
Get
|
||||
Return ListAddList(Nothing, Posts).ListAddList(PostsLatest).ListSort
|
||||
@@ -57,6 +61,14 @@ Namespace API.Reddit
|
||||
Return $"{ChannelsCollection.ChannelsPath.PathWithSeparator}{ID}.xml"
|
||||
End Get
|
||||
End Property
|
||||
Private ReadOnly Property FilePosts As SFile
|
||||
Get
|
||||
Dim f As SFile = File
|
||||
f.Name &= "_Posts"
|
||||
f.Extension = "txt"
|
||||
Return f
|
||||
End Get
|
||||
End Property
|
||||
Friend ReadOnly Property CachePath As SFile
|
||||
Get
|
||||
Return $"{ChannelsCollection.ChannelsPathCache.PathWithSeparator}{ID}\"
|
||||
@@ -73,6 +85,14 @@ Namespace API.Reddit
|
||||
End Get
|
||||
End Property
|
||||
Private ReadOnly Property Range As RangeSwitcher(Of UserPost)
|
||||
Friend Property ViewMode As View = View.New Implements IRedditView.ViewMode
|
||||
Friend Property ViewPeriod As Period = Period.All Implements IRedditView.ViewPeriod
|
||||
Friend Sub SetView(ByVal Options As IRedditView) Implements IRedditView.SetView
|
||||
If Not Options Is Nothing Then
|
||||
ViewMode = Options.ViewMode
|
||||
ViewPeriod = Options.ViewPeriod
|
||||
End If
|
||||
End Sub
|
||||
#Region "Statistics support"
|
||||
Private ReadOnly CountOfAddedUsers As List(Of Integer)
|
||||
Private ReadOnly CountOfLoadedPostsPerSession As List(Of Integer)
|
||||
@@ -118,6 +138,9 @@ Namespace API.Reddit
|
||||
Private _DownloadLimitCount As Integer? = Nothing
|
||||
Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount
|
||||
Get
|
||||
If Not ViewMode = View.New And AutoGetLimits Then
|
||||
Return _DownloadLimitCount
|
||||
Else
|
||||
If AutoGetLimits Then
|
||||
If LatestParsedDate.HasValue OrElse Not DownloadLimitPost.IsEmptyString Then
|
||||
Return Nothing
|
||||
@@ -129,6 +152,7 @@ Namespace API.Reddit
|
||||
Else
|
||||
Return _DownloadLimitCount
|
||||
End If
|
||||
End If
|
||||
End Get
|
||||
Set(ByVal NewLimit As Integer?)
|
||||
_DownloadLimitCount = NewLimit
|
||||
@@ -137,12 +161,16 @@ Namespace API.Reddit
|
||||
Private _DownloadLimitPost As String = String.Empty
|
||||
Friend Property DownloadLimitPost As String Implements IChannelLimits.DownloadLimitPost
|
||||
Get
|
||||
If Not ViewMode = View.New And AutoGetLimits Then
|
||||
Return _DownloadLimitPost
|
||||
Else
|
||||
Dim PID$ = ListAddList(Nothing, Posts, LAP.NotContainsOnly).ListAddList(PostsLatest, LAP.NotContainsOnly).ListSort.FirstOrDefault.ID
|
||||
If AutoGetLimits And Not PID.IsEmptyString Then
|
||||
Return PID
|
||||
Else
|
||||
Return _DownloadLimitPost
|
||||
End If
|
||||
End If
|
||||
End Get
|
||||
Set(ByVal NewLimit As String)
|
||||
_DownloadLimitPost = NewLimit
|
||||
@@ -151,11 +179,15 @@ Namespace API.Reddit
|
||||
Private _DownloadLimitDate As Date? = Nothing
|
||||
Friend Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate
|
||||
Get
|
||||
If Not ViewMode = View.New And AutoGetLimits Then
|
||||
Return _DownloadLimitDate
|
||||
Else
|
||||
If AutoGetLimits And LatestParsedDate.HasValue Then
|
||||
Return LatestParsedDate
|
||||
Else
|
||||
Return _DownloadLimitDate
|
||||
End If
|
||||
End If
|
||||
End Get
|
||||
Set(ByVal NewLimit As Date?)
|
||||
_DownloadLimitDate = NewLimit
|
||||
@@ -174,6 +206,11 @@ Namespace API.Reddit
|
||||
DownloadLimitDate = .DownloadLimitDate
|
||||
AutoGetLimits = .AutoGetLimits
|
||||
End With
|
||||
If Not ViewMode = View.New And AutoGetLimits Then
|
||||
DownloadLimitDate = Nothing
|
||||
DownloadLimitCount = Nothing
|
||||
DownloadLimitPost = String.Empty
|
||||
End If
|
||||
End Sub
|
||||
Friend Property AutoGetLimits As Boolean = True Implements IChannelLimits.AutoGetLimits
|
||||
#End Region
|
||||
@@ -181,6 +218,7 @@ Namespace API.Reddit
|
||||
Friend Sub New()
|
||||
Posts = New List(Of UserPost)
|
||||
PostsLatest = New List(Of UserPost)
|
||||
PostsNames = New List(Of String)
|
||||
Range = New RangeSwitcher(Of UserPost)(Me)
|
||||
CountOfAddedUsers = New List(Of Integer)
|
||||
CountOfLoadedPostsPerSession = New List(Of Integer)
|
||||
@@ -203,6 +241,7 @@ Namespace API.Reddit
|
||||
End Function
|
||||
Friend Sub Delete()
|
||||
File.Delete(, SFODelete.DeleteToRecycleBin)
|
||||
FilePosts.Delete(, SFODelete.DeleteToRecycleBin)
|
||||
End Sub
|
||||
Friend Sub DownloadData(ByVal Token As CancellationToken, Optional ByVal SkipExists As Boolean = True,
|
||||
Optional ByVal p As MyProgress = Nothing)
|
||||
@@ -214,10 +253,13 @@ Namespace API.Reddit
|
||||
.SkipExistsUsers = SkipExists,
|
||||
.ChannelInfo = Me
|
||||
}
|
||||
d.SetEnvironment(HOST, CUser, False)
|
||||
d.RemoveUpdateHandlers()
|
||||
d.SetLimit(Me)
|
||||
d.DownloadData(Token)
|
||||
With d
|
||||
.SetEnvironment(HOST, CUser, False)
|
||||
.RemoveUpdateHandlers()
|
||||
.SetLimit(Me)
|
||||
.SetView(Me)
|
||||
.DownloadData(Token)
|
||||
End With
|
||||
Dim b% = Posts.Count
|
||||
Posts.ListAddList(d.GetNewChannelPosts(), LAP.NotContainsOnly)
|
||||
If Posts.Count - b > 0 Then CountOfLoadedPostsPerSession.Add(Posts.Count - b)
|
||||
@@ -298,6 +340,9 @@ Namespace API.Reddit
|
||||
Dim lc As New ListAddParams(LAP.ClearBeforeAdd)
|
||||
Name = x.Value(Name_Name)
|
||||
ID = x.Value(Name_ID)
|
||||
ViewMode = x.Value(Name_ViewMode).FromXML(Of Integer)(CInt(View.[New]))
|
||||
ViewPeriod = x.Value(Name_ViewPeriod).FromXML(Of Integer)(CInt(Period.All))
|
||||
If FilePosts.Exists Then PostsNames.ListAddList(FilePosts.GetText.StringToList(Of String)("|"), LNC)
|
||||
LatestParsedDate = AConvert(Of Date)(x.Value(Name_Date), XMLDateProvider, Nothing)
|
||||
CountOfAddedUsers.ListAddList(x.Value(Name_UsersAdded).StringToList(Of Integer)("|"), lc)
|
||||
CountOfLoadedPostsPerSession.ListAddList(x.Value(Name_PostsDownloaded).StringToList(Of Integer)("|"), lc)
|
||||
@@ -317,9 +362,20 @@ Namespace API.Reddit
|
||||
Friend Overloads Function Save(Optional ByVal f As SFile = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean Implements ILoaderSaver.Save
|
||||
Dim XMLDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
|
||||
UpdateUsersStats()
|
||||
If Not ViewMode = View.New Then
|
||||
Dim l As New List(Of String)
|
||||
If Posts.Count > 0 Or PostsLatest.Count > 0 Then l.ListAddList((From p In PostsAll Where Not p.ID.IsEmptyString Select p.ID), LAP.NotContainsOnly)
|
||||
l.ListAddList(PostsNames, LAP.NotContainsOnly)
|
||||
If l.Count > 0 Then TextSaver.SaveTextToFile(l.ListToString(, "|"), FilePosts, True,, EDP.SendInLog)
|
||||
End If
|
||||
Using x As New XmlFile With {.AllowSameNames = True, .Name = "Channel"}
|
||||
x.Add(Name_Name, Name)
|
||||
x.Add(Name_ID, ID)
|
||||
x.Add(Name_ViewMode, CInt(ViewMode))
|
||||
x.Add(Name_ViewPeriod, CInt(ViewPeriod))
|
||||
x.Add(Name_UsersAdded, CountOfAddedUsers.ListToString(, "|"))
|
||||
x.Add(Name_PostsDownloaded, CountOfLoadedPostsPerSession.ListToString(, "|"))
|
||||
x.Add(Name_UsersExistent, ChannelExistentUserNames.ListToString(, "|"))
|
||||
If Posts.Count > 0 Or PostsLatest.Count > 0 Then
|
||||
Dim tmpPostList As List(Of UserPost) = Nothing
|
||||
tmpPostList.ListAddList(Posts).ListAddList(PostsLatest)
|
||||
@@ -327,9 +383,6 @@ Namespace API.Reddit
|
||||
LatestParsedDate = tmpPostList.FirstOrDefault(Function(pd) pd.Date.HasValue).Date
|
||||
x.Add(Name_Date, AConvert(Of String)(LatestParsedDate, XMLDateProvider, String.Empty))
|
||||
x.Add(Name_PostsNode, String.Empty)
|
||||
x.Add(Name_UsersAdded, CountOfAddedUsers.ListToString(, "|"))
|
||||
x.Add(Name_PostsDownloaded, CountOfLoadedPostsPerSession.ListToString(, "|"))
|
||||
x.Add(Name_UsersExistent, ChannelExistentUserNames.ListToString(, "|"))
|
||||
With x(Name_PostsNode)
|
||||
tmpPostList.Take(200).ToList.ForEach(Sub(p) .Add(New EContainer("Post",
|
||||
String.Empty,
|
||||
@@ -354,6 +407,7 @@ Namespace API.Reddit
|
||||
If disposing Then
|
||||
Posts.Clear()
|
||||
PostsLatest.Clear()
|
||||
PostsNames.Clear()
|
||||
CountOfAddedUsers.Clear()
|
||||
CountOfLoadedPostsPerSession.Clear()
|
||||
Range.Dispose()
|
||||
|
||||
40
SCrawler/API/Reddit/IRedditView.vb
Normal file
40
SCrawler/API/Reddit/IRedditView.vb
Normal file
@@ -0,0 +1,40 @@
|
||||
' Copyright (C) 2022 Andy
|
||||
' This program is free software: you can redistribute it and/or modify
|
||||
' it under the terms of the GNU General Public License as published by
|
||||
' the Free Software Foundation, either version 3 of the License, or
|
||||
' (at your option) any later version.
|
||||
'
|
||||
' This program is distributed in the hope that it will be useful,
|
||||
' but WITHOUT ANY WARRANTY
|
||||
Namespace API.Reddit
|
||||
Friend Interface IRedditView
|
||||
Enum View As Integer
|
||||
[New] = 0
|
||||
Hot = 1
|
||||
Top = 2
|
||||
End Enum
|
||||
Enum Period As Integer
|
||||
All = 0
|
||||
Hour = 1
|
||||
Day = 2
|
||||
Week = 3
|
||||
Month = 4
|
||||
Year = 5
|
||||
End Enum
|
||||
Property ViewMode As View
|
||||
Property ViewPeriod As Period
|
||||
Sub SetView(ByVal Options As IRedditView)
|
||||
End Interface
|
||||
Friend Class RedditViewExchange : Implements IRedditView
|
||||
Friend Const Name_ViewMode As String = "ViewMode"
|
||||
Friend Const Name_ViewPeriod As String = "ViewPeriod"
|
||||
Friend Property ViewMode As IRedditView.View Implements IRedditView.ViewMode
|
||||
Friend Property ViewPeriod As IRedditView.Period Implements IRedditView.ViewPeriod
|
||||
Friend Sub SetView(ByVal Options As IRedditView) Implements IRedditView.SetView
|
||||
If Not Options Is Nothing Then
|
||||
ViewMode = Options.ViewMode
|
||||
ViewPeriod = Options.ViewPeriod
|
||||
End If
|
||||
End Sub
|
||||
End Class
|
||||
End Namespace
|
||||
301
SCrawler/API/Reddit/RedditViewSettingsForm.Designer.vb
generated
Normal file
301
SCrawler/API/Reddit/RedditViewSettingsForm.Designer.vb
generated
Normal file
@@ -0,0 +1,301 @@
|
||||
' Copyright (C) 2022 Andy
|
||||
' This program is free software: you can redistribute it and/or modify
|
||||
' it under the terms of the GNU General Public License as published by
|
||||
' the Free Software Foundation, either version 3 of the License, or
|
||||
' (at your option) any later version.
|
||||
'
|
||||
' This program is distributed in the hope that it will be useful,
|
||||
' but WITHOUT ANY WARRANTY
|
||||
Namespace API.Reddit
|
||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||
Partial Friend Class RedditViewSettingsForm : Inherits System.Windows.Forms.Form
|
||||
<System.Diagnostics.DebuggerNonUserCode()>
|
||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||
Try
|
||||
If disposing AndAlso components IsNot Nothing Then
|
||||
components.Dispose()
|
||||
End If
|
||||
Finally
|
||||
MyBase.Dispose(disposing)
|
||||
End Try
|
||||
End Sub
|
||||
Private components As System.ComponentModel.IContainer
|
||||
<System.Diagnostics.DebuggerStepThrough()>
|
||||
Private Sub InitializeComponent()
|
||||
Dim CONTAINER_MAIN As System.Windows.Forms.ToolStripContainer
|
||||
Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel
|
||||
Dim TP_VIEW_MODE As System.Windows.Forms.TableLayoutPanel
|
||||
Dim LBL_VIEW_MODE As System.Windows.Forms.Label
|
||||
Dim LBL_PERIOD As System.Windows.Forms.Label
|
||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(RedditViewSettingsForm))
|
||||
Me.OPT_VIEW_MODE_NEW = New System.Windows.Forms.RadioButton()
|
||||
Me.OPT_VIEW_MODE_HOT = New System.Windows.Forms.RadioButton()
|
||||
Me.OPT_VIEW_MODE_TOP = New System.Windows.Forms.RadioButton()
|
||||
Me.TP_PERIOD = New System.Windows.Forms.TableLayoutPanel()
|
||||
Me.OPT_PERIOD_ALL = New System.Windows.Forms.RadioButton()
|
||||
Me.OPT_PERIOD_HOUR = New System.Windows.Forms.RadioButton()
|
||||
Me.OPT_PERIOD_DAY = New System.Windows.Forms.RadioButton()
|
||||
Me.OPT_PERIOD_WEEK = New System.Windows.Forms.RadioButton()
|
||||
Me.OPT_PERIOD_MONTH = New System.Windows.Forms.RadioButton()
|
||||
Me.OPT_PERIOD_YEAR = New System.Windows.Forms.RadioButton()
|
||||
CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
|
||||
TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
|
||||
TP_VIEW_MODE = New System.Windows.Forms.TableLayoutPanel()
|
||||
LBL_VIEW_MODE = New System.Windows.Forms.Label()
|
||||
LBL_PERIOD = New System.Windows.Forms.Label()
|
||||
CONTAINER_MAIN.ContentPanel.SuspendLayout()
|
||||
CONTAINER_MAIN.SuspendLayout()
|
||||
TP_MAIN.SuspendLayout()
|
||||
TP_VIEW_MODE.SuspendLayout()
|
||||
Me.TP_PERIOD.SuspendLayout()
|
||||
Me.SuspendLayout()
|
||||
'
|
||||
'CONTAINER_MAIN
|
||||
'
|
||||
'
|
||||
'CONTAINER_MAIN.ContentPanel
|
||||
'
|
||||
CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN)
|
||||
CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(477, 87)
|
||||
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(477, 112)
|
||||
CONTAINER_MAIN.TabIndex = 0
|
||||
CONTAINER_MAIN.TopToolStripPanelVisible = False
|
||||
'
|
||||
'TP_MAIN
|
||||
'
|
||||
TP_MAIN.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single]
|
||||
TP_MAIN.ColumnCount = 1
|
||||
TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||
TP_MAIN.Controls.Add(TP_VIEW_MODE, 0, 0)
|
||||
TP_MAIN.Controls.Add(Me.TP_PERIOD, 0, 1)
|
||||
TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
TP_MAIN.Location = New System.Drawing.Point(0, 0)
|
||||
TP_MAIN.Name = "TP_MAIN"
|
||||
TP_MAIN.RowCount = 3
|
||||
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, 56.0!))
|
||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||
TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
|
||||
TP_MAIN.Size = New System.Drawing.Size(477, 87)
|
||||
TP_MAIN.TabIndex = 0
|
||||
'
|
||||
'TP_VIEW_MODE
|
||||
'
|
||||
TP_VIEW_MODE.ColumnCount = 4
|
||||
TP_VIEW_MODE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||
TP_VIEW_MODE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||
TP_VIEW_MODE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||
TP_VIEW_MODE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||
TP_VIEW_MODE.Controls.Add(LBL_VIEW_MODE, 0, 0)
|
||||
TP_VIEW_MODE.Controls.Add(Me.OPT_VIEW_MODE_NEW, 1, 0)
|
||||
TP_VIEW_MODE.Controls.Add(Me.OPT_VIEW_MODE_HOT, 2, 0)
|
||||
TP_VIEW_MODE.Controls.Add(Me.OPT_VIEW_MODE_TOP, 3, 0)
|
||||
TP_VIEW_MODE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
TP_VIEW_MODE.Location = New System.Drawing.Point(1, 1)
|
||||
TP_VIEW_MODE.Margin = New System.Windows.Forms.Padding(0)
|
||||
TP_VIEW_MODE.Name = "TP_VIEW_MODE"
|
||||
TP_VIEW_MODE.RowCount = 1
|
||||
TP_VIEW_MODE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
||||
TP_VIEW_MODE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!))
|
||||
TP_VIEW_MODE.Size = New System.Drawing.Size(475, 28)
|
||||
TP_VIEW_MODE.TabIndex = 0
|
||||
'
|
||||
'LBL_VIEW_MODE
|
||||
'
|
||||
LBL_VIEW_MODE.AutoSize = True
|
||||
LBL_VIEW_MODE.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
LBL_VIEW_MODE.Location = New System.Drawing.Point(3, 0)
|
||||
LBL_VIEW_MODE.Name = "LBL_VIEW_MODE"
|
||||
LBL_VIEW_MODE.Size = New System.Drawing.Size(112, 28)
|
||||
LBL_VIEW_MODE.TabIndex = 0
|
||||
LBL_VIEW_MODE.Text = "View"
|
||||
LBL_VIEW_MODE.TextAlign = System.Drawing.ContentAlignment.MiddleRight
|
||||
'
|
||||
'OPT_VIEW_MODE_NEW
|
||||
'
|
||||
Me.OPT_VIEW_MODE_NEW.AutoSize = True
|
||||
Me.OPT_VIEW_MODE_NEW.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.OPT_VIEW_MODE_NEW.Location = New System.Drawing.Point(121, 3)
|
||||
Me.OPT_VIEW_MODE_NEW.Name = "OPT_VIEW_MODE_NEW"
|
||||
Me.OPT_VIEW_MODE_NEW.Size = New System.Drawing.Size(112, 22)
|
||||
Me.OPT_VIEW_MODE_NEW.TabIndex = 1
|
||||
Me.OPT_VIEW_MODE_NEW.TabStop = True
|
||||
Me.OPT_VIEW_MODE_NEW.Text = "New"
|
||||
Me.OPT_VIEW_MODE_NEW.UseVisualStyleBackColor = True
|
||||
'
|
||||
'OPT_VIEW_MODE_HOT
|
||||
'
|
||||
Me.OPT_VIEW_MODE_HOT.AutoSize = True
|
||||
Me.OPT_VIEW_MODE_HOT.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.OPT_VIEW_MODE_HOT.Location = New System.Drawing.Point(239, 3)
|
||||
Me.OPT_VIEW_MODE_HOT.Name = "OPT_VIEW_MODE_HOT"
|
||||
Me.OPT_VIEW_MODE_HOT.Size = New System.Drawing.Size(112, 22)
|
||||
Me.OPT_VIEW_MODE_HOT.TabIndex = 2
|
||||
Me.OPT_VIEW_MODE_HOT.TabStop = True
|
||||
Me.OPT_VIEW_MODE_HOT.Text = "Hot"
|
||||
Me.OPT_VIEW_MODE_HOT.UseVisualStyleBackColor = True
|
||||
'
|
||||
'OPT_VIEW_MODE_TOP
|
||||
'
|
||||
Me.OPT_VIEW_MODE_TOP.AutoSize = True
|
||||
Me.OPT_VIEW_MODE_TOP.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.OPT_VIEW_MODE_TOP.Location = New System.Drawing.Point(357, 3)
|
||||
Me.OPT_VIEW_MODE_TOP.Name = "OPT_VIEW_MODE_TOP"
|
||||
Me.OPT_VIEW_MODE_TOP.Size = New System.Drawing.Size(115, 22)
|
||||
Me.OPT_VIEW_MODE_TOP.TabIndex = 3
|
||||
Me.OPT_VIEW_MODE_TOP.TabStop = True
|
||||
Me.OPT_VIEW_MODE_TOP.Text = "Top"
|
||||
Me.OPT_VIEW_MODE_TOP.UseVisualStyleBackColor = True
|
||||
'
|
||||
'TP_PERIOD
|
||||
'
|
||||
Me.TP_PERIOD.ColumnCount = 4
|
||||
Me.TP_PERIOD.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||
Me.TP_PERIOD.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||
Me.TP_PERIOD.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||
Me.TP_PERIOD.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.0!))
|
||||
Me.TP_PERIOD.Controls.Add(LBL_PERIOD, 0, 0)
|
||||
Me.TP_PERIOD.Controls.Add(Me.OPT_PERIOD_ALL, 1, 0)
|
||||
Me.TP_PERIOD.Controls.Add(Me.OPT_PERIOD_HOUR, 2, 0)
|
||||
Me.TP_PERIOD.Controls.Add(Me.OPT_PERIOD_DAY, 3, 0)
|
||||
Me.TP_PERIOD.Controls.Add(Me.OPT_PERIOD_WEEK, 1, 1)
|
||||
Me.TP_PERIOD.Controls.Add(Me.OPT_PERIOD_MONTH, 2, 1)
|
||||
Me.TP_PERIOD.Controls.Add(Me.OPT_PERIOD_YEAR, 3, 1)
|
||||
Me.TP_PERIOD.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.TP_PERIOD.Location = New System.Drawing.Point(1, 30)
|
||||
Me.TP_PERIOD.Margin = New System.Windows.Forms.Padding(0)
|
||||
Me.TP_PERIOD.Name = "TP_PERIOD"
|
||||
Me.TP_PERIOD.RowCount = 2
|
||||
Me.TP_PERIOD.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||
Me.TP_PERIOD.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
||||
Me.TP_PERIOD.Size = New System.Drawing.Size(475, 56)
|
||||
Me.TP_PERIOD.TabIndex = 2
|
||||
'
|
||||
'LBL_PERIOD
|
||||
'
|
||||
LBL_PERIOD.AutoSize = True
|
||||
LBL_PERIOD.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
LBL_PERIOD.Location = New System.Drawing.Point(3, 0)
|
||||
LBL_PERIOD.Name = "LBL_PERIOD"
|
||||
LBL_PERIOD.Size = New System.Drawing.Size(112, 28)
|
||||
LBL_PERIOD.TabIndex = 0
|
||||
LBL_PERIOD.Text = "Period"
|
||||
LBL_PERIOD.TextAlign = System.Drawing.ContentAlignment.MiddleRight
|
||||
'
|
||||
'OPT_PERIOD_ALL
|
||||
'
|
||||
Me.OPT_PERIOD_ALL.AutoSize = True
|
||||
Me.OPT_PERIOD_ALL.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.OPT_PERIOD_ALL.Location = New System.Drawing.Point(121, 3)
|
||||
Me.OPT_PERIOD_ALL.Name = "OPT_PERIOD_ALL"
|
||||
Me.OPT_PERIOD_ALL.Size = New System.Drawing.Size(112, 22)
|
||||
Me.OPT_PERIOD_ALL.TabIndex = 1
|
||||
Me.OPT_PERIOD_ALL.TabStop = True
|
||||
Me.OPT_PERIOD_ALL.Text = "All"
|
||||
Me.OPT_PERIOD_ALL.UseVisualStyleBackColor = True
|
||||
'
|
||||
'OPT_PERIOD_HOUR
|
||||
'
|
||||
Me.OPT_PERIOD_HOUR.AutoSize = True
|
||||
Me.OPT_PERIOD_HOUR.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.OPT_PERIOD_HOUR.Location = New System.Drawing.Point(239, 3)
|
||||
Me.OPT_PERIOD_HOUR.Name = "OPT_PERIOD_HOUR"
|
||||
Me.OPT_PERIOD_HOUR.Size = New System.Drawing.Size(112, 22)
|
||||
Me.OPT_PERIOD_HOUR.TabIndex = 2
|
||||
Me.OPT_PERIOD_HOUR.TabStop = True
|
||||
Me.OPT_PERIOD_HOUR.Text = "Hour"
|
||||
Me.OPT_PERIOD_HOUR.UseVisualStyleBackColor = True
|
||||
'
|
||||
'OPT_PERIOD_DAY
|
||||
'
|
||||
Me.OPT_PERIOD_DAY.AutoSize = True
|
||||
Me.OPT_PERIOD_DAY.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.OPT_PERIOD_DAY.Location = New System.Drawing.Point(357, 3)
|
||||
Me.OPT_PERIOD_DAY.Name = "OPT_PERIOD_DAY"
|
||||
Me.OPT_PERIOD_DAY.Size = New System.Drawing.Size(115, 22)
|
||||
Me.OPT_PERIOD_DAY.TabIndex = 3
|
||||
Me.OPT_PERIOD_DAY.TabStop = True
|
||||
Me.OPT_PERIOD_DAY.Text = "Day"
|
||||
Me.OPT_PERIOD_DAY.UseVisualStyleBackColor = True
|
||||
'
|
||||
'OPT_PERIOD_WEEK
|
||||
'
|
||||
Me.OPT_PERIOD_WEEK.AutoSize = True
|
||||
Me.OPT_PERIOD_WEEK.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.OPT_PERIOD_WEEK.Location = New System.Drawing.Point(121, 31)
|
||||
Me.OPT_PERIOD_WEEK.Name = "OPT_PERIOD_WEEK"
|
||||
Me.OPT_PERIOD_WEEK.Size = New System.Drawing.Size(112, 22)
|
||||
Me.OPT_PERIOD_WEEK.TabIndex = 4
|
||||
Me.OPT_PERIOD_WEEK.TabStop = True
|
||||
Me.OPT_PERIOD_WEEK.Text = "Week"
|
||||
Me.OPT_PERIOD_WEEK.UseVisualStyleBackColor = True
|
||||
'
|
||||
'OPT_PERIOD_MONTH
|
||||
'
|
||||
Me.OPT_PERIOD_MONTH.AutoSize = True
|
||||
Me.OPT_PERIOD_MONTH.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.OPT_PERIOD_MONTH.Location = New System.Drawing.Point(239, 31)
|
||||
Me.OPT_PERIOD_MONTH.Name = "OPT_PERIOD_MONTH"
|
||||
Me.OPT_PERIOD_MONTH.Size = New System.Drawing.Size(112, 22)
|
||||
Me.OPT_PERIOD_MONTH.TabIndex = 5
|
||||
Me.OPT_PERIOD_MONTH.TabStop = True
|
||||
Me.OPT_PERIOD_MONTH.Text = "Month"
|
||||
Me.OPT_PERIOD_MONTH.UseVisualStyleBackColor = True
|
||||
'
|
||||
'OPT_PERIOD_YEAR
|
||||
'
|
||||
Me.OPT_PERIOD_YEAR.AutoSize = True
|
||||
Me.OPT_PERIOD_YEAR.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.OPT_PERIOD_YEAR.Location = New System.Drawing.Point(357, 31)
|
||||
Me.OPT_PERIOD_YEAR.Name = "OPT_PERIOD_YEAR"
|
||||
Me.OPT_PERIOD_YEAR.Size = New System.Drawing.Size(115, 22)
|
||||
Me.OPT_PERIOD_YEAR.TabIndex = 6
|
||||
Me.OPT_PERIOD_YEAR.TabStop = True
|
||||
Me.OPT_PERIOD_YEAR.Text = "Year"
|
||||
Me.OPT_PERIOD_YEAR.UseVisualStyleBackColor = True
|
||||
'
|
||||
'RedditViewSettingsForm
|
||||
'
|
||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||
Me.ClientSize = New System.Drawing.Size(477, 112)
|
||||
Me.Controls.Add(CONTAINER_MAIN)
|
||||
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
||||
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
|
||||
Me.KeyPreview = True
|
||||
Me.MaximizeBox = False
|
||||
Me.MaximumSize = New System.Drawing.Size(493, 151)
|
||||
Me.MinimizeBox = False
|
||||
Me.MinimumSize = New System.Drawing.Size(493, 151)
|
||||
Me.Name = "RedditViewSettingsForm"
|
||||
Me.ShowInTaskbar = False
|
||||
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
|
||||
Me.Text = "Options"
|
||||
CONTAINER_MAIN.ContentPanel.ResumeLayout(False)
|
||||
CONTAINER_MAIN.ResumeLayout(False)
|
||||
CONTAINER_MAIN.PerformLayout()
|
||||
TP_MAIN.ResumeLayout(False)
|
||||
TP_VIEW_MODE.ResumeLayout(False)
|
||||
TP_VIEW_MODE.PerformLayout()
|
||||
Me.TP_PERIOD.ResumeLayout(False)
|
||||
Me.TP_PERIOD.PerformLayout()
|
||||
Me.ResumeLayout(False)
|
||||
|
||||
End Sub
|
||||
Private WithEvents OPT_VIEW_MODE_NEW As RadioButton
|
||||
Private WithEvents OPT_VIEW_MODE_HOT As RadioButton
|
||||
Private WithEvents OPT_VIEW_MODE_TOP As RadioButton
|
||||
Private WithEvents OPT_PERIOD_ALL As RadioButton
|
||||
Private WithEvents OPT_PERIOD_HOUR As RadioButton
|
||||
Private WithEvents OPT_PERIOD_DAY As RadioButton
|
||||
Private WithEvents OPT_PERIOD_WEEK As RadioButton
|
||||
Private WithEvents OPT_PERIOD_MONTH As RadioButton
|
||||
Private WithEvents OPT_PERIOD_YEAR As RadioButton
|
||||
Private WithEvents TP_PERIOD As TableLayoutPanel
|
||||
End Class
|
||||
End Namespace
|
||||
1268
SCrawler/API/Reddit/RedditViewSettingsForm.resx
Normal file
1268
SCrawler/API/Reddit/RedditViewSettingsForm.resx
Normal file
File diff suppressed because it is too large
Load Diff
90
SCrawler/API/Reddit/RedditViewSettingsForm.vb
Normal file
90
SCrawler/API/Reddit/RedditViewSettingsForm.vb
Normal file
@@ -0,0 +1,90 @@
|
||||
' Copyright (C) 2022 Andy
|
||||
' This program is free software: you can redistribute it and/or modify
|
||||
' it under the terms of the GNU General Public License as published by
|
||||
' the Free Software Foundation, either version 3 of the License, or
|
||||
' (at your option) any later version.
|
||||
'
|
||||
' This program is distributed in the hope that it will be useful,
|
||||
' but WITHOUT ANY WARRANTY
|
||||
Imports PersonalUtilities.Forms
|
||||
Imports PersonalUtilities.Forms.Toolbars
|
||||
Imports CView = SCrawler.API.Reddit.IRedditView.View
|
||||
Imports CPeriod = SCrawler.API.Reddit.IRedditView.Period
|
||||
Namespace API.Reddit
|
||||
Friend Class RedditViewSettingsForm : Implements IOkCancelToolbar
|
||||
Private ReadOnly MyDefs As DefaultFormProps
|
||||
Private ReadOnly Property MyOptions As IRedditView
|
||||
Friend Sub New(ByRef opt As IRedditView)
|
||||
InitializeComponent()
|
||||
MyOptions = opt
|
||||
MyDefs = New DefaultFormProps
|
||||
End Sub
|
||||
Private Sub ChannelSettingsForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||
Try
|
||||
Dim n$ = String.Empty
|
||||
If TypeOf MyOptions Is Channel Then
|
||||
n = $"Channel [{DirectCast(MyOptions, Channel).Name}]"
|
||||
ElseIf TypeOf MyOptions Is Base.IUserData Then
|
||||
n = $"User [{DirectCast(MyOptions, Base.IUserData).Name}]"
|
||||
End If
|
||||
If Not n.IsEmptyString Then Text = n
|
||||
With MyDefs
|
||||
.MyViewInitialize(Me, Settings.Design, True)
|
||||
.AddOkCancelToolbar()
|
||||
.AppendDetectors()
|
||||
.DelegateClosingChecker()
|
||||
Select Case MyOptions.ViewMode
|
||||
Case CView.Hot : OPT_VIEW_MODE_HOT.Checked = True
|
||||
Case CView.Top : OPT_VIEW_MODE_TOP.Checked = True
|
||||
Case Else : OPT_VIEW_MODE_NEW.Checked = True
|
||||
End Select
|
||||
Select Case MyOptions.ViewPeriod
|
||||
Case CPeriod.Hour : OPT_PERIOD_HOUR.Checked = True
|
||||
Case CPeriod.Day : OPT_PERIOD_DAY.Checked = True
|
||||
Case CPeriod.Week : OPT_PERIOD_WEEK.Checked = True
|
||||
Case CPeriod.Month : OPT_PERIOD_MONTH.Checked = True
|
||||
Case CPeriod.Year : OPT_PERIOD_YEAR.Checked = True
|
||||
Case Else : OPT_PERIOD_ALL.Checked = True
|
||||
End Select
|
||||
ChangePeriodEnabled()
|
||||
.EndLoaderOperations()
|
||||
End With
|
||||
Catch ex As Exception
|
||||
MyDefs.InvokeLoaderError(ex)
|
||||
End Try
|
||||
End Sub
|
||||
Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK
|
||||
With MyOptions
|
||||
Select Case True
|
||||
Case OPT_VIEW_MODE_HOT.Checked : .ViewMode = CView.Hot
|
||||
Case OPT_VIEW_MODE_TOP.Checked : .ViewMode = CView.Top
|
||||
Case Else : .ViewMode = CView.New
|
||||
End Select
|
||||
Select Case True
|
||||
Case OPT_PERIOD_HOUR.Checked : .ViewPeriod = CPeriod.Hour
|
||||
Case OPT_PERIOD_DAY.Checked : .ViewPeriod = CPeriod.Day
|
||||
Case OPT_PERIOD_WEEK.Checked : .ViewPeriod = CPeriod.Week
|
||||
Case OPT_PERIOD_MONTH.Checked : .ViewPeriod = CPeriod.Month
|
||||
Case OPT_PERIOD_YEAR.Checked : .ViewPeriod = CPeriod.Year
|
||||
Case Else : .ViewPeriod = CPeriod.All
|
||||
End Select
|
||||
End With
|
||||
MyDefs.CloseForm()
|
||||
End Sub
|
||||
Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel
|
||||
MyDefs.CloseForm(DialogResult.Cancel)
|
||||
End Sub
|
||||
Private Sub OPT_VIEW_MODE_NEW_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_VIEW_MODE_NEW.CheckedChanged
|
||||
ChangePeriodEnabled()
|
||||
End Sub
|
||||
Private Sub OPT_VIEW_MODE_HOT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_VIEW_MODE_HOT.CheckedChanged
|
||||
ChangePeriodEnabled()
|
||||
End Sub
|
||||
Private Sub OPT_VIEW_MODE_TOP_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_VIEW_MODE_TOP.CheckedChanged
|
||||
ChangePeriodEnabled()
|
||||
End Sub
|
||||
Private Sub ChangePeriodEnabled()
|
||||
TP_PERIOD.Enabled = OPT_VIEW_MODE_TOP.Checked
|
||||
End Sub
|
||||
End Class
|
||||
End Namespace
|
||||
@@ -14,7 +14,7 @@ Imports PersonalUtilities.Functions.RegularExpressions
|
||||
Imports DownDetector = SCrawler.API.Base.DownDetector
|
||||
Imports Download = SCrawler.Plugin.ISiteSettings.Download
|
||||
Namespace API.Reddit
|
||||
<Manifest(RedditSiteKey), UseClassAsIs, SavedPosts>
|
||||
<Manifest(RedditSiteKey), UseClassAsIs, SavedPosts, SpecialForm(False)>
|
||||
Friend Class SiteSettings : Inherits SiteSettingsBase
|
||||
Friend Overrides ReadOnly Property Icon As Icon
|
||||
Get
|
||||
@@ -93,5 +93,11 @@ Namespace API.Reddit
|
||||
Friend Overrides Function GetSpecialDataF(ByVal URL As String) As IEnumerable(Of UserMedia)
|
||||
Return UserData.GetVideoInfo(URL, Responser)
|
||||
End Function
|
||||
Friend Overrides Sub UserOptions(ByRef Options As Object, ByVal OpenForm As Boolean)
|
||||
If Options Is Nothing OrElse Not TypeOf Options Is RedditViewExchange Then Options = New RedditViewExchange
|
||||
If OpenForm Then
|
||||
Using f As New RedditViewSettingsForm(Options) : f.ShowDialog() : End Using
|
||||
End If
|
||||
End Sub
|
||||
End Class
|
||||
End Namespace
|
||||
@@ -14,10 +14,13 @@ Imports PersonalUtilities.Tools.WebDocuments.JSON
|
||||
Imports System.Net
|
||||
Imports System.Threading
|
||||
Imports SCrawler.API.Base
|
||||
Imports SCrawler.API.Reddit.RedditViewExchange
|
||||
Imports UStates = SCrawler.API.Base.UserMedia.States
|
||||
Imports UTypes = SCrawler.API.Base.UserMedia.Types
|
||||
Imports CView = SCrawler.API.Reddit.IRedditView.View
|
||||
Imports CPeriod = SCrawler.API.Reddit.IRedditView.Period
|
||||
Namespace API.Reddit
|
||||
Friend Class UserData : Inherits UserDataBase : Implements IChannelData
|
||||
Friend Class UserData : Inherits UserDataBase : Implements IChannelData, IRedditView
|
||||
Private ReadOnly Property MySiteSettings As SiteSettings
|
||||
Get
|
||||
Return DirectCast(HOST.Source, SiteSettings)
|
||||
@@ -60,6 +63,41 @@ Namespace API.Reddit
|
||||
Select c.Post) Else Return Nothing
|
||||
End Function
|
||||
#End Region
|
||||
#Region "IRedditView Support"
|
||||
Friend Property ViewMode As CView Implements IRedditView.ViewMode
|
||||
Friend Property ViewPeriod As CPeriod Implements IRedditView.ViewPeriod
|
||||
Friend Sub SetView(ByVal Options As IRedditView) Implements IRedditView.SetView
|
||||
If Not Options Is Nothing Then
|
||||
ViewMode = Options.ViewMode
|
||||
ViewPeriod = Options.ViewPeriod
|
||||
End If
|
||||
End Sub
|
||||
Private ReadOnly Property View As String
|
||||
Get
|
||||
Select Case ViewMode
|
||||
Case CView.Hot : Return "hot"
|
||||
Case CView.Top : Return "top"
|
||||
Case Else : Return "new"
|
||||
End Select
|
||||
End Get
|
||||
End Property
|
||||
Private ReadOnly Property Period As String
|
||||
Get
|
||||
If ViewMode = CView.Top Then
|
||||
Select Case ViewPeriod
|
||||
Case CPeriod.Hour : Return "hour"
|
||||
Case CPeriod.Day : Return "day"
|
||||
Case CPeriod.Week : Return "week"
|
||||
Case CPeriod.Month : Return "month"
|
||||
Case CPeriod.Year : Return "year"
|
||||
Case Else : Return "all"
|
||||
End Select
|
||||
Else
|
||||
Return "all"
|
||||
End If
|
||||
End Get
|
||||
End Property
|
||||
#End Region
|
||||
#Region "Initializer"
|
||||
Friend Sub New()
|
||||
ChannelPostsNames = New List(Of String)
|
||||
@@ -69,6 +107,21 @@ Namespace API.Reddit
|
||||
#End Region
|
||||
#Region "Load and Update user info"
|
||||
Protected Overrides Sub LoadUserInformation_OptionalFields(ByRef Container As XmlFile, ByVal Loading As Boolean)
|
||||
With Container
|
||||
If Loading Then
|
||||
ViewMode = .Value(Name_ViewMode).FromXML(Of Integer)(CInt(CView.New))
|
||||
ViewPeriod = .Value(Name_ViewPeriod).FromXML(Of Integer)(CInt(CPeriod.All))
|
||||
Else
|
||||
.Add(Name_ViewMode, CInt(ViewMode))
|
||||
.Add(Name_ViewPeriod, CInt(ViewPeriod))
|
||||
End If
|
||||
End With
|
||||
End Sub
|
||||
Friend Overrides Function ExchangeOptionsGet() As Object
|
||||
Return New RedditViewExchange With {.ViewMode = ViewMode, .ViewPeriod = ViewPeriod}
|
||||
End Function
|
||||
Friend Overrides Sub ExchangeOptionsSet(ByVal Obj As Object)
|
||||
If Not Obj Is Nothing AndAlso TypeOf Obj Is IRedditView Then SetView(DirectCast(Obj, IRedditView))
|
||||
End Sub
|
||||
#End Region
|
||||
#Region "Download Overrides"
|
||||
@@ -80,6 +133,7 @@ Namespace API.Reddit
|
||||
Responser = New Response
|
||||
Responser.Copy(MySiteSettings.Responser)
|
||||
ChannelPostsNames.ListAddList(ChannelInfo.PostsAll.Select(Function(p) p.ID), LNC)
|
||||
If Not ViewMode = CView.New Then ChannelPostsNames.ListAddList(ChannelInfo.PostsNames, LNC)
|
||||
If SkipExistsUsers Then _ExistsUsersNames.ListAddList(Settings.UsersList.Select(Function(p) p.Name), LNC)
|
||||
DownloadDataF(Token)
|
||||
ReparseVideo(Token)
|
||||
@@ -133,7 +187,7 @@ Namespace API.Reddit
|
||||
Dim UPicType As Func(Of String, UTypes) = Function(input) IIf(input = "image", UTypes.Picture, UTypes.GIF)
|
||||
Dim _PostID As Func(Of String) = Function() IIf(PostTmp.IsEmptyString, PostID, PostTmp)
|
||||
|
||||
URL = $"https://gateway.reddit.com/desktopapi/v1/user/{Name}/posts?rtj=only&allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic"
|
||||
URL = $"https://gateway.reddit.com/desktopapi/v1/user/{Name}/posts?rtj=only&allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort={View}&t={Period}&layout=classic"
|
||||
ThrowAny(Token)
|
||||
Dim r$ = Responser.GetResponse(URL,, EDP.ThrowException)
|
||||
If Not r.IsEmptyString Then
|
||||
@@ -241,7 +295,7 @@ Namespace API.Reddit
|
||||
If IsSavedPosts Then
|
||||
URL = $"https://www.reddit.com/user/{Name}/saved.json?after={POST}"
|
||||
Else
|
||||
URL = $"https://reddit.com/r/{Name}/new.json?allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic"
|
||||
URL = $"https://reddit.com/r/{Name}/{View}.json?allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort={View}&t={Period}&layout=classic"
|
||||
End If
|
||||
|
||||
ThrowAny(Token)
|
||||
@@ -258,10 +312,13 @@ Namespace API.Reddit
|
||||
PostID = s.Value("name")
|
||||
If PostID.IsEmptyString AndAlso s.Contains("id") Then PostID = s("id").Value
|
||||
|
||||
If ChannelPostsNames.Contains(PostID) Then ExistsDetected = True : Continue For 'Exit Sub
|
||||
If ChannelPostsNames.Contains(PostID) Then
|
||||
If ViewMode = CView.New Then ExistsDetected = True Else NewPostDetected = True 'bypass
|
||||
Continue For 'Exit Sub
|
||||
End If
|
||||
If DownloadLimitCount.HasValue AndAlso _TotalPostsDownloaded >= DownloadLimitCount.Value Then Exit Sub
|
||||
If Not DownloadLimitPost.IsEmptyString AndAlso DownloadLimitPost = PostID Then Exit Sub
|
||||
If DownloadLimitDate.HasValue AndAlso _TempMediaList.Count > 0 Then
|
||||
If ViewMode = CView.New AndAlso DownloadLimitDate.HasValue AndAlso _TempMediaList.Count > 0 Then
|
||||
With (From __u In _TempMediaList Where __u.Post.Date.HasValue Select __u.Post.Date.Value)
|
||||
If .Count > 0 Then lDate = .Min Else lDate = Nothing
|
||||
End With
|
||||
|
||||
@@ -160,7 +160,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
||||
CMB_CHANNELS.Buttons.AddRange({CmbDefaultButtons.Refresh, CmbDefaultButtons.Add, CmbDefaultButtons.Delete,
|
||||
New ActionButton(CmbDefaultButtons.Up) With {.ToolTipText = "Previous item (F1)"},
|
||||
New ActionButton(CmbDefaultButtons.Down) With {.ToolTipText = "Next item (F4)"},
|
||||
CmbDefaultButtons.Info})
|
||||
CmbDefaultButtons.Edit, CmbDefaultButtons.Info})
|
||||
TXT_LIMIT = New TextBoxExtended With {
|
||||
.CaptionText = "Limit",
|
||||
.Margin = New Padding(2),
|
||||
@@ -279,7 +279,6 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
||||
End With
|
||||
CMB_CHANNELS.EndUpdate()
|
||||
End Sub
|
||||
#Region "Images refill methods"
|
||||
Private Sub AppendPendingUsers()
|
||||
If LIST_POSTS.CheckedIndices.Count > 0 Then
|
||||
Dim c As Channel = GetCurrentChannel(False)
|
||||
@@ -311,7 +310,6 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
||||
End With
|
||||
Return s
|
||||
End Function
|
||||
#End Region
|
||||
#Region "Toolbar controls"
|
||||
#Region "Downloader"
|
||||
Private TokenSource As CancellationTokenSource
|
||||
@@ -543,10 +541,12 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
||||
LBL_LIMIT_TEXT.Text = String.Empty
|
||||
If Not c Is Nothing Then
|
||||
Settings.LatestSelectedChannel.Value = c.ID
|
||||
Dim d As Date?
|
||||
If c.ViewMode = IRedditView.View.New Then
|
||||
With c.PostsAll
|
||||
If .Count > 0 Then
|
||||
OPT_LIMITS_DEFAULT.Checked = True
|
||||
Dim d As Date? = .FirstOrDefault(Function(p) p.Date.HasValue).Date
|
||||
d = .FirstOrDefault(Function(p) p.Date.HasValue).Date
|
||||
If d.HasValue Then
|
||||
LBL_LIMIT_TEXT.Text = $"to date {AConvert(Of String)(d, ADateTime.Formats.BaseDateTime, String.Empty)}"
|
||||
Else
|
||||
@@ -558,6 +558,13 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
||||
LBL_LIMIT_TEXT.Text = $"first {TXT_LIMIT.Text} posts"
|
||||
End If
|
||||
End With
|
||||
Else
|
||||
OPT_LIMITS_DEFAULT.Checked = True
|
||||
d = c.LatestParsedDate
|
||||
Dim per$ = IIf(c.ViewMode = IRedditView.View.Top, c.ViewPeriod.ToString, String.Empty)
|
||||
If Not per.IsEmptyString Then per = $" ({per})"
|
||||
LBL_LIMIT_TEXT.Text = $"[{c.ViewMode}{per}] to date {AConvert(Of String)(d, ADateTime.Formats.BaseDateTime, String.Empty)}"
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
Private Sub CMB_CHANNELS_ActionSelectedItemChanged(ByVal _Item As ListViewItem) Handles CMB_CHANNELS.ActionSelectedItemChanged
|
||||
@@ -582,6 +589,18 @@ Friend Class ChannelViewForm : Implements IChannelLimits
|
||||
End Try
|
||||
Case CmbDefaultButtons.Up : ChangeComboIndex(-1)
|
||||
Case CmbDefaultButtons.Down : ChangeComboIndex(1)
|
||||
Case CmbDefaultButtons.Edit
|
||||
Try
|
||||
c = GetCurrentChannel()
|
||||
If Not c Is Nothing Then
|
||||
Using f As New RedditViewSettingsForm(c)
|
||||
f.ShowDialog()
|
||||
If f.DialogResult = DialogResult.OK Then c.Save()
|
||||
End Using
|
||||
End If
|
||||
Catch ex As Exception
|
||||
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on trying to edit channel")
|
||||
End Try
|
||||
Case CmbDefaultButtons.Info
|
||||
Try
|
||||
c = GetCurrentChannel()
|
||||
|
||||
@@ -94,11 +94,13 @@ Friend Class ListImagesLoader
|
||||
Else
|
||||
Dim t As New List(Of Task)
|
||||
For Each User As IUserData In Settings.Users
|
||||
If User.FitToAddParams Then
|
||||
If Settings.ViewModeIsPicture Then
|
||||
t.Add(Task.Run(Sub() UpdateUser(User, True)))
|
||||
Else
|
||||
UpdateUser(User, True)
|
||||
End If
|
||||
End If
|
||||
Next
|
||||
If t.Count > 0 Then Task.WhenAll(t.ToArray) : t.Clear()
|
||||
End If
|
||||
@@ -177,9 +179,10 @@ Friend Class ListImagesLoader
|
||||
For Each u As IUserData In Settings.Users
|
||||
If u.FitToAddParams Then t.Add(Task.Run(Sub() l.Add(New UserOption(u, MyList, True))))
|
||||
Next
|
||||
If t.Count > 0 Then Task.WaitAll(t.ToArray) : t.Clear()
|
||||
If t.Count > 0 Then Task.WaitAll(t.ToArray)
|
||||
If l.Count > 0 Then
|
||||
For i% = 0 To l.Count - 1
|
||||
If l(i) Is Nothing Then Throw New ArgumentNullException("UserOption", $"One of the UserOptions [{i} / {l.Count - 1}] is null.")
|
||||
If l(i).Image Is Nothing Then l(i).UpdateImage()
|
||||
Next
|
||||
End If
|
||||
|
||||
84
SCrawler/MainFrame.Designer.vb
generated
84
SCrawler/MainFrame.Designer.vb
generated
@@ -29,6 +29,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
Dim MENU_VIEW_SEP_2 As System.Windows.Forms.ToolStripSeparator
|
||||
Dim TRAY_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||
Dim MENU_VIEW_SEP_4 As System.Windows.Forms.ToolStripSeparator
|
||||
Dim MENU_DOWN_ALL_SEP_1 As System.Windows.Forms.ToolStripSeparator
|
||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainFrame))
|
||||
Me.MENU_SETTINGS = New System.Windows.Forms.ToolStripDropDownButton()
|
||||
Me.BTT_SETTINGS = New System.Windows.Forms.ToolStripMenuItem()
|
||||
@@ -41,7 +42,11 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
Me.BTT_CHANNELS = New System.Windows.Forms.ToolStripButton()
|
||||
Me.BTT_DOWN_SAVED = New System.Windows.Forms.ToolStripButton()
|
||||
Me.BTT_DOWN_SELECTED = New System.Windows.Forms.ToolStripButton()
|
||||
Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripButton()
|
||||
Me.MENU_DOWN_ALL = New System.Windows.Forms.ToolStripDropDownButton()
|
||||
Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_DOWN_SITE = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_DOWN_ALL_FULL = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_DOWN_SITE_FULL = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_DOWN_VIDEO = New System.Windows.Forms.ToolStripButton()
|
||||
Me.BTT_DOWN_STOP = New System.Windows.Forms.ToolStripButton()
|
||||
Me.MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton()
|
||||
@@ -74,6 +79,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
Me.USER_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
||||
Me.BTT_CONTEXT_DOWN = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_CONTEXT_DOWN_LIMITED = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_CONTEXT_EDIT = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_CONTEXT_DELETE = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_CONTEXT_FAV = New System.Windows.Forms.ToolStripMenuItem()
|
||||
@@ -91,7 +97,6 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
Me.TRAY_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
||||
Me.BTT_TRAY_SHOW_HIDE = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_TRAY_CLOSE = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT = New System.Windows.Forms.ToolStripMenuItem()
|
||||
SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||
SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
||||
CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||
@@ -107,6 +112,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
MENU_VIEW_SEP_2 = New System.Windows.Forms.ToolStripSeparator()
|
||||
TRAY_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||
MENU_VIEW_SEP_4 = New System.Windows.Forms.ToolStripSeparator()
|
||||
MENU_DOWN_ALL_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
|
||||
Me.Toolbar_TOP.SuspendLayout()
|
||||
Me.Toolbar_BOTTOM.SuspendLayout()
|
||||
Me.USER_CONTEXT.SuspendLayout()
|
||||
@@ -188,6 +194,11 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
MENU_VIEW_SEP_4.Name = "MENU_VIEW_SEP_4"
|
||||
MENU_VIEW_SEP_4.Size = New System.Drawing.Size(141, 6)
|
||||
'
|
||||
'MENU_DOWN_ALL_SEP_1
|
||||
'
|
||||
MENU_DOWN_ALL_SEP_1.Name = "MENU_DOWN_ALL_SEP_1"
|
||||
MENU_DOWN_ALL_SEP_1.Size = New System.Drawing.Size(228, 6)
|
||||
'
|
||||
'MENU_SETTINGS
|
||||
'
|
||||
Me.MENU_SETTINGS.AutoToolTip = False
|
||||
@@ -207,7 +218,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
'Toolbar_TOP
|
||||
'
|
||||
Me.Toolbar_TOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
|
||||
Me.Toolbar_TOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_SETTINGS, SEP_1, Me.BTT_ADD_USER, Me.BTT_EDIT_USER, Me.BTT_DELETE_USER, Me.BTT_REFRESH, Me.BTT_SHOW_INFO, Me.BTT_CHANNELS, Me.BTT_DOWN_SAVED, SEP_2, Me.BTT_DOWN_SELECTED, Me.BTT_DOWN_ALL, Me.BTT_DOWN_VIDEO, Me.BTT_DOWN_STOP, SEP_3, Me.MENU_VIEW, SEP_4, Me.BTT_LOG, Me.BTT_VERSION_INFO, Me.BTT_DONATE})
|
||||
Me.Toolbar_TOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_SETTINGS, SEP_1, Me.BTT_ADD_USER, Me.BTT_EDIT_USER, Me.BTT_DELETE_USER, Me.BTT_REFRESH, Me.BTT_SHOW_INFO, Me.BTT_CHANNELS, Me.BTT_DOWN_SAVED, SEP_2, Me.BTT_DOWN_SELECTED, Me.MENU_DOWN_ALL, Me.BTT_DOWN_VIDEO, Me.BTT_DOWN_STOP, SEP_3, Me.MENU_VIEW, SEP_4, Me.BTT_LOG, Me.BTT_VERSION_INFO, Me.BTT_DONATE})
|
||||
Me.Toolbar_TOP.Location = New System.Drawing.Point(0, 0)
|
||||
Me.Toolbar_TOP.Name = "Toolbar_TOP"
|
||||
Me.Toolbar_TOP.Size = New System.Drawing.Size(934, 25)
|
||||
@@ -285,14 +296,53 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
Me.BTT_DOWN_SELECTED.Text = "Download selected (F5)"
|
||||
Me.BTT_DOWN_SELECTED.ToolTipText = "Download selected user"
|
||||
'
|
||||
'MENU_DOWN_ALL
|
||||
'
|
||||
Me.MENU_DOWN_ALL.AutoToolTip = False
|
||||
Me.MENU_DOWN_ALL.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_DOWN_ALL, Me.BTT_DOWN_SITE, MENU_DOWN_ALL_SEP_1, Me.BTT_DOWN_ALL_FULL, Me.BTT_DOWN_SITE_FULL})
|
||||
Me.MENU_DOWN_ALL.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||
Me.MENU_DOWN_ALL.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||
Me.MENU_DOWN_ALL.Name = "MENU_DOWN_ALL"
|
||||
Me.MENU_DOWN_ALL.Size = New System.Drawing.Size(128, 22)
|
||||
Me.MENU_DOWN_ALL.Text = "Download all (F6)"
|
||||
'
|
||||
'BTT_DOWN_ALL
|
||||
'
|
||||
Me.BTT_DOWN_ALL.AutoToolTip = True
|
||||
Me.BTT_DOWN_ALL.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||
Me.BTT_DOWN_ALL.ImageTransparentColor = System.Drawing.Color.Magenta
|
||||
Me.BTT_DOWN_ALL.Name = "BTT_DOWN_ALL"
|
||||
Me.BTT_DOWN_ALL.Size = New System.Drawing.Size(119, 22)
|
||||
Me.BTT_DOWN_ALL.Size = New System.Drawing.Size(231, 22)
|
||||
Me.BTT_DOWN_ALL.Text = "Download all (F6)"
|
||||
Me.BTT_DOWN_ALL.ToolTipText = "Download all users"
|
||||
Me.BTT_DOWN_ALL.ToolTipText = "Download all users marked 'Ready for download' from all sites."
|
||||
'
|
||||
'BTT_DOWN_SITE
|
||||
'
|
||||
Me.BTT_DOWN_SITE.AutoToolTip = True
|
||||
Me.BTT_DOWN_SITE.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||
Me.BTT_DOWN_SITE.Name = "BTT_DOWN_SITE"
|
||||
Me.BTT_DOWN_SITE.Size = New System.Drawing.Size(231, 22)
|
||||
Me.BTT_DOWN_SITE.Text = "Download all site users"
|
||||
Me.BTT_DOWN_SITE.ToolTipText = "Download all users marked 'Ready for download' from specific sites."
|
||||
'
|
||||
'BTT_DOWN_ALL_FULL
|
||||
'
|
||||
Me.BTT_DOWN_ALL_FULL.AutoToolTip = True
|
||||
Me.BTT_DOWN_ALL_FULL.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||
Me.BTT_DOWN_ALL_FULL.Name = "BTT_DOWN_ALL_FULL"
|
||||
Me.BTT_DOWN_ALL_FULL.Size = New System.Drawing.Size(231, 22)
|
||||
Me.BTT_DOWN_ALL_FULL.Text = "Download all [FULL]"
|
||||
Me.BTT_DOWN_ALL_FULL.ToolTipText = "Download all users from all sites. The 'Ready for download' option will be ignore" &
|
||||
"d."
|
||||
'
|
||||
'BTT_DOWN_SITE_FULL
|
||||
'
|
||||
Me.BTT_DOWN_SITE_FULL.AutoToolTip = True
|
||||
Me.BTT_DOWN_SITE_FULL.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||
Me.BTT_DOWN_SITE_FULL.Name = "BTT_DOWN_SITE_FULL"
|
||||
Me.BTT_DOWN_SITE_FULL.Size = New System.Drawing.Size(231, 22)
|
||||
Me.BTT_DOWN_SITE_FULL.Text = "Download all site users [FULL]"
|
||||
Me.BTT_DOWN_SITE_FULL.ToolTipText = "Download all users from specific sites. The 'Ready for download' option will be i" &
|
||||
"gnored."
|
||||
'
|
||||
'BTT_DOWN_VIDEO
|
||||
'
|
||||
@@ -514,7 +564,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
'
|
||||
Me.USER_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.BTT_CONTEXT_DOWN_LIMITED, Me.BTT_CONTEXT_DOWN_DATE_LIMIT, Me.BTT_CONTEXT_EDIT, Me.BTT_CONTEXT_DELETE, CONTEXT_SEP_1, Me.BTT_CONTEXT_FAV, Me.BTT_CONTEXT_TEMP, Me.BTT_CONTEXT_READY, Me.BTT_CONTEXT_GROUPS, Me.BTT_CONTEXT_ADD_TO_COL, Me.BTT_CONTEXT_COL_MERGE, Me.BTT_CONTEXT_CHANGE_FOLDER, CONTEXT_SEP_2, Me.BTT_CHANGE_IMAGE, CONTEXT_SEP_3, Me.BTT_CONTEXT_OPEN_PATH, CONTEXT_SEP_4, Me.BTT_CONTEXT_OPEN_SITE, CONTEXT_SEP_5, Me.BTT_CONTEXT_INFO})
|
||||
Me.USER_CONTEXT.Name = "USER_CONTEXT"
|
||||
Me.USER_CONTEXT.Size = New System.Drawing.Size(222, 408)
|
||||
Me.USER_CONTEXT.Size = New System.Drawing.Size(222, 386)
|
||||
'
|
||||
'BTT_CONTEXT_DOWN
|
||||
'
|
||||
@@ -532,6 +582,13 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
Me.BTT_CONTEXT_DOWN_LIMITED.Text = "Download data limited"
|
||||
Me.BTT_CONTEXT_DOWN_LIMITED.ToolTipText = "Download top ... posts"
|
||||
'
|
||||
'BTT_CONTEXT_DOWN_DATE_LIMIT
|
||||
'
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Name = "BTT_CONTEXT_DOWN_DATE_LIMIT"
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Size = New System.Drawing.Size(221, 22)
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Text = "Download data to the date"
|
||||
'
|
||||
'BTT_CONTEXT_EDIT
|
||||
'
|
||||
Me.BTT_CONTEXT_EDIT.Image = Global.SCrawler.My.Resources.Resources.PencilPic_01_16
|
||||
@@ -650,13 +707,6 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
Me.BTT_TRAY_CLOSE.Size = New System.Drawing.Size(133, 22)
|
||||
Me.BTT_TRAY_CLOSE.Text = "Close"
|
||||
'
|
||||
'BTT_CONTEXT_DOWN_DATE_LIMIT
|
||||
'
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Name = "BTT_CONTEXT_DOWN_DATE_LIMIT"
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Size = New System.Drawing.Size(221, 22)
|
||||
Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Text = "Download data to the date"
|
||||
'
|
||||
'MainFrame
|
||||
'
|
||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||
@@ -684,7 +734,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
Private WithEvents BTT_ADD_USER As ToolStripButton
|
||||
Private WithEvents BTT_DELETE_USER As ToolStripButton
|
||||
Private WithEvents BTT_DOWN_SELECTED As ToolStripButton
|
||||
Private WithEvents BTT_DOWN_ALL As ToolStripButton
|
||||
Private WithEvents MENU_DOWN_ALL As ToolStripDropDownButton
|
||||
Private WithEvents Toolbar_TOP As ToolStrip
|
||||
Private WithEvents Toolbar_BOTTOM As StatusStrip
|
||||
Private WithEvents PR_MAIN As ToolStripProgressBar
|
||||
@@ -742,4 +792,8 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form
|
||||
Private WithEvents MENU_SETTINGS As ToolStripDropDownButton
|
||||
Private WithEvents BTT_PR_INFO As ToolStripStatusLabel
|
||||
Private WithEvents BTT_CONTEXT_DOWN_DATE_LIMIT As ToolStripMenuItem
|
||||
Private WithEvents BTT_DOWN_ALL As ToolStripMenuItem
|
||||
Private WithEvents BTT_DOWN_SITE As ToolStripMenuItem
|
||||
Private WithEvents BTT_DOWN_ALL_FULL As ToolStripMenuItem
|
||||
Private WithEvents BTT_DOWN_SITE_FULL As ToolStripMenuItem
|
||||
End Class
|
||||
@@ -162,6 +162,9 @@
|
||||
<metadata name="MENU_VIEW_SEP_4.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="MENU_DOWN_ALL_SEP_1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="Toolbar_TOP.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>132, 17</value>
|
||||
</metadata>
|
||||
@@ -306,6 +309,35 @@
|
||||
<metadata name="TRAY_CONTEXT.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>623, 17</value>
|
||||
</metadata>
|
||||
<data name="BTT_TRAY_CLOSE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
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
|
||||
</value>
|
||||
</data>
|
||||
<data name="TrayIcon.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAA
|
||||
@@ -470,35 +502,6 @@
|
||||
AAAAAAAAH/8AAAAAAAA//wAAAAAAAH//AAAAAAAA//8AAAAAAAP//wAAAAAAB///AAAAAAAP//8AAAAA
|
||||
AB///wAAAAAAf///AAAAAAH///8AAAAAB////wAAAAAf////AAAAAP////8AAAAH/////wAAAH//////
|
||||
AAA=
|
||||
</value>
|
||||
</data>
|
||||
<data name="BTT_TRAY_CLOSE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
|
||||
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAVoSURBVEhLhZVrTJNXGMdfrtNSQIoadKRz2o0CorU3
|
||||
WkDIVBRaaGNbwAteh+AARRQlitEYTTRekiX7sH3YPmyZH9wtziybigLRCWTaCW5sCBWhlrb0Ci9zSxbo
|
||||
2f+UliGX7SS/tO85z/k9T57zXhhCCPO7Wh3VIhB83JKQ0Nu4bNlHm5YseZ1hmHC69n+Y5HLFcz7/ft/S
|
||||
pY+vr1hhwL4oEBJcZ0x793If5uZ+1VNfT/qvXCHP6+p8tzMymqRxcW8hMGKqbDo9MlmWddu2AfbiRTJ6
|
||||
+TIZKC52fyAUVi2JiYkLJmGaBYIPnx4+TPrOnCH9p08TC4LNx46RWwrF/ZXR0W/PleRZZuY669atZvbS
|
||||
JcJiL9vQQEZPnSKmwkLPjcTE97GPB8KZlvh4C5X31dWRgRMniAVBtvPnyWB9ve+2XP7jmtjYpOlJTOnp
|
||||
G60lJRZaOZWPQs4ePUpGUZh3xw7SnJDQhT0KEM3c5fOv9paVkX4kMAPL8ePEig1D584RG9rVpFS2rY6J
|
||||
EQaTmKTSjbbiYsvIhQuERTGjKIrFvtHaWjK8fz9plsudexYu/BLxKsBj9ALBGzel0vt9e/b4XiBoENhQ
|
||||
zRDOxIWWOY4cIS0KRZs4Nja5QyLJtRoM1pGzZ/0tYVExi/ayNTVkBPJ76enuJA7nM4j3gVWAHjgTIYqL
|
||||
E96SStvMu3YR64EDxF5dTYYOHSJOJPNA5Kiu9rUrlZ1mrdbCnjzpr5jFGotYtqpqQi6TuVM4nKvwlYHU
|
||||
gDzU31OMSGl8fPJtsbjVsn27z15RQRzAVVlJ3BB4kcx78CAZQbUjVIxrFtd+OdrbmpHhEXG5VE4rTwHz
|
||||
wMRdFDw4jEgFj5dyRyRqsxYVEcfu3cQFPPv2ES8qHEbCYRzgsFZLvO+8Q7xKJXGDVoXCK46Ovob95YBW
|
||||
Ph/8+xwE/wSTyHi81OZVq9qsGs2Ye8sW4srPJy6JhDgTE4kzOpo4IyKIMyyMOLhcX9Py5R4lj0cPtAKs
|
||||
BBwwKfc7p174J5BEhHY9FIk6bBDaIRuiQkDFfsLDSbdU+pdBKPwe8e+BNDBD7vdNn6BYd+6stK5da7bP
|
||||
nz9TDujcoEAw1lJY+CyFz9dCHDubnDJjwltRccS5fr3TjurnlIMBYE5NJY8Nhq7SrCwREsz6xL9y4S4v
|
||||
b3Bt2uSyR0XNkDvQe9ouKu8HvaGh5FfQIxL5OgyG30qUStqmGUkm/3jKy0+48vLcs1XuiI8nL/Ly/rYl
|
||||
JfmovCcgN4JW+l8iGe8oKuoqzcyckSQob3CpVB47l+sXv9KWxYtJt0r1x9ns7HZjQYHNnJxMfoH0EXgA
|
||||
7oFm0CmTjRsNhs6Na9bQF+Tkq57xlJXVu9Rqz9Bs8kWLSG9BwcsqieQONlXnpaaWdul0z7rR+6C8CTSC
|
||||
m8Aol4+36/XGT7VaevCRIIRx6/WWoQULZq2cyveLxY0IrAT0IHm1OTmZT3Q6U2da2qT8B/Ad+BZ05OSM
|
||||
GXW6p4hdBiIZZ1FRt5vPn6vyuwiqCsj9Xyq6qXbDBkWnXm/6OS3NN1X+dUgIeZSdPXZPoxlEXC6IY9pL
|
||||
S7faNBqXC9Iplf95YBb5ZF+RpGbdunQcbO/D1avJ9YC8LT19/Iv8/BeqpKRPEDORAGNeY3HxSYtG43Eq
|
||||
FL5etfpljUzWhPlZ5VOTlGVliR+hHUbs+0mpHP9GpRqM5XAuY20zmGgRRohYKIx9rNd/3qfTOa7l5uLu
|
||||
C63BvARw6fp0eRCMyBslJe8+2bx58EFhoVMlFNJvgQ4kgggQEgykvV0ApEAd+J3z8Z8KxmuA3pr0zikA
|
||||
b4LJZ2FqYBigFdOPNf0NC679Fxi0OPr+XxiAJgwURph/AJfOQQebMR8TAAAAAElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
|
||||
@@ -311,9 +311,44 @@ CloseResume:
|
||||
Private Sub BTT_DOWN_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_SELECTED.Click
|
||||
DownloadSelectedUser(DownUserLimits.None)
|
||||
End Sub
|
||||
#Region "Download all"
|
||||
Private Sub BTT_DOWN_ALL_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_ALL.Click
|
||||
Downloader.AddRange(Settings.Users.Where(Function(u) u.ReadyForDownload))
|
||||
End Sub
|
||||
Private Sub BTT_DOWN_SITE_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_SITE.Click
|
||||
DownloadSiteFull(True)
|
||||
End Sub
|
||||
Private Sub BTT_DOWN_ALL_FULL_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_ALL_FULL.Click
|
||||
Downloader.AddRange(Settings.Users)
|
||||
End Sub
|
||||
Private Sub BTT_DOWN_SITE_FULL_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_SITE_FULL.Click
|
||||
DownloadSiteFull(False)
|
||||
End Sub
|
||||
Private Sub DownloadSiteFull(ByVal ReadyForDownloadOnly As Boolean)
|
||||
Using f As New SiteSelectionForm(Settings.LatestDownloadedSites.ValuesList)
|
||||
f.ShowDialog()
|
||||
If f.DialogResult = DialogResult.OK Then
|
||||
Settings.LatestDownloadedSites.Clear()
|
||||
Settings.LatestDownloadedSites.AddRange(f.SelectedSites)
|
||||
Settings.LatestDownloadedSites.Update()
|
||||
If f.SelectedSites.Count > 0 Then
|
||||
Downloader.AddRange(Settings.Users.SelectMany(Function(ByVal u As IUserData) As IEnumerable(Of IUserData)
|
||||
If u.IsCollection Then
|
||||
Return DirectCast(u, UserDataBind).Collections.
|
||||
Where(Function(uu) f.SelectedSites.Contains(uu.Site) And
|
||||
(Not ReadyForDownloadOnly Or uu.ReadyForDownload))
|
||||
ElseIf f.SelectedSites.Contains(u.Site) And
|
||||
(Not ReadyForDownloadOnly Or u.ReadyForDownload) Then
|
||||
Return {u}
|
||||
Else
|
||||
Return New IUserData() {}
|
||||
End If
|
||||
End Function))
|
||||
End If
|
||||
End If
|
||||
End Using
|
||||
End Sub
|
||||
#End Region
|
||||
Private Sub BTT_DOWN_VIDEO_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_VIDEO.Click
|
||||
DownloadVideoByURL()
|
||||
End Sub
|
||||
@@ -361,6 +396,7 @@ CloseResume:
|
||||
#Region "View Site"
|
||||
Private Sub BTT_SITE_ALL_Click(sender As Object, e As EventArgs) Handles BTT_SITE_ALL.Click
|
||||
Settings.SelectedSites.Clear()
|
||||
Settings.SelectedSites.Update()
|
||||
If Not BTT_SITE_ALL.Checked Then RefillList()
|
||||
BTT_SITE_ALL.Checked = True
|
||||
BTT_SITE_SPECIFIC.Checked = False
|
||||
@@ -371,6 +407,7 @@ CloseResume:
|
||||
If f.DialogResult = DialogResult.OK Then
|
||||
Settings.SelectedSites.Clear()
|
||||
Settings.SelectedSites.AddRange(f.SelectedSites)
|
||||
Settings.SelectedSites.Update()
|
||||
BTT_SITE_SPECIFIC.Checked = Settings.SelectedSites.Count > 0
|
||||
BTT_SITE_ALL.Checked = Settings.SelectedSites.Count = 0
|
||||
RefillList()
|
||||
|
||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
||||
' by using the '*' as shown below:
|
||||
' <Assembly: AssemblyVersion("1.0.*")>
|
||||
|
||||
<Assembly: AssemblyVersion("3.0.0.2")>
|
||||
<Assembly: AssemblyFileVersion("3.0.0.2")>
|
||||
<Assembly: AssemblyVersion("3.0.0.5")>
|
||||
<Assembly: AssemblyFileVersion("3.0.0.5")>
|
||||
<Assembly: NeutralResourcesLanguage("en")>
|
||||
|
||||
@@ -6,10 +6,12 @@
|
||||
'
|
||||
' This program is distributed in the hope that it will be useful,
|
||||
' but WITHOUT ANY WARRANTY
|
||||
Imports SCrawler.API.Base
|
||||
Imports PersonalUtilities.Functions.XML
|
||||
Imports SCrawler.API.Base
|
||||
Imports System.Threading
|
||||
Imports System.Reflection
|
||||
Imports UStates = SCrawler.Plugin.PluginUserMedia.States
|
||||
Imports UTypes = SCrawler.Plugin.PluginUserMedia.Types
|
||||
Namespace Plugin.Hosts
|
||||
Friend Class UserDataHost : Inherits UserDataBase
|
||||
Private ReadOnly UseInternalDownloader As Boolean
|
||||
@@ -67,7 +69,7 @@ Namespace Plugin.Hosts
|
||||
|
||||
If Not .Name = Name Then Name = .Name
|
||||
ID = .ID
|
||||
UserDescription = .UserDescription
|
||||
UserDescriptionUpdate(.UserDescription)
|
||||
UserExists = .UserExists
|
||||
UserSuspended = .UserSuspended
|
||||
End With
|
||||
@@ -84,7 +86,13 @@ Namespace Plugin.Hosts
|
||||
.TempMediaList.ListAddList(_ContentNew.Select(Function(c) c.PluginUserMedia()))
|
||||
.Download()
|
||||
_ContentNew.Clear()
|
||||
If .TempMediaList.ListExists Then _ContentNew.ListAddList(.TempMediaList.Select(Function(c) New UserMedia(c)))
|
||||
If .TempMediaList.ListExists Then
|
||||
_ContentNew.ListAddList(.TempMediaList.Select(Function(c) New UserMedia(c)))
|
||||
DownloadedPictures(False) = .TempMediaList.LongCount(Function(m) m.DownloadState = UStates.Downloaded And
|
||||
(m.ContentType = UTypes.Picture Or m.ContentType = UTypes.GIF))
|
||||
DownloadedVideos(False) = .TempMediaList.LongCount(Function(m) m.DownloadState = UStates.Downloaded And
|
||||
(m.ContentType = UTypes.Video Or m.ContentType = UTypes.m3u8))
|
||||
End If
|
||||
End With
|
||||
End If
|
||||
End Sub
|
||||
|
||||
@@ -147,6 +147,13 @@
|
||||
<Compile Include="API\Instagram\OptionsForm.vb">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="API\Reddit\RedditViewSettingsForm.Designer.vb">
|
||||
<DependentUpon>RedditViewSettingsForm.vb</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="API\Reddit\RedditViewSettingsForm.vb">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="API\Reddit\IRedditView.vb" />
|
||||
<Compile Include="Download\ActiveDownloadingProgress.Designer.vb">
|
||||
<DependentUpon>ActiveDownloadingProgress.vb</DependentUpon>
|
||||
</Compile>
|
||||
@@ -289,6 +296,9 @@
|
||||
<EmbeddedResource Include="API\Instagram\OptionsForm.resx">
|
||||
<DependentUpon>OptionsForm.vb</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="API\Reddit\RedditViewSettingsForm.resx">
|
||||
<DependentUpon>RedditViewSettingsForm.vb</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Channels\ChannelsStatsForm.resx">
|
||||
<DependentUpon>ChannelsStatsForm.vb</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
|
||||
@@ -76,6 +76,7 @@ Friend Class SettingsCLS : Implements IDisposable
|
||||
LatestSelectedChannel = New XMLValue(Of String)("LatestSelectedChannel",, MyXML)
|
||||
LastUpdatedLimit = New XMLValue(Of Date)
|
||||
LastUpdatedLimit.SetExtended("LastUpdatedLimit",, MyXML)
|
||||
LatestDownloadedSites = New XMLValuesCollection(Of String)(XMLValueBase.ListModes.String, "LatestDownloadedSites", MyXML)
|
||||
|
||||
SelectedSites = New XMLValuesCollection(Of String)(XMLValueBase.ListModes.String, "SelectedSites", MyXML, {Name_Node_Sites})
|
||||
|
||||
@@ -253,22 +254,18 @@ Friend Class SettingsCLS : Implements IDisposable
|
||||
If indx < 0 Then .Protected = True
|
||||
End If
|
||||
End If
|
||||
.UpdateUserFile()
|
||||
End With
|
||||
.Item(i) = user
|
||||
Next
|
||||
If c Then UpdateUsersList()
|
||||
End If
|
||||
.Clear()
|
||||
Using x As New XmlFile(UsersSettingsFile, Protector.Modes.All, False) With {.AllowSameNames = True}
|
||||
x.LoadData()
|
||||
If x.Count > 0 Then
|
||||
For i = 0 To x.Count - 1
|
||||
user = x(i)
|
||||
Else
|
||||
For i = 0 To .Count - 1
|
||||
user = .Item(i)
|
||||
user.UpdateUserFile()
|
||||
.Add(user)
|
||||
.Item(i) = user
|
||||
Next
|
||||
End If
|
||||
End Using
|
||||
End With
|
||||
End Sub
|
||||
Private _UserListUpdateRequired As Boolean = False
|
||||
@@ -410,6 +407,7 @@ Friend Class SettingsCLS : Implements IDisposable
|
||||
Friend ReadOnly Property LatestSavingPath As XMLValue(Of SFile)
|
||||
Friend ReadOnly Property LatestSelectedLabels As XMLValue(Of String)
|
||||
Friend ReadOnly Property LatestSelectedChannel As XMLValue(Of String)
|
||||
Friend ReadOnly Property LatestDownloadedSites As XMLValuesCollection(Of String)
|
||||
#End Region
|
||||
#Region "Channels properties"
|
||||
Friend ReadOnly Property ChannelsDefaultReadyForDownload As XMLValue(Of Boolean)
|
||||
|
||||
19
Tools/NET.FrameworkVersion.ps1
Normal file
19
Tools/NET.FrameworkVersion.ps1
Normal file
@@ -0,0 +1,19 @@
|
||||
$arr=Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\|Select-Object Name
|
||||
$mv=0
|
||||
$found=0
|
||||
foreach($v in $arr){if($v.Name -match "v4.0."){$mv=$v.Name}}
|
||||
if($mv -ne 0)
|
||||
{
|
||||
$arr=Get-ChildItem -Path Registry::"$mv\SKUs\"|Select-Object Name
|
||||
if($arr.Count -ge 0)
|
||||
{
|
||||
foreach($v in $arr){if($v.Name -match "v4.6.1"){$found=1}}
|
||||
}
|
||||
}
|
||||
if($found -eq 0)
|
||||
{
|
||||
$a=Read-Host -Prompt "NET.Framework v4.6.1 not installed. Would you like to go to the Microsoft site to download this version? (y/n)"
|
||||
if($a -eq "y"){Start https://dotnet.microsoft.com/en-us/download/dotnet-framework/net461}
|
||||
}
|
||||
else
|
||||
{Read-Host "NET.Framework v4.6.1 installed. Press Enter to close."}
|
||||
Reference in New Issue
Block a user