diff --git a/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb b/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb
index 41136b2..f0e87ab 100644
--- a/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb
+++ b/SCrawler/Download/Feed/DownloadFeedForm.Designer.vb
@@ -26,12 +26,23 @@ Namespace DownloadObjects
Dim SEP_2 As System.Windows.Forms.ToolStripSeparator
Dim MENU_VIEW As System.Windows.Forms.ToolStripDropDownButton
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(DownloadFeedForm))
+ Dim MENU_LOAD_SEP_1 As System.Windows.Forms.ToolStripSeparator
+ 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
Me.OPT_DEFAULT = New System.Windows.Forms.ToolStripMenuItem()
Me.OPT_SUBSCRIPTIONS = New System.Windows.Forms.ToolStripMenuItem()
Me.ToolbarTOP = New System.Windows.Forms.ToolStrip()
Me.MENU_LOAD_SESSION = New System.Windows.Forms.ToolStripDropDownButton()
+ Me.BTT_LOAD_SESSION_CURRENT = New System.Windows.Forms.ToolStripMenuItem()
Me.BTT_LOAD_SESSION_LAST = New System.Windows.Forms.ToolStripMenuItem()
Me.BTT_LOAD_SESSION_CHOOSE = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_LOAD_FAV = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_LOAD_SPEC = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_FEED_ADD_FAV = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_FEED_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()
@@ -39,10 +50,18 @@ Namespace DownloadObjects
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_LOAD_SESSION_CURRENT = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_FEED_CLEAR_FAV = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_FEED_CLEAR_SPEC = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_FEED_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()
SEP_1 = New System.Windows.Forms.ToolStripSeparator()
SEP_2 = New System.Windows.Forms.ToolStripSeparator()
MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton()
+ MENU_LOAD_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
+ 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()
Me.ToolbarTOP.SuspendLayout()
Me.SuspendLayout()
'
@@ -78,6 +97,21 @@ Namespace DownloadObjects
Me.OPT_SUBSCRIPTIONS.Size = New System.Drawing.Size(145, 22)
Me.OPT_SUBSCRIPTIONS.Text = "Subscriptions"
'
+ 'MENU_LOAD_SEP_1
+ '
+ MENU_LOAD_SEP_1.Name = "MENU_LOAD_SEP_1"
+ MENU_LOAD_SEP_1.Size = New System.Drawing.Size(264, 6)
+ '
+ 'MENU_LOAD_SEP_2
+ '
+ MENU_LOAD_SEP_2.Name = "MENU_LOAD_SEP_2"
+ MENU_LOAD_SEP_2.Size = New System.Drawing.Size(264, 6)
+ '
+ 'MENU_LOAD_SEP_3
+ '
+ MENU_LOAD_SEP_3.Name = "MENU_LOAD_SEP_3"
+ MENU_LOAD_SEP_3.Size = New System.Drawing.Size(264, 6)
+ '
'ToolbarTOP
'
Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
@@ -90,27 +124,76 @@ 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})
+ 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.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"
Me.MENU_LOAD_SESSION.Size = New System.Drawing.Size(29, 22)
Me.MENU_LOAD_SESSION.Text = "Load session"
'
+ 'BTT_LOAD_SESSION_CURRENT
+ '
+ Me.BTT_LOAD_SESSION_CURRENT.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
+ Me.BTT_LOAD_SESSION_CURRENT.Name = "BTT_LOAD_SESSION_CURRENT"
+ Me.BTT_LOAD_SESSION_CURRENT.Size = New System.Drawing.Size(267, 22)
+ Me.BTT_LOAD_SESSION_CURRENT.Text = "Load current session"
+ '
'BTT_LOAD_SESSION_LAST
'
Me.BTT_LOAD_SESSION_LAST.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
Me.BTT_LOAD_SESSION_LAST.Name = "BTT_LOAD_SESSION_LAST"
- Me.BTT_LOAD_SESSION_LAST.Size = New System.Drawing.Size(189, 22)
+ Me.BTT_LOAD_SESSION_LAST.Size = New System.Drawing.Size(267, 22)
Me.BTT_LOAD_SESSION_LAST.Text = "Load last session"
'
'BTT_LOAD_SESSION_CHOOSE
'
Me.BTT_LOAD_SESSION_CHOOSE.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
Me.BTT_LOAD_SESSION_CHOOSE.Name = "BTT_LOAD_SESSION_CHOOSE"
- Me.BTT_LOAD_SESSION_CHOOSE.Size = New System.Drawing.Size(189, 22)
+ Me.BTT_LOAD_SESSION_CHOOSE.Size = New System.Drawing.Size(267, 22)
Me.BTT_LOAD_SESSION_CHOOSE.Text = "Select loading session"
'
+ 'BTT_LOAD_FAV
+ '
+ Me.BTT_LOAD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
+ Me.BTT_LOAD_FAV.Name = "BTT_LOAD_FAV"
+ Me.BTT_LOAD_FAV.Size = New System.Drawing.Size(267, 22)
+ Me.BTT_LOAD_FAV.Text = "Load Favorite"
+ '
+ 'BTT_LOAD_SPEC
+ '
+ Me.BTT_LOAD_SPEC.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
+ Me.BTT_LOAD_SPEC.Name = "BTT_LOAD_SPEC"
+ Me.BTT_LOAD_SPEC.Size = New System.Drawing.Size(267, 22)
+ Me.BTT_LOAD_SPEC.Text = "Load special feed"
+ '
+ 'BTT_FEED_ADD_FAV
+ '
+ Me.BTT_FEED_ADD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
+ Me.BTT_FEED_ADD_FAV.Name = "BTT_FEED_ADD_FAV"
+ Me.BTT_FEED_ADD_FAV.Size = New System.Drawing.Size(267, 22)
+ Me.BTT_FEED_ADD_FAV.Text = "Add checked to Favorite"
+ '
+ 'BTT_FEED_REMOVE_FAV
+ '
+ Me.BTT_FEED_REMOVE_FAV.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
+ Me.BTT_FEED_REMOVE_FAV.Name = "BTT_FEED_REMOVE_FAV"
+ Me.BTT_FEED_REMOVE_FAV.Size = New System.Drawing.Size(267, 22)
+ Me.BTT_FEED_REMOVE_FAV.Text = "Remove checked from Favorite"
+ '
+ 'BTT_FEED_ADD_SPEC
+ '
+ Me.BTT_FEED_ADD_SPEC.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
+ Me.BTT_FEED_ADD_SPEC.Name = "BTT_FEED_ADD_SPEC"
+ Me.BTT_FEED_ADD_SPEC.Size = New System.Drawing.Size(267, 22)
+ Me.BTT_FEED_ADD_SPEC.Text = "Add checked to special feed..."
+ '
+ 'BTT_FEED_REMOVE_SPEC
+ '
+ Me.BTT_FEED_REMOVE_SPEC.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
+ Me.BTT_FEED_REMOVE_SPEC.Name = "BTT_FEED_REMOVE_SPEC"
+ Me.BTT_FEED_REMOVE_SPEC.Size = New System.Drawing.Size(267, 22)
+ Me.BTT_FEED_REMOVE_SPEC.Text = "Remove checked from special feed..."
+ '
'SEP_0
'
Me.SEP_0.Name = "SEP_0"
@@ -186,12 +269,45 @@ Namespace DownloadObjects
Me.TP_DATA.Size = New System.Drawing.Size(484, 436)
Me.TP_DATA.TabIndex = 1
'
- 'BTT_LOAD_SESSION_CURRENT
+ 'MENU_LOAD_SEP_4
'
- Me.BTT_LOAD_SESSION_CURRENT.Image = Global.SCrawler.My.Resources.Resources.ArrowDownPic_Blue_24
- Me.BTT_LOAD_SESSION_CURRENT.Name = "BTT_LOAD_SESSION_CURRENT"
- Me.BTT_LOAD_SESSION_CURRENT.Size = New System.Drawing.Size(189, 22)
- Me.BTT_LOAD_SESSION_CURRENT.Text = "Load current session"
+ 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)"
'
'DownloadFeedForm
'
@@ -227,5 +343,16 @@ Namespace DownloadObjects
Private WithEvents BTT_DOWN_ALL As ToolStripMenuItem
Private WithEvents BTT_DOWN_SELECTED As ToolStripMenuItem
Private WithEvents BTT_LOAD_SESSION_CURRENT As ToolStripMenuItem
+ Private WithEvents BTT_FEED_ADD_FAV As ToolStripMenuItem
+ Private WithEvents BTT_FEED_REMOVE_FAV As ToolStripMenuItem
+ Private WithEvents BTT_FEED_ADD_SPEC As ToolStripMenuItem
+ Private WithEvents BTT_FEED_REMOVE_SPEC As ToolStripMenuItem
+ Private WithEvents BTT_LOAD_FAV As ToolStripMenuItem
+ Private WithEvents BTT_LOAD_SPEC As ToolStripMenuItem
+ Private WithEvents BTT_FEED_CLEAR_FAV As ToolStripMenuItem
+ Private WithEvents BTT_FEED_CLEAR_SPEC As ToolStripMenuItem
+ Private WithEvents BTT_FEED_DELETE_SPEC As ToolStripMenuItem
+ Private WithEvents BTT_FEED_DELETE_DAILY_LIST As ToolStripMenuItem
+ Private WithEvents BTT_FEED_DELETE_DAILY_DATE As ToolStripMenuItem
End Class
End Namespace
\ No newline at end of file
diff --git a/SCrawler/Download/Feed/DownloadFeedForm.resx b/SCrawler/Download/Feed/DownloadFeedForm.resx
index 913b26b..96c81b9 100644
--- a/SCrawler/Download/Feed/DownloadFeedForm.resx
+++ b/SCrawler/Download/Feed/DownloadFeedForm.resx
@@ -135,7 +135,19 @@
MeQCkYEBAD3tUdo+/cEPAAAAAElFTkSuQmCC
+
+ False
+
+
+ False
+
+
+ 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 a3d39f3..f654f8f 100644
--- a/SCrawler/Download/Feed/DownloadFeedForm.vb
+++ b/SCrawler/Download/Feed/DownloadFeedForm.vb
@@ -13,6 +13,7 @@ Imports PersonalUtilities.Forms.Toolbars
Imports PersonalUtilities.Tools
Imports RCI = PersonalUtilities.Forms.Toolbars.RangeSwitcherToolbar.ControlItem
Imports UserMediaD = SCrawler.DownloadObjects.TDownloader.UserMediaD
+Imports DTSModes = PersonalUtilities.Forms.DateTimeSelectionForm.Modes
Namespace DownloadObjects
Friend Class DownloadFeedForm
#Region "Declarations"
@@ -26,6 +27,8 @@ Namespace DownloadObjects
Private ReadOnly FilterSubscriptions As New FPredicate(Of UserMediaD)(Function(d) If(d.User?.IsSubscription, False))
Private ReadOnly FilterUsers As New FPredicate(Of UserMediaD)(Function(d) Not FilterSubscriptions.Invoke(d))
Private ReadOnly FileNotExist As New FPredicate(Of UserMediaD)(Function(d) Not d.Data.File.Exists And Not FilterSubscriptions.Invoke(d))
+ Private ReadOnly SessionDateStringProvider As New CustomProvider(Function(v As SFile) AConvert(Of String)(AConvert(Of Date)(v.Name, SessionDateTimeProvider, v.Name),
+ DateTimeDefaultProvider, v.Name))
Private BttRefreshToolTipText As String = "Refresh data list"
Private CenterImage As Boolean = False
Private NumberOfVisibleImages As Integer = 1
@@ -66,6 +69,22 @@ Namespace DownloadObjects
End With
ToolbarTOP.Items.AddRange({New ToolStripSeparator, BTT_DELETE_SELECTED})
With Settings
+ With .Feeds
+ .Load()
+ AddHandler .FeedAdded, AddressOf Feed_FeedAdded
+ AddHandler .FeedRemoved, AddressOf Feed_FeedRemoved
+ If .Count > 0 Then
+ For Each feed As FeedSpecial In .Self
+ If Not feed.IsFavorite Then
+ AddNewFeedItem(BTT_LOAD_SPEC, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_LOAD)
+ AddNewFeedItem(BTT_FEED_ADD_SPEC, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD)
+ AddNewFeedItem(BTT_FEED_REMOVE_SPEC, feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_REMOVE)
+ AddNewFeedItem(BTT_FEED_DELETE_SPEC, feed, My.Resources.DeletePic_24, AddressOf Feed_SPEC_DELETE)
+ AddNewFeedItem(BTT_FEED_CLEAR_SPEC, feed, My.Resources.BrushToolPic_16, AddressOf Feed_SPEC_CLEAR)
+ End If
+ Next
+ End If
+ End With
If .FeedOpenLastMode Then
If .FeedLastModeSubscriptions Then OPT_SUBSCRIPTIONS.Checked = True Else OPT_DEFAULT.Checked = True
Else
@@ -93,6 +112,85 @@ Namespace DownloadObjects
If e.KeyCode = Keys.F5 Then RefillList() : e.Handled = True
End Sub
#End Region
+#Region "Feeds handlers"
+ Private Sub AddNewFeedItem(ByVal Destination As ToolStripMenuItem, ByVal Feed As FeedSpecial, ByVal Image As Image, ByVal Handler As EventHandler,
+ Optional ByVal Insert As Boolean = False)
+ Dim item As New ToolStripMenuItem(Feed.Name, Image) With {.Tag = Feed}
+ AddHandler item.Click, Handler
+ ControlInvokeFast(ToolbarTOP, Destination, Sub()
+ If Destination.DropDownItems.Count > 0 And Insert Then
+ Destination.DropDownItems.Insert(0, item)
+ Else
+ Destination.DropDownItems.Add(item)
+ End If
+ End Sub, EDP.None)
+ End Sub
+ Private Sub Feed_FeedAdded(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
+ AddNewFeedItem(BTT_LOAD_SPEC, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_LOAD, True)
+ AddNewFeedItem(BTT_FEED_ADD_SPEC, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_ADD, True)
+ AddNewFeedItem(BTT_FEED_REMOVE_SPEC, Feed, My.Resources.RSSPic_512, AddressOf Feed_SPEC_REMOVE, True)
+ AddNewFeedItem(BTT_FEED_DELETE_SPEC, Feed, My.Resources.DeletePic_24, AddressOf Feed_SPEC_DELETE, True)
+ AddNewFeedItem(BTT_FEED_CLEAR_SPEC, Feed, My.Resources.BrushToolPic_16, AddressOf Feed_SPEC_CLEAR, True)
+ End Sub
+ Private Overloads Sub Feed_FeedRemoved(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
+ Feed_FeedRemoved(BTT_LOAD_SPEC, Feed)
+ Feed_FeedRemoved(BTT_FEED_ADD_SPEC, Feed)
+ Feed_FeedRemoved(BTT_FEED_REMOVE_SPEC, Feed)
+ Feed_FeedRemoved(BTT_FEED_DELETE_SPEC, Feed)
+ Feed_FeedRemoved(BTT_FEED_CLEAR_SPEC, Feed)
+ End Sub
+ Private Overloads Sub Feed_FeedRemoved(ByVal Destination As ToolStripMenuItem, ByVal Feed As FeedSpecial)
+ Try
+ With Destination
+ ControlInvokeFast(ToolbarTOP, .Self,
+ Sub()
+ If .DropDownItems.Count > 0 Then
+ Dim item As Object
+ For i% = .DropDownItems.Count - 1 To 0 Step -1
+ item = .DropDownItems(i)
+ If TypeOf item Is ToolStripMenuItem AndAlso Feed.Equals(DirectCast(item, ToolStripMenuItem).Tag) Then
+ With DirectCast(item, ToolStripMenuItem) : .Tag = Nothing : .Dispose() : End With
+ '.DropDownItems.RemoveAt(i)
+ End If
+ Next
+ End If
+ End Sub, EDP.None)
+ End With
+ Catch ex As Exception
+ ErrorsDescriber.Execute(EDP.SendToLog, ex, "Feed removed")
+ MainFrameObj.UpdateLogButton()
+ End Try
+ End Sub
+ Private Sub Feed_SPEC_LOAD(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
+ Dim f As FeedSpecial = Source.Tag
+ If Not f Is Nothing AndAlso Not f.Disposed Then
+ DataList.Clear()
+ If f.Count > 0 Then DataList.ListAddList(f) : CleanDataList()
+ RefillList(False)
+ End If
+ End Sub
+ Private Sub Feed_SPEC_ADD(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
+ Dim f As FeedSpecial = Source.Tag
+ If Not f Is Nothing AndAlso Not f.Disposed Then f.Add(GetCheckedMedia())
+ End Sub
+ Private Sub Feed_SPEC_CLEAR(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
+ Dim f As FeedSpecial = Source.Tag
+ If Not f Is Nothing AndAlso Not f.Disposed Then
+ If MsgBoxE({$"Are you sure you want to clear the '{f.Name}' feed?", "Clear feed"}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then f.Clear()
+ End If
+ End Sub
+ Private Sub Feed_SPEC_REMOVE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
+ Dim f As FeedSpecial = Source.Tag
+ If Not f Is Nothing AndAlso Not f.Disposed Then f.Remove(GetCheckedMedia())
+ End Sub
+ Private Sub Feed_SPEC_DELETE(ByVal Source As ToolStripMenuItem, ByVal e As EventArgs)
+ Dim f As FeedSpecial = Source.Tag
+ If Not f Is Nothing AndAlso Not f.Disposed Then
+ If MsgBoxE({$"Are you sure you want to delete the '{f.Name}' feed?", "Delete feed"}, vbExclamation,,, {"Process", "Cancel"}) = 0 AndAlso
+ f.Delete() Then Feed_FeedRemoved(Settings.Feeds, f)
+ End If
+ End Sub
+#End Region
#Region "Settings"
Friend Sub UpdateSettings()
With Settings
@@ -151,13 +249,6 @@ Namespace DownloadObjects
End Sub
#End Region
#Region "Refill"
- Friend Sub Downloader_FilesChanged(ByVal Added As Boolean)
- ControlInvokeFast(ToolbarTOP, BTT_REFRESH, Sub() BTT_REFRESH.ToolTipText = If(Added, "New files found", "Some files have been removed"))
- BTT_REFRESH.ControlChangeColor(ToolbarTOP, Added, False)
- End Sub
- Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click
- RefillList()
- End Sub
Private Sub RefillList(Optional ByVal RefillDataList As Boolean = True)
DataPopulated = False
If RefillDataList Then
@@ -176,11 +267,20 @@ Namespace DownloadObjects
MyRange_IndexChanged(MyRange, Nothing)
End If
End Sub
- Private Sub BTT_CLEAR_Click(sender As Object, e As EventArgs) Handles BTT_CLEAR.Click
- Downloader.Files.Clear()
- ClearTable()
- RefillList()
+ Private Sub CleanDataList()
+ If DataList.Count > 0 Then
+ If IsSubscription Then
+ DataList.RemoveAll(FilterUsers)
+ Else
+ DataList.RemoveAll(FilterSubscriptions)
+ DataList.RemoveAll(FileNotExist)
+ End If
+ End If
End Sub
+#End Region
+#Region "Toolbar controls"
+#Region "Feed"
+#Region "Load"
Private Sub BTT_LOAD_SESSION_CURRENT_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SESSION_CURRENT.Click
RefillList()
End Sub
@@ -190,7 +290,8 @@ Namespace DownloadObjects
Private Sub BTT_LOAD_SESSION_CHOOSE_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SESSION_CHOOSE.Click
SessionChooser(False)
End Sub
- Private Sub SessionChooser(ByVal GetLast As Boolean)
+ Private Sub SessionChooser(ByVal GetLast As Boolean, Optional ByVal GetFilesOnly As Boolean = False,
+ Optional ByRef ResultFilesList As List(Of SFile) = Nothing)
Try
Downloader.ClearSessions()
Dim f As SFile = TDownloader.SessionsPath.CSFileP
@@ -198,16 +299,9 @@ Namespace DownloadObjects
Dim m As New MMessage("Saved sessions not selected", "Sessions",, vbExclamation)
Dim x As XmlFile
Dim lcr As New ListAddParams(LAP.NotContainsOnly + LAP.IgnoreICopier)
- Dim __clearList As Action = Sub()
- If IsSubscription Then
- DataList.RemoveAll(FilterUsers)
- Else
- DataList.RemoveAll(FilterSubscriptions)
- DataList.RemoveAll(FileNotExist)
- End If
- End Sub
Dim __getFiles As Func(Of Boolean) = Function() As Boolean
If f.Exists(SFO.Path, False) Then fList = SFile.GetFiles(f, "*.xml",, EDP.ReturnValue)
+ If fList.ListExists Then fList.RemoveAll(Settings.Feeds.FeedSpecialRemover)
If fList.ListExists Then
fList.Reverse()
Return True
@@ -216,27 +310,32 @@ Namespace DownloadObjects
End If
End Function
If Not GetLast Then __getFiles.Invoke
- If Not GetLast AndAlso fList.ListExists Then
+ If Not GetLast And GetFilesOnly And Not fList.ListExists Then
+ MsgBoxE({"No session files found", "Get session files"}, vbExclamation)
+ ElseIf Not GetLast AndAlso fList.ListExists Then
Using chooser As New SimpleListForm(Of SFile)(fList, Settings.Design) With {
.FormText = "Sessions",
.Icon = My.Resources.ArrowDownIcon_Blue_24,
.Mode = SimpleListFormModes.CheckedItems,
- .Provider = New CustomProvider(Function(v As SFile) AConvert(Of String)(AConvert(Of Date)(v.Name, SessionDateTimeProvider, v.Name),
- DateTimeDefaultProvider, v.Name))
+ .Provider = SessionDateStringProvider
}
chooser.ClearButtons()
If chooser.ShowDialog = DialogResult.OK Then
fList = chooser.DataResult
If fList.ListExists Then
- DataList.Clear()
- For Each f In fList
- x = New XmlFile(f,, False) With {.AllowSameNames = True, .XmlReadOnly = True}
- x.LoadData()
- If x.Count > 0 Then DataList.ListAddList(x, lcr)
- x.Dispose()
- Next
- __clearList.Invoke
- RefillList(False)
+ If GetFilesOnly Then
+ ResultFilesList.AddRange(fList)
+ Else
+ DataList.Clear()
+ For Each f In fList
+ x = New XmlFile(f,, False) With {.AllowSameNames = True, .XmlReadOnly = True}
+ x.LoadData()
+ If x.Count > 0 Then DataList.ListAddList(x, lcr)
+ x.Dispose()
+ Next
+ CleanDataList()
+ RefillList(False)
+ End If
Else
MsgBoxE(m)
End If
@@ -254,7 +353,7 @@ Namespace DownloadObjects
x.LoadData()
If x.Count > 0 Then DataList.Clear() : DataList.ListAddList(x, lcr)
x.Dispose()
- __clearList.Invoke
+ CleanDataList()
RefillList(False)
Else
m.Text = "Saved sessions not found"
@@ -265,6 +364,147 @@ Namespace DownloadObjects
ErrorsDescriber.Execute(EDP.SendToLog, ex, $"[DownloadObjects.DownloadFeedForm.SessionChooser({GetLast})]")
End Try
End Sub
+#End Region
+#Region "Load fav, spec"
+ Private Sub BTT_LOAD_FAV_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_FAV.Click
+ DataList.Clear()
+ With Settings.Feeds.Favorite
+ .RemoveNotExist(FileNotExist)
+ If .Count > 0 Then DataList.AddRange(.Self) : CleanDataList() : RefillList(False)
+ End With
+ End Sub
+ Private Sub BTT_LOAD_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_LOAD_SPEC.Click
+ With FeedSpecialCollection.ChooseFeeds(False)
+ If .ListExists Then
+ DataList.Clear()
+ Dim d As New List(Of UserMediaD)
+ .ForEach(Sub(ByVal f As FeedSpecial)
+ f.RemoveNotExist(FileNotExist)
+ If f.Count > 0 Then d.AddRange(f)
+ End Sub)
+ If d.Count > 0 Then DataList.ListAddList(d.Distinct)
+ CleanDataList()
+ RefillList(False)
+ End If
+ End With
+ End Sub
+#End Region
+#Region "Add remove fav spec"
+ Private Sub BTT_FEED_ADD_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_FAV.Click
+ Settings.Feeds.Favorite.Add(GetCheckedMedia())
+ End Sub
+ Private Sub BTT_FEED_REMOVE_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_FAV.Click
+ Settings.Feeds.Favorite.Remove(GetCheckedMedia())
+ End Sub
+ 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)
+ If .ListExists Then .ForEach(Sub(f) f.Add(c))
+ End With
+ Else
+ MsgBoxE({"You haven't selected media to add to your feed(s)", "Add to feed(s)"}, vbExclamation)
+ End If
+ End Sub
+ Private Sub BTT_FEED_REMOVE_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_SPEC.Click
+ Dim c As IEnumerable(Of UserMediaD) = GetCheckedMedia()
+ If c.ListExists Then
+ With FeedSpecialCollection.ChooseFeeds(False)
+ If .ListExists Then .ForEach(Sub(f) f.Remove(c))
+ End With
+ Else
+ MsgBoxE({"You haven't selected media to remove from your feed(s)", "Remove from feed(s)"}, vbExclamation)
+ End If
+ End Sub
+ Private Function GetCheckedMedia() As IEnumerable(Of UserMediaD)
+ Return ControlInvoke(Of IEnumerable(Of UserMediaD))(TP_DATA,
+ Function() As IEnumerable(Of UserMediaD)
+ If TP_DATA.Controls.Count > 0 Then
+ Return (From cnt As FeedMedia In TP_DATA.Controls Where cnt.Checked Select cnt.Media)
+ Else
+ Return New UserMediaD() {}
+ End If
+ End Function, New UserMediaD() {}, EDP.ReturnValue)
+ End Function
+#End Region
+#Region "Clear delete"
+ Private Sub BTT_FEED_CLEAR_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_CLEAR_FAV.Click
+ If MsgBoxE({"Are you sure you want to clear your Favorite feed?", "Clear feed"}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then _
+ Settings.Feeds.Favorite.Delete()
+ End Sub
+ Private Sub BTT_FEED_CLEAR_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_CLEAR_SPEC.Click
+ With FeedSpecialCollection.ChooseFeeds(False)
+ If .ListExists Then
+ If MsgBoxE({$"Are you sure you want to clear the following feeds?{vbCr}{vbCr}{ .ListToString(vbCr)}", "Clear feed"}, vbExclamation,,,
+ {"Process", "Cancel"}) = 0 Then .ForEach(Sub(f) f.Clear())
+ End If
+ End With
+ End Sub
+ Private Sub BTT_FEED_DELETE_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_DELETE_SPEC.Click
+ With FeedSpecialCollection.ChooseFeeds(False)
+ If .ListExists Then
+ If MsgBoxE({$"Are you sure you want to delete the following feeds?{vbCr}{vbCr}{ .ListToString(vbCr)}", "Delete feed"}, vbExclamation,,,
+ {"Process", "Cancel"}) = 0 Then .ForEach(Sub(f) f.Delete())
+ End If
+ End With
+ End Sub
+ Private Sub BTT_FEED_DELETE_DAILY_LIST_Click(sender As Object, e As EventArgs) Handles BTT_FEED_DELETE_DAILY_LIST.Click
+ Try
+ Dim l As New List(Of SFile)
+ SessionChooser(False, True, l)
+ If l.Count > 0 Then
+ If MsgBoxE({$"Are you sure you want to delete the following sessions?{vbCr}{vbCr}{l.ListToStringE(vbCr, SessionDateStringProvider)}", "Delete session"}, vbExclamation,,,
+ {"Process", "Cancel"}) = 0 Then
+ l.ForEach(Sub(f) f.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.None))
+ MsgBoxE({"Sessions have been deleted", "Delete session"})
+ End If
+ End If
+ Catch ex As Exception
+ ErrorsDescriber.Execute(EDP.SendToLog, ex, "Delete daily sessions (by list)")
+ MainFrameObj.UpdateLogButton()
+ End Try
+ End Sub
+ Private Sub BTT_FEED_DELETE_DAILY_DATE_Click(sender As Object, e As EventArgs) Handles BTT_FEED_DELETE_DAILY_DATE.Click
+ Try
+ Using f As New DateTimeSelectionForm(DTSModes.CheckBoxes + DTSModes.Date + DTSModes.Start + DTSModes.End, Settings.Design) With {
+ .DesignXMLNodeName = "SessionRemoverDateTimeForm"
+ }
+ f.ShowDialog()
+ If f.DialogResult = DialogResult.OK Then
+ Dim _dStart As Date? = f.MyDateStart
+ Dim _dEnd As Date? = f.MyDateEnd
+ If _dStart.HasValue Or _dEnd.HasValue Then
+ Dim dStart As Date = If(_dStart, Date.MinValue)
+ dStart = dStart.Date
+ Dim dEnd As Date = If(_dEnd, Date.MaxValue)
+ dEnd = dEnd.Date
+ Dim filesDir As SFile = TDownloader.SessionsPath.CSFileP
+ If filesDir.Exists(SFO.Path, False) Then
+ Dim files As List(Of SFile) = SFile.GetFiles(filesDir, "*.xml",, EDP.ReturnValue)
+ If files.ListExists Then files.RemoveAll(Settings.Feeds.FeedSpecialRemover)
+ If files.ListExists Then
+ Dim fd As IEnumerable(Of KeyValuePair(Of SFile, Date?)) =
+ files.Select(Function(ff) New KeyValuePair(Of SFile, Date?)(
+ ff, AConvert(Of Date)(ff.Name, SessionDateTimeProvider, AModes.Var, Nothing)))
+ If fd.ListExists Then
+ For Each optFile As KeyValuePair(Of SFile, Date?) In fd
+ If optFile.Value.HasValue AndAlso optFile.Value.Value.ValueBetween(dStart, dEnd) Then _
+ optFile.Key.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.None)
+ Next
+ End If
+ End If
+ End If
+ End If
+ End If
+ End Using
+ Catch ex As Exception
+ ErrorsDescriber.Execute(EDP.SendToLog, ex, "Delete daily sessions (by date)")
+ MainFrameObj.UpdateLogButton()
+ End Try
+ 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
Dim __refill As Boolean = False
ControlInvokeFast(ToolbarTOP, Sender,
@@ -283,6 +523,19 @@ Namespace DownloadObjects
End Sub, EDP.None)
If __refill Then RefillList()
End Sub
+#End Region
+ Friend Sub Downloader_FilesChanged(ByVal Added As Boolean)
+ ControlInvokeFast(ToolbarTOP, BTT_REFRESH, Sub() BTT_REFRESH.ToolTipText = If(Added, "New files found", "Some files have been removed"))
+ BTT_REFRESH.ControlChangeColor(ToolbarTOP, Added, False)
+ End Sub
+ 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/Download/Feed/FeedMedia.Designer.vb b/SCrawler/Download/Feed/FeedMedia.Designer.vb
index d9dca91..0e54a09 100644
--- a/SCrawler/Download/Feed/FeedMedia.Designer.vb
+++ b/SCrawler/Download/Feed/FeedMedia.Designer.vb
@@ -42,6 +42,11 @@ Namespace DownloadObjects
Me.ICON_SITE = New System.Windows.Forms.PictureBox()
Me.TP_MAIN = New System.Windows.Forms.TableLayoutPanel()
Me.LBL_TITLE = New System.Windows.Forms.Label()
+ Me.CONTEXT_SEP_4 = New System.Windows.Forms.ToolStripSeparator()
+ Me.BTT_FEED_ADD_FAV = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_FEED_ADD_SPEC = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_FEED_REMOVE_FAV = New System.Windows.Forms.ToolStripMenuItem()
+ Me.BTT_FEED_REMOVE_SPEC = New System.Windows.Forms.ToolStripMenuItem()
CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator()
CONTEXT_SEP_2 = New System.Windows.Forms.ToolStripSeparator()
TP_LBL = New System.Windows.Forms.TableLayoutPanel()
@@ -54,12 +59,12 @@ Namespace DownloadObjects
'CONTEXT_SEP_1
'
CONTEXT_SEP_1.Name = "CONTEXT_SEP_1"
- CONTEXT_SEP_1.Size = New System.Drawing.Size(134, 6)
+ CONTEXT_SEP_1.Size = New System.Drawing.Size(217, 6)
'
'CONTEXT_SEP_2
'
CONTEXT_SEP_2.Name = "CONTEXT_SEP_2"
- CONTEXT_SEP_2.Size = New System.Drawing.Size(134, 6)
+ CONTEXT_SEP_2.Size = New System.Drawing.Size(217, 6)
'
'TP_LBL
'
@@ -103,76 +108,76 @@ Namespace DownloadObjects
'
'CONTEXT_DATA
'
- Me.CONTEXT_DATA.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.CONTEXT_SEP_0, Me.BTT_CONTEXT_OPEN_MEDIA, Me.BTT_CONTEXT_OPEN_USER, CONTEXT_SEP_1, Me.BTT_CONTEXT_OPEN_USER_URL, Me.BTT_CONTEXT_OPEN_USER_POST, CONTEXT_SEP_2, Me.BTT_CONTEXT_FIND_USER, Me.BTT_CONTEXT_INFO, Me.CONTEXT_SEP_3, Me.BTT_CONTEXT_DELETE})
+ Me.CONTEXT_DATA.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.CONTEXT_SEP_0, Me.BTT_CONTEXT_OPEN_MEDIA, Me.BTT_CONTEXT_OPEN_USER, CONTEXT_SEP_1, Me.BTT_CONTEXT_OPEN_USER_URL, Me.BTT_CONTEXT_OPEN_USER_POST, CONTEXT_SEP_2, Me.BTT_FEED_ADD_FAV, Me.BTT_FEED_ADD_SPEC, Me.BTT_FEED_REMOVE_FAV, Me.BTT_FEED_REMOVE_SPEC, Me.CONTEXT_SEP_3, Me.BTT_CONTEXT_FIND_USER, Me.BTT_CONTEXT_INFO, Me.CONTEXT_SEP_4, Me.BTT_CONTEXT_DELETE})
Me.CONTEXT_DATA.Name = "CONTEXT_PIC"
- Me.CONTEXT_DATA.Size = New System.Drawing.Size(138, 204)
+ Me.CONTEXT_DATA.Size = New System.Drawing.Size(221, 320)
'
'BTT_CONTEXT_DOWN
'
Me.BTT_CONTEXT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_Green_16
Me.BTT_CONTEXT_DOWN.Name = "BTT_CONTEXT_DOWN"
- Me.BTT_CONTEXT_DOWN.Size = New System.Drawing.Size(137, 22)
+ Me.BTT_CONTEXT_DOWN.Size = New System.Drawing.Size(220, 22)
Me.BTT_CONTEXT_DOWN.Text = "Download"
Me.BTT_CONTEXT_DOWN.Visible = False
'
'CONTEXT_SEP_0
'
Me.CONTEXT_SEP_0.Name = "CONTEXT_SEP_0"
- Me.CONTEXT_SEP_0.Size = New System.Drawing.Size(134, 6)
+ Me.CONTEXT_SEP_0.Size = New System.Drawing.Size(217, 6)
Me.CONTEXT_SEP_0.Visible = False
'
'BTT_CONTEXT_OPEN_MEDIA
'
Me.BTT_CONTEXT_OPEN_MEDIA.Image = Global.SCrawler.My.Resources.Resources.FolderPic_32
Me.BTT_CONTEXT_OPEN_MEDIA.Name = "BTT_CONTEXT_OPEN_MEDIA"
- Me.BTT_CONTEXT_OPEN_MEDIA.Size = New System.Drawing.Size(137, 22)
+ Me.BTT_CONTEXT_OPEN_MEDIA.Size = New System.Drawing.Size(220, 22)
Me.BTT_CONTEXT_OPEN_MEDIA.Text = "Open"
'
'BTT_CONTEXT_OPEN_USER
'
Me.BTT_CONTEXT_OPEN_USER.Image = Global.SCrawler.My.Resources.Resources.FolderPic_32
Me.BTT_CONTEXT_OPEN_USER.Name = "BTT_CONTEXT_OPEN_USER"
- Me.BTT_CONTEXT_OPEN_USER.Size = New System.Drawing.Size(137, 22)
+ Me.BTT_CONTEXT_OPEN_USER.Size = New System.Drawing.Size(220, 22)
Me.BTT_CONTEXT_OPEN_USER.Text = "Open user"
'
'BTT_CONTEXT_OPEN_USER_URL
'
Me.BTT_CONTEXT_OPEN_USER_URL.Image = Global.SCrawler.My.Resources.Resources.GlobePic_32
Me.BTT_CONTEXT_OPEN_USER_URL.Name = "BTT_CONTEXT_OPEN_USER_URL"
- Me.BTT_CONTEXT_OPEN_USER_URL.Size = New System.Drawing.Size(137, 22)
+ Me.BTT_CONTEXT_OPEN_USER_URL.Size = New System.Drawing.Size(220, 22)
Me.BTT_CONTEXT_OPEN_USER_URL.Text = "Open user"
'
'BTT_CONTEXT_OPEN_USER_POST
'
Me.BTT_CONTEXT_OPEN_USER_POST.Image = Global.SCrawler.My.Resources.Resources.GlobePic_32
Me.BTT_CONTEXT_OPEN_USER_POST.Name = "BTT_CONTEXT_OPEN_USER_POST"
- Me.BTT_CONTEXT_OPEN_USER_POST.Size = New System.Drawing.Size(137, 22)
+ Me.BTT_CONTEXT_OPEN_USER_POST.Size = New System.Drawing.Size(220, 22)
Me.BTT_CONTEXT_OPEN_USER_POST.Text = "Open post"
'
'BTT_CONTEXT_FIND_USER
'
Me.BTT_CONTEXT_FIND_USER.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32
Me.BTT_CONTEXT_FIND_USER.Name = "BTT_CONTEXT_FIND_USER"
- Me.BTT_CONTEXT_FIND_USER.Size = New System.Drawing.Size(137, 22)
+ Me.BTT_CONTEXT_FIND_USER.Size = New System.Drawing.Size(220, 22)
Me.BTT_CONTEXT_FIND_USER.Text = "Find user"
'
'BTT_CONTEXT_INFO
'
Me.BTT_CONTEXT_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32
Me.BTT_CONTEXT_INFO.Name = "BTT_CONTEXT_INFO"
- Me.BTT_CONTEXT_INFO.Size = New System.Drawing.Size(137, 22)
+ Me.BTT_CONTEXT_INFO.Size = New System.Drawing.Size(220, 22)
Me.BTT_CONTEXT_INFO.Text = "Information"
'
'CONTEXT_SEP_3
'
Me.CONTEXT_SEP_3.Name = "CONTEXT_SEP_3"
- Me.CONTEXT_SEP_3.Size = New System.Drawing.Size(134, 6)
+ Me.CONTEXT_SEP_3.Size = New System.Drawing.Size(217, 6)
'
'BTT_CONTEXT_DELETE
'
Me.BTT_CONTEXT_DELETE.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
Me.BTT_CONTEXT_DELETE.Name = "BTT_CONTEXT_DELETE"
- Me.BTT_CONTEXT_DELETE.Size = New System.Drawing.Size(137, 22)
+ Me.BTT_CONTEXT_DELETE.Size = New System.Drawing.Size(220, 22)
Me.BTT_CONTEXT_DELETE.Text = "Delete"
'
'ICON_SITE
@@ -212,6 +217,39 @@ Namespace DownloadObjects
Me.LBL_TITLE.Size = New System.Drawing.Size(140, 25)
Me.LBL_TITLE.TabIndex = 1
'
+ 'CONTEXT_SEP_4
+ '
+ Me.CONTEXT_SEP_4.Name = "CONTEXT_SEP_4"
+ Me.CONTEXT_SEP_4.Size = New System.Drawing.Size(217, 6)
+ '
+ 'BTT_FEED_ADD_FAV
+ '
+ Me.BTT_FEED_ADD_FAV.Image = Global.SCrawler.My.Resources.Resources.HeartPic_32
+ Me.BTT_FEED_ADD_FAV.Name = "BTT_FEED_ADD_FAV"
+ Me.BTT_FEED_ADD_FAV.Size = New System.Drawing.Size(220, 22)
+ Me.BTT_FEED_ADD_FAV.Text = "Add to Favorite"
+ '
+ 'BTT_FEED_ADD_SPEC
+ '
+ Me.BTT_FEED_ADD_SPEC.Image = Global.SCrawler.My.Resources.Resources.RSSPic_512
+ Me.BTT_FEED_ADD_SPEC.Name = "BTT_FEED_ADD_SPEC"
+ Me.BTT_FEED_ADD_SPEC.Size = New System.Drawing.Size(220, 22)
+ Me.BTT_FEED_ADD_SPEC.Text = "Add to special feed..."
+ '
+ 'BTT_FEED_REMOVE_FAV
+ '
+ Me.BTT_FEED_REMOVE_FAV.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
+ Me.BTT_FEED_REMOVE_FAV.Name = "BTT_FEED_REMOVE_FAV"
+ Me.BTT_FEED_REMOVE_FAV.Size = New System.Drawing.Size(220, 22)
+ Me.BTT_FEED_REMOVE_FAV.Text = "Remove from Favorite"
+ '
+ 'BTT_FEED_REMOVE_SPEC
+ '
+ Me.BTT_FEED_REMOVE_SPEC.Image = Global.SCrawler.My.Resources.Resources.DeletePic_24
+ Me.BTT_FEED_REMOVE_SPEC.Name = "BTT_FEED_REMOVE_SPEC"
+ Me.BTT_FEED_REMOVE_SPEC.Size = New System.Drawing.Size(220, 22)
+ Me.BTT_FEED_REMOVE_SPEC.Text = "Remove from special feed..."
+ '
'FeedMedia
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
@@ -249,5 +287,10 @@ Namespace DownloadObjects
Private WithEvents BTT_CONTEXT_DOWN As ToolStripMenuItem
Private WithEvents CONTEXT_SEP_0 As ToolStripSeparator
Private WithEvents LBL_TITLE As Label
+ Private WithEvents BTT_FEED_ADD_FAV As ToolStripMenuItem
+ Private WithEvents BTT_FEED_ADD_SPEC As ToolStripMenuItem
+ Private WithEvents BTT_FEED_REMOVE_FAV As ToolStripMenuItem
+ Private WithEvents BTT_FEED_REMOVE_SPEC As ToolStripMenuItem
+ Private WithEvents CONTEXT_SEP_4 As ToolStripSeparator
End Class
End Namespace
\ No newline at end of file
diff --git a/SCrawler/Download/Feed/FeedMedia.vb b/SCrawler/Download/Feed/FeedMedia.vb
index a076948..347931b 100644
--- a/SCrawler/Download/Feed/FeedMedia.vb
+++ b/SCrawler/Download/Feed/FeedMedia.vb
@@ -61,6 +61,7 @@ Namespace DownloadObjects
End Property
Private ReadOnly UserKey As String
Friend ReadOnly Post As UserMedia
+ Friend ReadOnly Media As UserMediaD
Friend Property Checked As Boolean
Get
Return CH_CHECKED.Checked
@@ -161,6 +162,7 @@ Namespace DownloadObjects
Friend Sub New(ByVal Media As UserMediaD, ByVal Width As Integer, ByVal Height As Integer)
Try
InitializeComponent()
+ Me.Media = Media
IsSubscription = If(Media.User?.IsSubscription, False)
If IsSubscription Then
@@ -174,7 +176,7 @@ Namespace DownloadObjects
BTT_CONTEXT_DOWN.Visible = True
CONTEXT_SEP_0.Visible = True
BTT_CONTEXT_OPEN_USER.Visible = False
- CONTEXT_SEP_3.Visible = False
+ CONTEXT_SEP_4.Visible = False
BTT_CONTEXT_DELETE.Visible = False
If Not Media.Data.URL.IsEmptyString Then
@@ -297,6 +299,7 @@ Namespace DownloadObjects
Else
Throw New ArgumentNullException With {.HelpLink = 1}
End If
+ If Settings.Feeds.Favorite.Contains(Media) Then BTT_FEED_ADD_FAV.ControlChangeColor(True, False)
Catch aex As ArgumentNullException When aex.HelpLink = 1
HasError = True
Catch tex As Threading.ThreadStateException
@@ -336,9 +339,12 @@ Namespace DownloadObjects
End Sub
#End Region
#Region "Context"
+#Region "Down"
Private Sub BTT_CONTEXT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN.Click
RaiseEvent MediaDownload(Me, EventArgs.Empty)
End Sub
+#End Region
+#Region "Open media, folder"
Private Sub BTT_CONTEXT_OPEN_MEDIA_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_MEDIA.Click
File.Open()
End Sub
@@ -348,6 +354,8 @@ Namespace DownloadObjects
If Not u Is Nothing Then u.OpenFolder()
End If
End Sub
+#End Region
+#Region "Open URL"
Private Sub BTT_CONTEXT_OPEN_USER_URL_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_USER_URL.Click
If Not UserKey.IsEmptyString Then
Dim u As IUserData = Settings.GetUser(UserKey)
@@ -372,15 +380,44 @@ Namespace DownloadObjects
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, $"[FeedMedia.OpenPost({UserKey}, {Post.Post.ID})]")
End Try
End Sub
+#End Region
+#Region "Feed"
+ Private Sub BTT_FEED_ADD_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_FAV.Click
+ With Settings.Feeds.Favorite
+ If Not .Contains(Media) Then .Add(Media)
+ BTT_FEED_ADD_FAV.ControlChangeColor(True, False)
+ End With
+ End Sub
+ Private Sub BTT_FEED_ADD_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_ADD_SPEC.Click
+ With FeedSpecialCollection.ChooseFeeds(True)
+ If .ListExists Then .ForEach(Sub(f) f.Add(Media))
+ End With
+ End Sub
+ Private Sub BTT_FEED_REMOVE_FAV_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_FAV.Click
+ With Settings.Feeds.Favorite
+ If .Contains(Media) Then .Remove(Media)
+ BTT_FEED_ADD_FAV.ControlChangeColor(True)
+ End With
+ End Sub
+ Private Sub BTT_FEED_REMOVE_SPEC_Click(sender As Object, e As EventArgs) Handles BTT_FEED_REMOVE_SPEC.Click
+ With FeedSpecialCollection.ChooseFeeds(False)
+ If .ListExists Then .ForEach(Sub(f) f.Remove(Media))
+ End With
+ End Sub
+#End Region
+#Region "Info"
Private Sub BTT_CONTEXT_FIND_USER_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_FIND_USER.Click
If Not UserKey.IsEmptyString Then MainFrameObj.FocusUser(UserKey, True)
End Sub
Private Sub BTT_CONTEXT_INFO_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_INFO.Click
MsgBoxE({Information, "Post information"})
End Sub
+#End Region
+#Region "Delete"
Private Sub BTT_CONTEXT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DELETE.Click
DeleteFile(False)
End Sub
+#End Region
Friend Function DeleteFile(ByVal Silent As Boolean) As Boolean
Const msgTitle$ = "Deleting a file"
Try
diff --git a/SCrawler/Download/Feed/FeedSpecial.vb b/SCrawler/Download/Feed/FeedSpecial.vb
new file mode 100644
index 0000000..a6e8b62
--- /dev/null
+++ b/SCrawler/Download/Feed/FeedSpecial.vb
@@ -0,0 +1,252 @@
+' Copyright (C) 2023 Andy https://github.com/AAndyProgram
+' This program is free software: you can redistribute it and/or modify
+' it under the terms of the GNU General Public License as published by
+' the Free Software Foundation, either version 3 of the License, or
+' (at your option) any later version.
+'
+' This program is distributed in the hope that it will be useful,
+' but WITHOUT ANY WARRANTY
+Imports PersonalUtilities.Tools
+Imports PersonalUtilities.Functions.XML
+Imports UserMediaD = SCrawler.DownloadObjects.TDownloader.UserMediaD
+Namespace DownloadObjects
+ Friend Class FeedSpecial : Implements IEnumerable(Of UserMediaD), IMyEnumerator(Of UserMediaD), IDisposableSuspend
+#Region "SEComparer"
+ Friend Class SEComparer : Implements IComparer(Of UserMediaD)
+ Friend Function Compare(ByVal x As UserMediaD, ByVal y As UserMediaD) As Integer Implements IComparer(Of UserMediaD).Compare
+ Dim v% = x.Date.Ticks.CompareTo(y.Date.Ticks) * -1
+ If v <> 0 Then Return v
+ v = If(x.User?.GetHashCode, 0).CompareTo(If(y.User?.GetHashCode, 0))
+ If v <> 0 Then Return v
+ Return 0
+ End Function
+ End Class
+#End Region
+#Region "Events"
+ Friend Event FeedDeleted As FeedSpecialCollection.FeedActionEventHandler
+#End Region
+#Region "Declarations"
+ Friend Const FavoriteName As String = "Favorite"
+ Friend Const SpecialName As String = "Special"
+ Private ReadOnly Items As List(Of UserMediaD)
+ Private _File As SFile
+ Friend ReadOnly Property File As SFile
+ Get
+ If _File.IsEmptyString AndAlso Not Name.IsEmptyString Then
+ If _IsFavorite Then
+ _File = $"{TDownloader.SessionsPath}{FavoriteName}.xml"
+ Else
+ _File = $"{TDownloader.SessionsPath}{SpecialName}_{Name}.xml"
+ End If
+ End If
+ Return _File
+ End Get
+ End Property
+ Private _IsFavorite As Boolean
+ Friend ReadOnly Property IsFavorite As Boolean
+ Get
+ Return _IsFavorite
+ End Get
+ End Property
+ Private _Name As String
+ Friend ReadOnly Property Name As String
+ Get
+ If _Name.IsEmptyString And IsFavorite Then
+ Return FavoriteName
+ Else
+ Return _Name
+ End If
+ End Get
+ End Property
+#End Region
+#Region "Initializers"
+ Private Sub New()
+ Items = New List(Of UserMediaD)
+ End Sub
+ Friend Sub New(ByVal f As SFile)
+ Me.New
+ _File = f
+ If Not File.Name.IsEmptyString Then
+ _IsFavorite = File.Name.StartsWith(FavoriteName)
+ If Not _IsFavorite Then _Name = File.Name.Split("_").ListTake(0, 100, EDP.ReturnValue).ListToString("").StringTrim.StringTrimStart("_")
+ End If
+ Load()
+ End Sub
+ Friend Shared Function CreateFavorite() As FeedSpecial
+ Return New FeedSpecial With {._IsFavorite = True}
+ End Function
+ Friend Shared Function CreateSpecial(ByVal Name As String) As FeedSpecial
+ Return New FeedSpecial With {._Name = Name}
+ End Function
+ Friend Sub Load()
+ If File.Exists Then
+ Using x As New XmlFile(File, Protector.Modes.All, False) With {.AllowSameNames = True}
+ x.LoadData()
+ If x.Count > 0 Then Items.ListAddList(x, LAP.IgnoreICopier)
+ End Using
+ End If
+ End Sub
+#End Region
+#Region "Data functions"
+#Region "Item, Count"
+ Default Friend ReadOnly Property Item(ByVal Index As Integer) As UserMediaD Implements IMyEnumerator(Of UserMediaD).MyEnumeratorObject
+ Get
+ Return Items(Index)
+ End Get
+ End Property
+ Friend ReadOnly Property Count As Integer Implements IMyEnumerator(Of UserMediaD).MyEnumeratorCount
+ Get
+ Return Items.Count
+ End Get
+ End Property
+#End Region
+#Region "Clear, Sort, Save"
+ Friend Function Clear()
+ Dim result As Boolean = Count > 0
+ Items.Clear()
+ If result Then Save()
+ Return result
+ End Function
+ Friend Sub Sort()
+ If Count > 0 Then Items.Sort(Settings.Feeds.Comparer)
+ End Sub
+ Friend Sub Save()
+ If Not File.IsEmptyString Then
+ Sort()
+ Using x As New XmlFile With {.Name = "Feed", .AllowSameNames = True}
+ x.AddRange(Items)
+ x.Save(File, EDP.SendToLog)
+ End Using
+ End If
+ End Sub
+#End Region
+#Region "Add"
+ Friend Overloads Function Add(ByVal Item As UserMediaD, Optional ByVal AutoSave As Boolean = True) As Boolean
+ If Not Items.Contains(Item) Then
+ Items.Add(Item)
+ If AutoSave Then Save()
+ Return True
+ Else
+ Return False
+ End If
+ End Function
+ Friend Overloads Function Add(ByVal Items As IEnumerable(Of UserMediaD), Optional ByVal AutoSave As Boolean = True) As Integer
+ Dim ri% = 0
+ If Items.ListExists Then
+ For Each item As UserMediaD In Items : ri += Add(item, False).BoolToInteger : Next
+ If ri > 0 And AutoSave Then Save()
+ End If
+ Return ri
+ End Function
+#End Region
+#Region "Remove"
+ Friend Overloads Function Remove(ByVal Item As UserMediaD, Optional ByVal AutoSave As Boolean = True) As Boolean
+ If Count > 0 Then
+ Dim i% = Items.IndexOf(Item)
+ If i >= 0 Then
+ Items.RemoveAt(i)
+ If AutoSave Then Save()
+ Return True
+ End If
+ End If
+ Return False
+ End Function
+ Friend Overloads Function Remove(ByVal Items As IEnumerable(Of UserMediaD), Optional ByVal AutoSave As Boolean = True) As Integer
+ Dim ri% = 0
+ If Items.ListExists Then
+ For Each item As UserMediaD In Items : ri += Me.Items.Remove(item).BoolToInteger : Next
+ If ri > 0 And AutoSave Then Save()
+ End If
+ Return ri
+ End Function
+ Private _NotExistRemoved As Boolean = False
+ Friend Function RemoveNotExist(ByVal p As Predicate(Of UserMediaD)) As Integer
+ If Count > 0 And Not _NotExistRemoved Then
+ _NotExistRemoved = True
+ Dim ri% = Items.RemoveAll(p)
+ If ri > 0 Then Save()
+ Return ri
+ Else
+ Return 0
+ End If
+ End Function
+#End Region
+#Region "Delete"
+ Friend Overloads Function Delete() As Boolean
+ If File.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.ReturnValue) Then
+ Items.Clear()
+ RaiseEvent FeedDeleted(Settings.Feeds, Me)
+ Return True
+ Else
+ Return False
+ End If
+ End Function
+ Friend Overloads Function Delete(ByVal Item As UserMediaD, Optional ByVal AutoSave As Boolean = True) As Boolean
+ Dim result As Boolean = False
+ If Item.Data.File.Exists Then result = Item.Data.File.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.ReturnValue)
+ If result And AutoSave Then Save()
+ Return result
+ End Function
+#End Region
+#Region "Contains"
+ Friend Function Contains(ByVal Item As UserMediaD) As Boolean
+ Return Items.Contains(Item)
+ End Function
+#End Region
+#End Region
+#Region "Base Overrides"
+ Public Overrides Function ToString() As String
+ Return Name
+ End Function
+ Public Overrides Function GetHashCode() As Integer
+ Return Name.GetHashCode
+ End Function
+ Public Overrides Function Equals(ByVal Obj As Object) As Boolean
+ If Not IsNothing(Obj) Then
+ If TypeOf Obj Is FeedSpecial Then
+ Return Name = DirectCast(Obj, FeedSpecial).Name
+ ElseIf TypeOf Obj Is String Then
+ Return Name = CStr(Obj)
+ End If
+ End If
+ Return False
+ End Function
+#End Region
+#Region "IEnumerable Support"
+ Private Function GetEnumerator() As IEnumerator(Of UserMediaD) Implements IEnumerable(Of UserMediaD).GetEnumerator
+ Return New MyEnumerator(Of UserMediaD)(Me)
+ End Function
+ Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
+ Return GetEnumerator()
+ End Function
+#End Region
+#Region "IDisposable Support"
+ Friend Property DisposeSuspended As Boolean Implements IDisposableSuspend.DisposeSuspended
+ Get
+ Return IsFavorite
+ End Get
+ Private Set : End Set
+ End Property
+ Friend ReadOnly Property Disposed As Boolean Implements IDisposableSuspend.Disposed
+ Get
+ Return disposedValue
+ End Get
+ End Property
+ Private disposedValue As Boolean = False
+ Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
+ If Not disposedValue Then
+ If disposing Then Items.Clear()
+ disposedValue = True
+ End If
+ End Sub
+ Protected Overrides Sub Finalize()
+ Dispose(False)
+ MyBase.Finalize()
+ End Sub
+ Friend Overloads Sub Dispose() Implements IDisposable.Dispose
+ Dispose(True)
+ GC.SuppressFinalize(Me)
+ End Sub
+#End Region
+ End Class
+End Namespace
\ No newline at end of file
diff --git a/SCrawler/Download/Feed/FeedSpecialCollection.vb b/SCrawler/Download/Feed/FeedSpecialCollection.vb
new file mode 100644
index 0000000..4b50026
--- /dev/null
+++ b/SCrawler/Download/Feed/FeedSpecialCollection.vb
@@ -0,0 +1,169 @@
+' Copyright (C) 2023 Andy https://github.com/AAndyProgram
+' This program is free software: you can redistribute it and/or modify
+' it under the terms of the GNU General Public License as published by
+' the Free Software Foundation, either version 3 of the License, or
+' (at your option) any later version.
+'
+' This program is distributed in the hope that it will be useful,
+' but WITHOUT ANY WARRANTY
+Imports PersonalUtilities.Tools
+Imports PersonalUtilities.Forms
+Namespace DownloadObjects
+ Friend Class FeedSpecialCollection : Implements IEnumerable(Of FeedSpecial), IMyEnumerator(Of FeedSpecial)
+#Region "Events"
+ Friend Delegate Sub FeedActionEventHandler(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
+ Friend Event FeedAdded As FeedActionEventHandler
+ Friend Event FeedRemoved As FeedActionEventHandler
+#End Region
+#Region "FeedsComparer"
+ Private Class FeedsComparer : Implements IComparer(Of FeedSpecial)
+ Friend Function Compare(ByVal x As FeedSpecial, ByVal y As FeedSpecial) As Integer Implements IComparer(Of FeedSpecial).Compare
+ If x.IsFavorite Then
+ Return -1
+ Else
+ Return x.Name.CompareTo(y.Name)
+ End If
+ End Function
+ End Class
+#End Region
+#Region "Declarations"
+ Private ReadOnly Feeds As List(Of FeedSpecial)
+ Private _Favorite As FeedSpecial = Nothing
+ Friend ReadOnly Property Favorite As FeedSpecial
+ Get
+ If _Favorite Is Nothing Then _Favorite = FeedSpecial.CreateFavorite : _Favorite.Load()
+ Return _Favorite
+ End Get
+ End Property
+ Private _Loaded As Boolean = False
+ Friend ReadOnly Property Comparer As New FeedSpecial.SEComparer
+ Private ReadOnly Property ComparerFeeds As New FeedsComparer
+ Friend ReadOnly Property FeedSpecialRemover As Predicate(Of SFile) = Function(f) f.Name.StartsWith(FeedSpecial.FavoriteName) Or f.Name.StartsWith(FeedSpecial.SpecialName)
+#End Region
+#Region "Initializer, loader, feeds handlers"
+ Friend Sub New()
+ Feeds = New List(Of FeedSpecial)
+ End Sub
+ Friend Sub Load()
+ Try
+ If Not _Loaded Then
+ _Loaded = True
+ Dim files As List(Of SFile) = SFile.GetFiles(TDownloader.SessionsPath, $"{FeedSpecial.FavoriteName}.xml|{FeedSpecial.SpecialName}_*.xml",, EDP.ReturnValue)
+ If files.ListExists Then files.ForEach(Sub(f)
+ Feeds.Add(New FeedSpecial(f))
+ With Feeds.Last
+ If .IsFavorite Then _Favorite = .Self
+ AddHandler .FeedDeleted, AddressOf Feeds_FeedDeleted
+ End With
+ End Sub) : files.Clear()
+ End If
+ Catch ex As Exception
+ ErrorsDescriber.Execute(EDP.SendToLog, ex, "[FeedSpecialCollection.Load]")
+ MainFrameObj.UpdateLogButton()
+ End Try
+ End Sub
+ Private Sub Feeds_FeedDeleted(ByVal Source As FeedSpecialCollection, ByVal Feed As FeedSpecial)
+ RaiseEvent FeedRemoved(Me, Feed)
+ If Count > 0 Then Feeds.Remove(Feed)
+ End Sub
+#End Region
+#Region "ChooseFeeds"
+ Friend Shared Function ChooseFeeds(ByVal AllowAdd As Boolean) As List(Of FeedSpecial)
+ Try
+ Dim newFeed$ = String.Empty
+ Using f As New SimpleListForm(Of String)(Settings.Feeds.Select(Function(ff) ff.Name), Settings.Design) With {
+ .DesignXMLNodeName = "FeedsChooserForm",
+ .Icon = My.Resources.RSSIcon_32,
+ .FormText = "Feeds"
+ }
+ If AllowAdd Then f.AddFunction = Sub(ByVal sender As Object, ByVal e As SimpleListFormEventArgs)
+ If newFeed.IsEmptyString Then
+ Dim nf$ = InputBoxE("Enter a new feed name:", "New feed")
+ If Not nf.IsEmptyString Then
+ If Settings.Feeds.ListExists(Function(ff) ff.Name.StringToLower = nf.ToLower) Then
+ MsgBoxE({$"A feed named '{nf}' already exists", "New feed"}, vbCritical)
+ Else
+ newFeed = nf
+ e.Item = nf
+ End If
+ Else
+ MsgBoxE({"You can only create one feed at a time", "New feed"}, vbCritical)
+ End If
+ End If
+ End Sub
+ If f.ShowDialog = DialogResult.OK AndAlso f.DataResult.Count > 0 Then
+ If Not newFeed.IsEmptyString AndAlso f.DataResult.Contains(newFeed) Then Settings.Feeds.Add(newFeed)
+ Return Settings.Feeds.Where(Function(ff) f.DataResult.Contains(ff.Name)).ToList
+ End If
+ End Using
+ Return Nothing
+ Catch ex As Exception
+ Return ErrorsDescriber.Execute(EDP.SendToLog, ex, "[FeedSpecialCollection.ChooseFeeds]")
+ End Try
+ End Function
+#End Region
+#Region "Item, Count"
+ Default Friend ReadOnly Property Item(ByVal Index As Integer) As FeedSpecial Implements IMyEnumerator(Of FeedSpecial).MyEnumeratorObject
+ Get
+ Return Feeds(Index)
+ End Get
+ End Property
+ Friend ReadOnly Property Count As Integer Implements IMyEnumerator(Of FeedSpecial).MyEnumeratorCount
+ Get
+ Return Feeds.Count
+ End Get
+ End Property
+#End Region
+#Region "Add, Delete"
+ Friend Function Add(ByVal Name As String) As Integer
+ Dim i% = -1
+ If Not Name.IsEmptyString Then
+ If Count = 0 Then
+ Feeds.Add(FeedSpecial.CreateSpecial(Name))
+ Feeds.Last.Save()
+ i = Count - 1
+ Else
+ i = Feeds.FindIndex(Function(f) f.Name = Name)
+ If i = -1 Then
+ Feeds.Add(FeedSpecial.CreateSpecial(Name))
+ Feeds.Last.Save()
+ i = Count - 1
+ End If
+ End If
+ End If
+ If i >= 0 Then
+ Feeds.Sort(ComparerFeeds)
+ i = Feeds.FindIndex(Function(f) f.Name = Name)
+ If i >= 0 Then RaiseEvent FeedAdded(Me, Feeds(i))
+ End If
+ Return i
+ End Function
+ Friend Function Delete(ByVal Item As FeedSpecial) As Boolean
+ Dim result As Boolean = False
+ Dim i% = Feeds.IndexOf(Item)
+ If i >= 0 Then
+ With Feeds(i)
+ If .IsFavorite Then
+ result = .Clear
+ Else
+ result = .Delete
+ If result Then
+ .Dispose()
+ Feeds.RemoveAt(i)
+ End If
+ End If
+ End With
+ End If
+ Return result
+ End Function
+#End Region
+#Region "IEnumerable Support"
+ Private Function GetEnumerator() As IEnumerator(Of FeedSpecial) Implements IEnumerable(Of FeedSpecial).GetEnumerator
+ Return New MyEnumerator(Of FeedSpecial)(Me)
+ End Function
+ Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
+ Return GetEnumerator()
+ End Function
+#End Region
+ End Class
+End Namespace
\ No newline at end of file
diff --git a/SCrawler/Download/TDownloader.vb b/SCrawler/Download/TDownloader.vb
index b7cb26c..65ae841 100644
--- a/SCrawler/Download/TDownloader.vb
+++ b/SCrawler/Download/TDownloader.vb
@@ -116,7 +116,11 @@ Namespace DownloadObjects
If Not _FilesSessionCleared Then
_FilesSessionCleared = True
Dim files As List(Of SFile) = SFile.GetFiles(SessionsPath.CSFileP, "*.xml",, EDP.ReturnValue)
- If RenameOldFileNames(files) Then files = SFile.GetFiles(SessionsPath.CSFileP, "*.xml",, EDP.ReturnValue)
+ If files.ListExists Then files.RemoveAll(Settings.Feeds.FeedSpecialRemover)
+ If RenameOldFileNames(files) Then
+ files = SFile.GetFiles(SessionsPath.CSFileP, "*.xml",, EDP.ReturnValue)
+ If files.ListExists Then files.RemoveAll(Settings.Feeds.FeedSpecialRemover)
+ End If
Dim filesCount% = Settings.FeedStoredSessionsNumber
If files.ListExists And filesCount > 0 Then
Dim fe As New ErrorsDescriber(EDP.None)
diff --git a/SCrawler/SCrawler.vbproj b/SCrawler/SCrawler.vbproj
index 74b0486..f845e02 100644
--- a/SCrawler/SCrawler.vbproj
+++ b/SCrawler/SCrawler.vbproj
@@ -264,6 +264,8 @@
UserControl
+
+
FeedVideo.vb
diff --git a/SCrawler/SettingsCLS.vb b/SCrawler/SettingsCLS.vb
index 9bad20d..ae1d3f4 100644
--- a/SCrawler/SettingsCLS.vb
+++ b/SCrawler/SettingsCLS.vb
@@ -131,6 +131,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
Friend ReadOnly Property GlobalLocations As STDownloader.DownloadLocationsCollection
Friend Property Automation As Scheduler
Friend ReadOnly Property AutomationFile As XMLValue(Of SFile)
+ Friend ReadOnly Property Feeds As FeedSpecialCollection
Friend ReadOnly Property BlackList As List(Of UserBan)
Private ReadOnly BlackListFile As SFile = $"{SettingsFolderName}\BlackList.txt"
Private ReadOnly UsersSettingsFile As SFile = $"{SettingsFolderName}\Users.xml"
@@ -148,6 +149,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
LastCollections = New List(Of String)
GlobalLocations = New STDownloader.DownloadLocationsCollection
GlobalLocations.Load(True,, $"{SettingsFolderName}\GlobalLocations.xml")
+ Feeds = New FeedSpecialCollection
Dim n() As String = {"MediaEnvironment"}