From 94edf23570d3a4f7da8d8bead3487b125c4b99c2 Mon Sep 17 00:00:00 2001 From: Andy <88590076+AAndyProgram@users.noreply.github.com> Date: Thu, 11 Jan 2024 23:39:56 +0300 Subject: [PATCH] 2024.1.12.0 DownloadFeedForm: add an option to create a new feed when adding checked items; add a prompt before clearing the current session MainFrame: add scheduler to tray menu API.Instagram: fix tagged posts downloading API.xHamster: fix profiles downloading; add creators downloading API.YouTube: add error to log (communities) --- Changelog.md | 16 +++ SCrawler/API/Base/UserDataBase.vb | 2 +- SCrawler/API/Instagram/SiteSettings.vb | 5 +- SCrawler/API/Instagram/UserData.vb | 18 ++- SCrawler/API/OnlyFans/SiteSettings.vb | 3 +- SCrawler/API/Xhamster/SiteSettings.vb | 23 +++- SCrawler/API/Xhamster/UserData.vb | 38 ++++-- SCrawler/API/YouTube/UserData.vb | 7 +- .../Feed/DownloadFeedForm.Designer.vb | 121 +++++++++--------- SCrawler/Download/Feed/DownloadFeedForm.resx | 9 +- SCrawler/Download/Feed/DownloadFeedForm.vb | 18 ++- SCrawler/MainFrame.Designer.vb | 13 +- SCrawler/MainFrame.vb | 2 +- SCrawler/My Project/AssemblyInfo.vb | 4 +- 14 files changed, 176 insertions(+), 103 deletions(-) diff --git a/Changelog.md b/Changelog.md index 920162d..63d9cb0 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,19 @@ +# 2024.1.12.0 + +*2024-01-12* + +- Added + - Feed: added a prompt before clearing the current session + - xHamster: creators + - YouTube communities: add error to log + - Added scheduler to tray menu + - Other improvements +- Fixed + - Feed: there is no option to create a new feed when adding checked items + - **Instagram**: downloading of tagged posts + - xHamster: profiles are not downloading + - Minor bugs + # 2023.12.27.0 *2023-12-27* diff --git a/SCrawler/API/Base/UserDataBase.vb b/SCrawler/API/Base/UserDataBase.vb index eae3aab..01aa977 100644 --- a/SCrawler/API/Base/UserDataBase.vb +++ b/SCrawler/API/Base/UserDataBase.vb @@ -1403,7 +1403,7 @@ BlockNullPicture: End If ff.Name &= "_thumb" ff.Extension = "jpg" - f = Web.FFMPEG.TakeSnapshot(f, ff, Settings.FfmpegFile, TimeSpan.FromSeconds(1),,, EDP.LogMessageValue) + f = Web.FFMPEG.TakeSnapshot(f, ff, Settings.FfmpegFile, TimeSpan.FromSeconds(1),,, EDP.SendToLog + EDP.ReturnValue) If f.Exists Then DirectCast(Data, IDownloadableMedia).ThumbnailFile = f End If Else diff --git a/SCrawler/API/Instagram/SiteSettings.vb b/SCrawler/API/Instagram/SiteSettings.vb index 071130d..4bd4f71 100644 --- a/SCrawler/API/Instagram/SiteSettings.vb +++ b/SCrawler/API/Instagram/SiteSettings.vb @@ -63,8 +63,6 @@ Namespace API.Instagram Friend Const Header_Browser As String = "Sec-Ch-Ua" Friend Const Header_BrowserExt As String = "Sec-Ch-Ua-Full-Version-List" Friend Const Header_Platform As String = "Sec-Ch-Ua-Platform-Version" - - Friend ReadOnly Property HashTagged As PropertyValue Friend ReadOnly Property HH_CSRF_TOKEN As PropertyValue @@ -236,7 +234,6 @@ Namespace API.Instagram .CookiesExtractedAutoSave = False End With - HashTagged = New PropertyValue(String.Empty, GetType(String)) HH_CSRF_TOKEN = New PropertyValue(token, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_CSRF_TOKEN), v)) HH_IG_APP_ID = New PropertyValue(app_id, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_IG_APP_ID), v)) HH_ASBD_ID = New PropertyValue(asbd, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_ASBD_ID), v)) @@ -249,7 +246,7 @@ Namespace API.Instagram DownloadTimeline = New PropertyValue(True) DownloadStories = New PropertyValue(True) DownloadStoriesUser = New PropertyValue(True) - DownloadTagged = New PropertyValue(False) + DownloadTagged = New PropertyValue(True) RequestsWaitTimer = New PropertyValue(1000) RequestsWaitTimerProvider = New TimersChecker(100) diff --git a/SCrawler/API/Instagram/UserData.vb b/SCrawler/API/Instagram/UserData.vb index 15b3b69..d7f12dc 100644 --- a/SCrawler/API/Instagram/UserData.vb +++ b/SCrawler/API/Instagram/UserData.vb @@ -255,7 +255,12 @@ Namespace API.Instagram If Not IsSavedPosts AndAlso MySiteSettings.BaseAuthExists() Then 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.DownloadTagged.Value) And ACheck(MySiteSettings.HashTagged.Value) And GetTaggedData Then s = Sections.Tagged : DownloadData(String.Empty, s, Token) : ProgressPre.Done() + If CBool(MySiteSettings.DownloadTagged.Value) And GetTaggedData Then + s = Sections.Tagged + DownloadData(String.Empty, s, Token) + ProgressPre.Done() + If PostsToReparse.Count > 0 Then DownloadPosts(Token, True) + End If End If If WaitNotificationMode = WNM.SkipTemp Or WaitNotificationMode = WNM.SkipCurrent Then WaitNotificationMode = WNM.Notify Catch eex As ExitException @@ -460,12 +465,10 @@ Namespace API.Instagram SavedPostsDownload(String.Empty, Token) Exit Sub Case Sections.Tagged - Dim h$ = AConvert(Of String)(MySiteSettings.HashTagged.Value, String.Empty) - If h.IsEmptyString Then Throw New ExitException Dim vars$ = "{""id"":" & ID & ",""first"":50,""after"":""" & Cursor & """}" vars = SymbolsConverter.ASCII.EncodeSymbolsOnly(vars) - URL = $"https://www.instagram.com/graphql/query/?query_hash={h}&variables={vars}" - ENode = {"data", "user", 0} + URL = $"https://www.instagram.com/graphql/query/?doc_id=17946422347485809&variables={vars}" + ENode = {"data", "user", "edge_user_to_photos_of_you"} SpecFolder = TaggedFolder Case Sections.Stories If Not StoriesRequested Then @@ -581,11 +584,12 @@ Namespace API.Instagram ProcessException(DoEx, Token, $"data downloading error [{URL}]",, Section) End Try End Sub - Private Sub DownloadPosts(ByVal Token As CancellationToken) + Private Sub DownloadPosts(ByVal Token As CancellationToken, Optional ByVal IsTagged As Boolean = False) Dim URL$ = String.Empty Dim dValue% = 1 Dim _Index% = 0 Dim before% + Dim specFolder$ = IIf(IsTagged, "Tagged", String.Empty) If PostsToReparse.Count > 0 Then ProgressPre.ChangeMax(PostsToReparse.Count) Try Do While dValue = 1 @@ -616,7 +620,7 @@ Namespace API.Instagram With j("items") For Each jj In .Self before = _TempMediaList.Count - ObtainMedia(jj, PostsToReparse(i).ID) + ObtainMedia(jj, PostsToReparse(i).ID, specFolder) If Not before = _TempMediaList.Count Then _TotalPostsParsed += 1 If _Limit > 0 And _TotalPostsParsed >= _Limit Then Throw New ExitException Next diff --git a/SCrawler/API/OnlyFans/SiteSettings.vb b/SCrawler/API/OnlyFans/SiteSettings.vb index 8fab91d..69301a9 100644 --- a/SCrawler/API/OnlyFans/SiteSettings.vb +++ b/SCrawler/API/OnlyFans/SiteSettings.vb @@ -148,7 +148,8 @@ Namespace API.OnlyFans DownloadChatMedia = New PropertyValue(True) LastDateUpdated_XML = New PropertyValue(Now.AddYears(-1), GetType(Date)) - UseOldAuthRules = New PropertyValue(False) + 'URGENT: OF [UseOldAuthRules = True] + UseOldAuthRules = New PropertyValue(True) DynamicRulesUpdateInterval = New PropertyValue(60 * 24) DynamicRulesUpdateIntervalProvider = New FieldsCheckerProviderSimple(Function(v) IIf(AConvert(Of Integer)(v, 0) > 0, v, Nothing), "The value of [{0}] field must be greater than 0") diff --git a/SCrawler/API/Xhamster/SiteSettings.vb b/SCrawler/API/Xhamster/SiteSettings.vb index 1921f4b..62173c9 100644 --- a/SCrawler/API/Xhamster/SiteSettings.vb +++ b/SCrawler/API/Xhamster/SiteSettings.vb @@ -46,7 +46,7 @@ Namespace API.Xhamster _SubscriptionsAllowed = True UrlPatternUser = "https://xhamster.com/{0}/{1}" - UserRegex = RParams.DMS($"/({UserOption}|{ChannelOption})/([^/]+)(\Z|.*)", 0, RegexReturn.ListByMatch) + UserRegex = RParams.DMS($"/({UserOption}|{ChannelOption}|{P_Creators})/([^/]+)(\Z|.*)", 0, RegexReturn.ListByMatch) ImageVideoContains = "xhamster" End Sub Friend Overrides Sub EndInit() @@ -96,8 +96,9 @@ Namespace API.Xhamster Friend Const P_Search As String = "search" Friend Const P_Tags As String = "tags" Friend Const P_Categories As String = "categories" - Friend Const P_Pornstars = "pornstars" - Private ReadOnly NonUsersRegex As RParams = RParams.DM("https?://[^/]+/((gay)/|(shemale)/|)(pornstars|tags|categories|search)/([^/\?]+)[/\?]?(.*)", 0, + Friend Const P_Pornstars As String = "pornstars" + Friend Const P_Creators As String = "creators" + Private ReadOnly NonUsersRegex As RParams = RParams.DM("https?://[^/]+/((gay)/|(shemale)/|)(pornstars|creators|tags|categories|search)/([^/\?]+)[/\?]?(.*)", 0, RegexReturn.ListByMatch, EDP.ReturnValue) Private ReadOnly PageRemover_1 As RParams = RParams.DM("[\?&]?[Pp]age=\d+", 0, RegexReturn.Replace, EDP.ReturnValue, CType(Function(input) String.Empty, Func(Of String, String))) @@ -106,12 +107,23 @@ Namespace API.Xhamster Friend Overrides Function IsMyUser(ByVal UserURL As String) As ExchangeOptions If Not UserURL.IsEmptyString AndAlso Domains.Domains.Count > 0 AndAlso Domains.Domains.Exists(Function(d) UserURL.ToLower.Contains(d.ToLower)) Then Dim n$, opt$ + Dim tryNext As Boolean = False Dim data As List(Of String) = RegexReplace(UserURL, UserRegex) If data.ListExists(3) AndAlso Not data(2).IsEmptyString Then n = data(2) - If Not data(1).IsEmptyString AndAlso data(1) = ChannelOption Then n &= $"@{data(1)}" - Return New ExchangeOptions(Site, n) + If Not data(1).IsEmptyString Then + If data(1) = ChannelOption Then + n &= $"@{data(1)}" + ElseIf data(1) = P_Creators Then + tryNext = True + End If + End If + If Not tryNext Then Return New ExchangeOptions(Site, n) Else + tryNext = True + End If + + If tryNext Then data = RegexReplace(UserURL, NonUsersRegex) If data.ListExists(7) AndAlso Not data(5).IsEmptyString Then n = data(5).StringRemoveWinForbiddenSymbols @@ -122,6 +134,7 @@ Namespace API.Xhamster Case P_Tags : mode = SiteModes.Tags Case P_Categories : mode = SiteModes.Categories Case P_Pornstars : mode = SiteModes.Pornstars + Case P_Creators : mode = SiteModes.User Case Else : Return Nothing End Select n = $"{CInt(mode)}@{n}" diff --git a/SCrawler/API/Xhamster/UserData.vb b/SCrawler/API/Xhamster/UserData.vb index 76b28ac..63b83c2 100644 --- a/SCrawler/API/Xhamster/UserData.vb +++ b/SCrawler/API/Xhamster/UserData.vb @@ -19,6 +19,7 @@ Namespace API.Xhamster Friend Class UserData : Inherits UserDataBase #Region "XML names" Private Const Name_Gender As String = "Gender" + Private Const Name_IsCreator As String = "IsCreator" #End Region #Region "Declarations" Friend Overrides ReadOnly Property FeedIsUser As Boolean @@ -27,6 +28,7 @@ Namespace API.Xhamster End Get End Property Friend Property IsChannel As Boolean = False + Friend Property IsCreator As Boolean = False Friend Property TrueName As String = String.Empty Friend Property Gender As String = String.Empty Friend Property SiteMode As SiteModes = SiteModes.User @@ -77,7 +79,8 @@ Namespace API.Xhamster If n.Length = 2 And If(Force, eObj.Options, Options).IsEmptyString Then If Force Then Return False TrueName = n(0) - IsChannel = True + IsChannel = n(1) = SiteSettings.ChannelOption + IsCreator = n(1) = SiteSettings.P_Creators ElseIf IsChannel Then If Force Then Return False TrueName = Name @@ -89,6 +92,7 @@ Namespace API.Xhamster If n2.ListExists Then IsChannel = False __Mode = CInt(n2(0)) + IsCreator = __Mode = SiteModes.User __Gender = n2(1) __Arguments = n2(3) __TrueName = n2.ListTake(3, 100, EDP.ReturnValue).ListToString(String.Empty) @@ -139,6 +143,7 @@ Namespace API.Xhamster With Container If Loading Then IsChannel = .Value(Name_IsChannel).FromXML(Of Boolean)(False) + IsCreator = .Value(Name_IsCreator).FromXML(Of Boolean)(False) TrueName = .Value(Name_TrueName) Gender = .Value(Name_Gender) SiteMode = .Value(Name_SiteMode).FromXML(Of Integer)(SiteModes.User) @@ -151,6 +156,7 @@ Namespace API.Xhamster .Value(Name_FriendlyName) = FriendlyName End If .Add(Name_IsChannel, IsChannel.BoolToInteger) + .Add(Name_IsCreator, IsCreator.BoolToInteger) .Add(Name_TrueName, TrueName) .Add(Name_Gender, Gender) .Add(Name_SiteMode, CInt(SiteMode)) @@ -178,7 +184,7 @@ Namespace API.Xhamster #End Region #Region "Download functions" Friend Function GetNonUserUrl(ByVal Page As Integer) As String - If SiteMode = SiteModes.User Then + If SiteMode = SiteModes.User And Not IsCreator Then Return String.Empty Else Dim url$ = "https://xhamster.com/" @@ -188,6 +194,7 @@ Namespace API.Xhamster Case SiteModes.Categories : url &= SiteSettings.P_Categories Case SiteModes.Search : url &= SiteSettings.P_Search Case SiteModes.Pornstars : url &= SiteSettings.P_Pornstars + Case SiteModes.User : url &= SiteSettings.P_Creators Case Else : Return String.Empty End Select url &= $"/{TrueName}" @@ -224,15 +231,20 @@ Namespace API.Xhamster Private ReadOnly SessionPosts As List(Of String) Private _PageVideosRepeat As Integer = 0 Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) - _TempPhotoData.Clear() - SearchPostsCount = 0 - _PageVideosRepeat = 0 - SessionPosts.Clear() - If DownloadVideos Then DownloadData(1, True, Token) - If Not IsChannel And DownloadImages And Not IsSubscription Then - DownloadData(1, False, Token) - ReparsePhoto(Token) - End If + Try + _TempPhotoData.Clear() + SearchPostsCount = 0 + _PageVideosRepeat = 0 + SessionPosts.Clear() + Responser.CookiesAsHeader = True + If DownloadVideos Then DownloadData(1, True, Token) + If Not IsChannel And Not IsCreator And DownloadImages And Not IsSubscription Then + DownloadData(1, False, Token) + ReparsePhoto(Token) + End If + Finally + Responser.CookiesAsHeader = False + End Try End Sub Private Overloads Sub DownloadData(ByVal Page As Integer, ByVal IsVideo As Boolean, ByVal Token As CancellationToken) Dim URL$ = String.Empty @@ -260,7 +272,7 @@ Namespace API.Xhamster ElseIf SiteMode = SiteModes.Search Then URL = GetNonUserUrl(Page) containerNodes.Add({"searchResult", "models"}) - ElseIf SiteMode = SiteModes.Tags Or SiteMode = SiteModes.Categories Or SiteMode = SiteModes.Pornstars Then + ElseIf IsCreator Or SiteMode = SiteModes.Tags Or SiteMode = SiteModes.Categories Or SiteMode = SiteModes.Pornstars Then URL = GetNonUserUrl(Page) If SiteMode = SiteModes.Pornstars Then containerNodes.Add({"trendingVideoListComponent", "models"}) @@ -269,9 +281,11 @@ Namespace API.Xhamster containerNodes.Add({"pagesCategoryComponent", "trendingVideoListProps", "models"}) containerNodes.Add({"trendingVideoListComponent", "models"}) End If + containerNodes.Add({"trendingVideoSectionComponent", "videoModels"}) Else URL = $"https://xhamster.com/users/{TrueName}/{IIf(IsVideo, "videos", "photos")}{IIf(Page = 1, String.Empty, $"/{Page}")}" containerNodes.Add({If(IsVideo, "userVideoCollection", "userGalleriesCollection")}) + containerNodes.Add(If(IsVideo, {"videoListComponent", "models"}, {"userGalleriesCollection"})) End If ThrowAny(Token) diff --git a/SCrawler/API/YouTube/UserData.vb b/SCrawler/API/YouTube/UserData.vb index ff380b5..7f41538 100644 --- a/SCrawler/API/YouTube/UserData.vb +++ b/SCrawler/API/YouTube/UserData.vb @@ -225,6 +225,7 @@ Namespace API.YouTube End Sub Private Sub DownloadCommunity(ByVal Cursor As String, ByVal Token As CancellationToken, Optional ByVal Round As Integer = 0) Dim URL$ = String.Empty + Const errMsg$ = "community data downloading error" Try Const postIdTemp$ = "Community_{0}" Const specFolder$ = "Community" @@ -311,6 +312,10 @@ Namespace API.YouTube Next End If End With + Else + With j({"error"}) + If .ListExists Then MyMainLOG = $"{ToStringForLog()} {errMsg} [{ .Value("code")}]: { .Value("message")}" + End With End If End With End If @@ -327,7 +332,7 @@ Namespace API.YouTube If Not nextToken.IsEmptyString Then DownloadCommunity(nextToken, Token) Catch ex As Exception - ProcessException(ex, Token, "community data downloading error") + ProcessException(ex, Token, errMsg) End Try End Sub Private Sub GetChannelID() diff --git a/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb b/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb index f0e87ab..fde4e80 100644 --- a/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb +++ b/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb @@ -30,6 +30,7 @@ Namespace DownloadObjects Dim MENU_LOAD_SEP_2 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_5 As System.Windows.Forms.ToolStripSeparator Me.OPT_DEFAULT = New System.Windows.Forms.ToolStripMenuItem() Me.OPT_SUBSCRIPTIONS = New System.Windows.Forms.ToolStripMenuItem() Me.ToolbarTOP = New System.Windows.Forms.ToolStrip() @@ -43,18 +44,18 @@ Namespace DownloadObjects Me.BTT_FEED_REMOVE_FAV = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_FEED_ADD_SPEC = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_FEED_REMOVE_SPEC = New System.Windows.Forms.ToolStripMenuItem() - Me.SEP_0 = New System.Windows.Forms.ToolStripSeparator() - Me.MENU_DOWN = New System.Windows.Forms.ToolStripDropDownButton() - Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripMenuItem() - Me.BTT_DOWN_SELECTED = New System.Windows.Forms.ToolStripMenuItem() - Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton() - Me.BTT_CLEAR = New System.Windows.Forms.ToolStripButton() - Me.TP_DATA = New System.Windows.Forms.TableLayoutPanel() Me.BTT_FEED_CLEAR_FAV = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_FEED_CLEAR_SPEC = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_FEED_DELETE_SPEC = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_FEED_DELETE_DAILY_LIST = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_FEED_DELETE_DAILY_DATE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CLEAR_DAILY = New System.Windows.Forms.ToolStripMenuItem() + Me.SEP_0 = New System.Windows.Forms.ToolStripSeparator() + Me.MENU_DOWN = New System.Windows.Forms.ToolStripDropDownButton() + Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_DOWN_SELECTED = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton() + Me.TP_DATA = New System.Windows.Forms.TableLayoutPanel() SEP_1 = New System.Windows.Forms.ToolStripSeparator() SEP_2 = New System.Windows.Forms.ToolStripSeparator() MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton() @@ -62,6 +63,7 @@ Namespace DownloadObjects MENU_LOAD_SEP_2 = 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_5 = New System.Windows.Forms.ToolStripSeparator() Me.ToolbarTOP.SuspendLayout() Me.SuspendLayout() ' @@ -112,10 +114,15 @@ Namespace DownloadObjects MENU_LOAD_SEP_3.Name = "MENU_LOAD_SEP_3" MENU_LOAD_SEP_3.Size = New System.Drawing.Size(264, 6) ' + 'MENU_LOAD_SEP_4 + ' + MENU_LOAD_SEP_4.Name = "MENU_LOAD_SEP_4" + MENU_LOAD_SEP_4.Size = New System.Drawing.Size(264, 6) + ' 'ToolbarTOP ' Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden - Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_LOAD_SESSION, Me.SEP_0, MENU_VIEW, SEP_1, Me.MENU_DOWN, Me.BTT_REFRESH, Me.BTT_CLEAR, SEP_2}) + Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_LOAD_SESSION, Me.SEP_0, MENU_VIEW, SEP_1, Me.MENU_DOWN, Me.BTT_REFRESH, SEP_2}) Me.ToolbarTOP.Location = New System.Drawing.Point(0, 0) Me.ToolbarTOP.Name = "ToolbarTOP" Me.ToolbarTOP.Size = New System.Drawing.Size(484, 25) @@ -124,7 +131,7 @@ Namespace DownloadObjects 'MENU_LOAD_SESSION ' 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}) + 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_CLEAR_DAILY}) 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.Name = "MENU_LOAD_SESSION" @@ -194,6 +201,50 @@ Namespace DownloadObjects Me.BTT_FEED_REMOVE_SPEC.Size = New System.Drawing.Size(267, 22) Me.BTT_FEED_REMOVE_SPEC.Text = "Remove checked from special feed..." ' + 'BTT_FEED_CLEAR_FAV + ' + 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.Size = New System.Drawing.Size(267, 22) + Me.BTT_FEED_CLEAR_FAV.Text = "Clear Favorite" + ' + 'BTT_FEED_CLEAR_SPEC + ' + 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.Size = New System.Drawing.Size(267, 22) + Me.BTT_FEED_CLEAR_SPEC.Text = "Clear special feed..." + ' + 'BTT_FEED_DELETE_SPEC + ' + 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.Size = New System.Drawing.Size(267, 22) + Me.BTT_FEED_DELETE_SPEC.Text = "Delete special feed..." + ' + '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.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.Text = "Delete daily feed (by list)" + ' + '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.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.Text = "Delete daily feed (by date)" + ' + 'BTT_CLEAR_DAILY + ' + 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.Name = "BTT_CLEAR_DAILY" + Me.BTT_CLEAR_DAILY.Size = New System.Drawing.Size(267, 22) + Me.BTT_CLEAR_DAILY.Text = "Clear session" + Me.BTT_CLEAR_DAILY.ToolTipText = "Clear data list (session)" + ' 'SEP_0 ' Me.SEP_0.Name = "SEP_0" @@ -235,15 +286,6 @@ Namespace DownloadObjects Me.BTT_REFRESH.Text = "Refresh" Me.BTT_REFRESH.ToolTipText = "Refresh data list" ' - 'BTT_CLEAR - ' - Me.BTT_CLEAR.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24 - Me.BTT_CLEAR.ImageTransparentColor = System.Drawing.Color.Magenta - Me.BTT_CLEAR.Name = "BTT_CLEAR" - Me.BTT_CLEAR.Size = New System.Drawing.Size(54, 22) - Me.BTT_CLEAR.Text = "Clear" - Me.BTT_CLEAR.ToolTipText = "Clear data list" - ' 'TP_DATA ' Me.TP_DATA.AutoScroll = True @@ -269,45 +311,10 @@ Namespace DownloadObjects Me.TP_DATA.Size = New System.Drawing.Size(484, 436) Me.TP_DATA.TabIndex = 1 ' - 'MENU_LOAD_SEP_4 + 'MENU_LOAD_SEP_5 ' - MENU_LOAD_SEP_4.Name = "MENU_LOAD_SEP_4" - MENU_LOAD_SEP_4.Size = New System.Drawing.Size(264, 6) - ' - 'BTT_FEED_CLEAR_FAV - ' - 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.Size = New System.Drawing.Size(267, 22) - Me.BTT_FEED_CLEAR_FAV.Text = "Clear Favorite" - ' - 'BTT_FEED_CLEAR_SPEC - ' - 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.Size = New System.Drawing.Size(267, 22) - Me.BTT_FEED_CLEAR_SPEC.Text = "Clear special feed..." - ' - 'BTT_FEED_DELETE_SPEC - ' - 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.Size = New System.Drawing.Size(267, 22) - Me.BTT_FEED_DELETE_SPEC.Text = "Delete special feed..." - ' - '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.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.Text = "Delete daily feed (by list)" - ' - '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.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.Text = "Delete daily feed (by date)" + MENU_LOAD_SEP_5.Name = "MENU_LOAD_SEP_5" + MENU_LOAD_SEP_5.Size = New System.Drawing.Size(264, 6) ' 'DownloadFeedForm ' @@ -330,7 +337,7 @@ Namespace DownloadObjects End Sub Private WithEvents BTT_REFRESH As ToolStripButton - Private WithEvents BTT_CLEAR As ToolStripButton + Private WithEvents BTT_CLEAR_DAILY As ToolStripMenuItem Private WithEvents MENU_LOAD_SESSION As ToolStripDropDownButton Private WithEvents BTT_LOAD_SESSION_LAST As ToolStripMenuItem Private WithEvents BTT_LOAD_SESSION_CHOOSE As ToolStripMenuItem diff --git a/SCrawler/Download/Feed/DownloadFeedForm.resx b/SCrawler/Download/Feed/DownloadFeedForm.resx index 96c81b9..e81ed32 100644 --- a/SCrawler/Download/Feed/DownloadFeedForm.resx +++ b/SCrawler/Download/Feed/DownloadFeedForm.resx @@ -144,10 +144,13 @@ False - - 17, 17 - False + + 17, 17 + + + False + \ No newline at end of file diff --git a/SCrawler/Download/Feed/DownloadFeedForm.vb b/SCrawler/Download/Feed/DownloadFeedForm.vb index c67a644..9b67d2b 100644 --- a/SCrawler/Download/Feed/DownloadFeedForm.vb +++ b/SCrawler/Download/Feed/DownloadFeedForm.vb @@ -105,7 +105,7 @@ Namespace DownloadObjects Private Sub DownloadFeedForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed ClearTable() MyRange.Dispose() - BTT_CLEAR.Dispose() + BTT_CLEAR_DAILY.Dispose() DataList.Clear() End Sub Private Sub DownloadFeedForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown @@ -414,7 +414,7 @@ Namespace DownloadObjects Private Sub BTT_FEED_ADD_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_SPEC.Click Dim c As IEnumerable(Of UserMediaD) = GetCheckedMedia() If c.ListExists Then - With FeedSpecialCollection.ChooseFeeds(False) + With FeedSpecialCollection.ChooseFeeds(True) If .ListExists Then .ForEach(Sub(f) f.Add(c)) End With Else @@ -518,6 +518,15 @@ Namespace DownloadObjects End Try End Sub #End Region +#Region "Clear session" + Private Sub BTT_CLEAR_DAILY_Click(sender As Object, e As EventArgs) Handles BTT_CLEAR_DAILY.Click + If MsgBoxE({"Are you sure you want to clear this session data?", "Clear session"}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then + Downloader.Files.Clear() + ClearTable() + RefillList() + End If + End Sub +#End Region #End Region #Region "View modes" Private Sub OPT_Click(ByVal Sender As ToolStripMenuItem, ByVal e As EventArgs) Handles OPT_DEFAULT.Click, OPT_SUBSCRIPTIONS.Click @@ -546,11 +555,6 @@ Namespace DownloadObjects Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click RefillList() End Sub - Private Sub BTT_CLEAR_Click(sender As Object, e As EventArgs) Handles BTT_CLEAR.Click - Downloader.Files.Clear() - ClearTable() - RefillList() - End Sub #End Region #Region "Download" Private Sub FeedMedia_Download(ByVal Sender As Object, ByVal e As EventArgs) Handles BTT_DOWN_ALL.Click, BTT_DOWN_SELECTED.Click diff --git a/SCrawler/MainFrame.Designer.vb b/SCrawler/MainFrame.Designer.vb index 541fdfc..cb17774 100644 --- a/SCrawler/MainFrame.Designer.vb +++ b/SCrawler/MainFrame.Designer.vb @@ -139,6 +139,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.BTT_TRAY_FEED_SHOW = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_TRAY_CHANNELS = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_TRAY_DOWNLOADER = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_TRAY_SCHEDULER = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_TRAY_SHOW_HIDE = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_TRAY_CLOSE = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_TRAY_CLOSE_NO_SCRIPT = New System.Windows.Forms.ToolStripMenuItem() @@ -987,9 +988,9 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form ' 'TRAY_CONTEXT ' - Me.TRAY_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_TRAY_PAUSE_AUTOMATION, Me.BTT_TRAY_SILENT_MODE, Me.BTT_TRAY_FEED_SHOW, Me.BTT_TRAY_CHANNELS, Me.BTT_TRAY_DOWNLOADER, TRAY_SEP_1, Me.BTT_TRAY_SHOW_HIDE, TRAY_SEP_2, Me.BTT_TRAY_CLOSE, Me.BTT_TRAY_CLOSE_NO_SCRIPT}) + Me.TRAY_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_TRAY_PAUSE_AUTOMATION, Me.BTT_TRAY_SILENT_MODE, Me.BTT_TRAY_FEED_SHOW, Me.BTT_TRAY_CHANNELS, Me.BTT_TRAY_DOWNLOADER, Me.BTT_TRAY_SCHEDULER, TRAY_SEP_1, Me.BTT_TRAY_SHOW_HIDE, TRAY_SEP_2, Me.BTT_TRAY_CLOSE, Me.BTT_TRAY_CLOSE_NO_SCRIPT}) Me.TRAY_CONTEXT.Name = "TRAY_CONTEXT" - Me.TRAY_CONTEXT.Size = New System.Drawing.Size(171, 192) + Me.TRAY_CONTEXT.Size = New System.Drawing.Size(171, 214) ' 'BTT_TRAY_PAUSE_AUTOMATION ' @@ -1032,6 +1033,13 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.BTT_TRAY_DOWNLOADER.Size = New System.Drawing.Size(170, 22) Me.BTT_TRAY_DOWNLOADER.Text = "Downloader" ' + 'BTT_TRAY_SCHEDULER + ' + Me.BTT_TRAY_SCHEDULER.Image = Global.SCrawler.My.Resources.Resources.ScriptPic_32 + Me.BTT_TRAY_SCHEDULER.Name = "BTT_TRAY_SCHEDULER" + Me.BTT_TRAY_SCHEDULER.Size = New System.Drawing.Size(170, 22) + Me.BTT_TRAY_SCHEDULER.Text = "Scheduler" + ' 'BTT_TRAY_SHOW_HIDE ' Me.BTT_TRAY_SHOW_HIDE.Image = Global.SCrawler.My.Resources.Resources.ApplicationPic_16 @@ -1181,4 +1189,5 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Private WithEvents MENU_INFO_SHOW_QUEUE As ToolStripMenuItem Private WithEvents BTT_DOWN_SPEC As ToolStripKeyMenuItem Private WithEvents BTT_SHOW_FILTER_ADV As ToolStripMenuItem + Private WithEvents BTT_TRAY_SCHEDULER As ToolStripMenuItem End Class \ No newline at end of file diff --git a/SCrawler/MainFrame.vb b/SCrawler/MainFrame.vb index 8c30f98..2c601e5 100644 --- a/SCrawler/MainFrame.vb +++ b/SCrawler/MainFrame.vb @@ -603,7 +603,7 @@ CloseResume: ControlInvokeFast(Toolbar_TOP, BTT_DOWN_AUTOMATION_PAUSE, Sub() BTT_DOWN_AUTOMATION_PAUSE.Visible = b) ControlInvokeFast(Me, Sub() BTT_TRAY_PAUSE_AUTOMATION.Visible = b) End Sub - Private Async Sub BTT_DOWN_AUTOMATION_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_AUTOMATION.Click + Private Async Sub BTT_DOWN_AUTOMATION_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_AUTOMATION.Click, BTT_TRAY_SCHEDULER.Click Try Using f As New SchedulerEditorForm : f.ShowDialog() : End Using Await Settings.Automation.Start(False) diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb index e697e86..c206c21 100644 --- a/SCrawler/My Project/AssemblyInfo.vb +++ b/SCrawler/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + +