diff --git a/SCrawler.YouTube/Base/YouTubeSettings.vb b/SCrawler.YouTube/Base/YouTubeSettings.vb index 4c55c54..4c3c4fd 100644 --- a/SCrawler.YouTube/Base/YouTubeSettings.vb +++ b/SCrawler.YouTube/Base/YouTubeSettings.vb @@ -85,6 +85,18 @@ Namespace API.YouTube.Base Description("The default output path where files should be downloaded."), Editor(GetType(GridSFileTypeEditorPath), GetType(UITypeEditor))> Public ReadOnly Property OutputPath As XMLValue(Of SFile) + + Public ReadOnly Property LatestPlaylistFile As XMLValue(Of SFile) + Private Class GridSFileTypeEditor_M3U8 : Inherits GridSFileTypeEditor + Public Overrides Function EditValue(ByVal Context As ITypeDescriptorContext, ByVal Provider As IServiceProvider, ByVal Value As Object) As Object + Dim f As SFile = SFile.SelectFiles(New SFile(CStr(AConvert(Of String)(Value, AModes.Var, String.Empty))), False, + "Select playlist file", "Playlists|*.m3u;*.m3u8|All files|*.*", EDP.ReturnValue).FirstOrDefault() + If Not f.IsEmptyString() Then Value = f + Return Value + End Function + End Class Public ReadOnly Property OutputPathAutoChange As XMLValue(Of Boolean) @@ -230,7 +242,6 @@ Namespace API.YouTube.Base Friend ReadOnly Property ProgramDescription As XMLValue(Of String) - Friend ReadOnly Property LatestPlaylistFile As XMLValue(Of String) #End Region #Region "Defaults ChannelsDownload" + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAFFJREFUOE9joAr49u3bf1Lw169f50O1QgBI0MnJCY4/vP8Ix8hiILqtrQ3TEFIM + AGGYIVDtpBsAwkQbgIyR1dDWAGLwqAGD0gByMFQ7JYCBAQChNviRiQ8ETwAAAABJRU5ErkJggg== + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -232,7 +239,7 @@ cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE @@ -254,7 +261,7 @@ 0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -262,7 +269,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t 3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL @@ -352,7 +359,23 @@ AAAASUVORK5CYII= - + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAFFJREFUOE9joAr49u3bf1Lw169f50O1QgBI0MnJCY4/vP8Ix8hiILqtrQ3TEFIM + AGGYIVDtpBsAwkQbgIyR1dDWAGLwqAGD0gByMFQ7JYCBAQChNviRiQ8ETwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAeElE + QVQ4T2P4//8/RRhMFHQfKgDi/yAaXQEhDCZAmkNbnvyXta4CciESLEws//FhmDqYAQUgzUBMngsowVgF + ScFgYjQQsUsQi8FEYsXyAiD+D6LRFRDCYAKk2bPo6H9J40wgFyKBLeCQMUwdzIACkGYgHnKB+J8BAD5Q + tqhi4tzWAAAAAElFTkSuQmCC + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -363,7 +386,7 @@ cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE @@ -385,7 +408,7 @@ 0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -393,7 +416,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t 3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL diff --git a/SCrawler.YouTube/Controls/MusicPlaylistsForm.vb b/SCrawler.YouTube/Controls/MusicPlaylistsForm.vb index 58a02d2..e267b26 100644 --- a/SCrawler.YouTube/Controls/MusicPlaylistsForm.vb +++ b/SCrawler.YouTube/Controls/MusicPlaylistsForm.vb @@ -23,6 +23,12 @@ Namespace API.YouTube.Controls Private Property DesignXMLNodes As String() Implements IDesignXMLContainer.DesignXMLNodes Private Property DesignXMLNodeName As String Implements IDesignXMLContainer.DesignXMLNodeName Private ReadOnly MyContainer As IYouTubeMediaContainer + Private ReadOnly M3U8Files As List(Of SFile) + Private ReadOnly Property M3U8FilesFull As List(Of SFile) + Get + Return ListAddList(Nothing, M3U8Files, LAP.NotContainsOnly).ListAddValue(CMB_PLS.Text, LAP.NotContainsOnly) + End Get + End Property Private Initializing As Boolean = True Private ReadOnly Property Current As IYouTubeMediaContainer Get @@ -40,6 +46,7 @@ Namespace API.YouTube.Controls #Region "Initializer" Friend Sub New(ByVal Container As IYouTubeMediaContainer) InitializeComponent() + M3U8Files = New List(Of SFile) MyContainer = Container End Sub #End Region @@ -114,6 +121,7 @@ Namespace API.YouTube.Controls Private Sub MusicPlaylistsForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing MyYouTubeSettings.PlaylistFormSplitterDistance.Value = SPLITTER_MAIN.SplitterDistancePercentageGet MyView.DisposeIfReady() + M3U8Files.Clear() End Sub Private Sub MusicPlaylistsForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown Dim b As Boolean = True @@ -183,27 +191,49 @@ Namespace API.YouTube.Controls End With End Sub Private Sub TXT_OUTPUT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles TXT_OUTPUT_PATH.ActionOnButtonClick - If Sender.DefaultButton = ADB.Open Or Sender.DefaultButton = ADB.Add Then _ - MyYouTubeSettings.DownloadLocations.ChooseNewLocation(TXT_OUTPUT_PATH, Sender.DefaultButton = ADB.Add, MyDownloaderSettings.OutputPathAskForName) + Select Case e.DefaultButton + Case ADB.Open, ADB.Add + MyYouTubeSettings.DownloadLocations.ChooseNewLocation(TXT_OUTPUT_PATH, e.DefaultButton = ADB.Add, MyDownloaderSettings.OutputPathAskForName) + Case ADB.Save + If Not TXT_OUTPUT_PATH.Text.IsEmptyString Then + With MyYouTubeSettings.PlaylistsLocations + .Add(TXT_OUTPUT_PATH.Text, True) + .PopulateComboBox(TXT_OUTPUT_PATH, TXT_OUTPUT_PATH.Text) + End With + End If + End Select End Sub Private Sub CMB_PLS_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles CMB_PLS.ActionOnButtonClick Try - If Sender.DefaultButton = ADB.Add Or Sender.DefaultButton = ADB.Open Then - Dim f As SFile = Nothing - If Not CMB_PLS.Text.IsEmptyString Then - f = CMB_PLS.Text - ElseIf Not TXT_OUTPUT_PATH.Text.IsEmptyString Then - f = TXT_OUTPUT_PATH.Text - End If - f = SFile.SelectFiles(f, False, "Select a playlist...", "Playlists|*.m3u;*.m3u8|All files|*.*", EDP.ReturnValue).FirstOrDefault - If Not f.IsEmptyString Then - If Sender.DefaultButton = ADB.Add Then - MyYouTubeSettings.PlaylistsLocations.Add(f.ToString, True, True) - MyYouTubeSettings.PlaylistsLocations.PopulateComboBox(CMB_PLS, f, True) + Select Case e.DefaultButton + Case ADB.Add, ADB.Open + Dim f As SFile = Nothing + If Not CMB_PLS.Text.IsEmptyString Then + f = CMB_PLS.Text + ElseIf Not TXT_OUTPUT_PATH.Text.IsEmptyString Then + f = TXT_OUTPUT_PATH.Text End If - CMB_PLS.Text = f - End If - End If + f = SFile.SelectFiles(f, False, "Select a playlist...", "Playlists|*.m3u;*.m3u8|All files|*.*", EDP.ReturnValue).FirstOrDefault + If Not f.IsEmptyString Then + If Sender.DefaultButton = ADB.Add Then + MyYouTubeSettings.PlaylistsLocations.Add(f.ToString, True, True) + MyYouTubeSettings.PlaylistsLocations.PopulateComboBox(CMB_PLS, f, True) + End If + CMB_PLS.Text = f + End If + Case ADB.List + Dim result As Boolean = False + Dim selectedFiles As IEnumerable(Of SFile) = MyYouTubeSettings.PlaylistsLocations.ChooseNewPlaylistArray(CMB_PLS, result) + If result Then M3U8Files.ListAddList(selectedFiles, LAP.NotContainsOnly, LAP.ClearBeforeAdd) + Case ADB.Save + With MyYouTubeSettings.PlaylistsLocations + If Not CMB_PLS.Text.IsEmptyString AndAlso .IndexOf(CMB_PLS.Text,, True) = -1 Then + .Add(CMB_PLS.Text, True, True) + .PopulateComboBox(CMB_PLS, CMB_PLS.Text, True) + End If + End With + Case ADB.Clear : M3U8Files.Clear() + End Select Catch ex As Exception ErrorsDescriber.Execute(EDP.SendToLog, ex, "[API.YouTube.Controls.MusicPlaylistsForm.SelectPlaylist]") End Try @@ -300,7 +330,7 @@ Namespace API.YouTube.Controls If Not TXT_FORMATS_ADDIT.Checked Then .PostProcessing_OutputAudioFormats.Clear() .AbsolutePath = TXT_OUTPUT_PATH.Checked .File = TXT_OUTPUT_PATH.Text.CSFileP - .M3U8_PlaylistFile = CMB_PLS.Text + .M3U8_PlaylistFiles = M3U8FilesFull If MyYouTubeSettings.OutputPathAutoChange Then MyYouTubeSettings.OutputPath.Value = .File If MyDownloaderSettings.OutputPathAutoAddPaths Then MyYouTubeSettings.DownloadLocations.Add(.File, False) If Not CMB_PLS.Text.IsEmptyString Then MyYouTubeSettings.PlaylistsLocations.Add(CMB_PLS.Text, False, True) diff --git a/SCrawler.YouTube/Controls/VideoOptionsForm.Designer.vb b/SCrawler.YouTube/Controls/VideoOptionsForm.Designer.vb index 9e8c4eb..f39f9c3 100644 --- a/SCrawler.YouTube/Controls/VideoOptionsForm.Designer.vb +++ b/SCrawler.YouTube/Controls/VideoOptionsForm.Designer.vb @@ -31,12 +31,15 @@ Namespace API.YouTube.Controls Dim TP_DESTINATION As System.Windows.Forms.TableLayoutPanel Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(VideoOptionsForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ListColumn1 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn() Dim ListColumn2 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn() Dim TP_OK_CANCEL As System.Windows.Forms.TableLayoutPanel Dim TP_PLS As System.Windows.Forms.TableLayoutPanel - Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton5 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim LB_SEP_1 As System.Windows.Forms.Label Dim LB_SEP_2 As System.Windows.Forms.Label Dim TP_WHAT As System.Windows.Forms.TableLayoutPanel @@ -44,9 +47,6 @@ Namespace API.YouTube.Controls Dim LBL_FORMAT As System.Windows.Forms.Label Dim LBL_SUBS_FORMAT As System.Windows.Forms.Label Dim TT_MAIN As System.Windows.Forms.ToolTip - Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton5 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() @@ -54,6 +54,9 @@ Namespace API.YouTube.Controls Dim ActionButton11 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton12 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton13 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton14 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton15 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton16 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Me.ICON_VIDEO = New System.Windows.Forms.PictureBox() Me.LBL_TITLE = New System.Windows.Forms.Label() Me.TP_HEADER_INFO_2 = New System.Windows.Forms.TableLayoutPanel() @@ -284,9 +287,14 @@ Namespace API.YouTube.Controls 'TXT_FILE ' ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) - ActionButton1.Name = "ArrowDown" - ActionButton1.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown + ActionButton1.Name = "Save" + ActionButton1.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Save + ActionButton1.ToolTipText = "Save destination" + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Name = "ArrowDown" + ActionButton2.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown Me.TXT_FILE.Buttons.Add(ActionButton1) + Me.TXT_FILE.Buttons.Add(ActionButton2) Me.TXT_FILE.ChangeControlsEnableOnCheckedChange = False ListColumn1.Name = "COL_NAME" ListColumn1.Text = "Name" @@ -378,14 +386,24 @@ Namespace API.YouTube.Controls ' 'CMB_PLS ' - ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) - ActionButton2.Name = "Clear" - ActionButton2.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) - ActionButton3.Name = "ArrowDown" - ActionButton3.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown - Me.CMB_PLS.Buttons.Add(ActionButton2) + ActionButton3.Name = "Save" + ActionButton3.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Save + ActionButton3.ToolTipText = "Save playlist" + ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) + ActionButton4.Name = "List" + ActionButton4.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.List + ActionButton4.ToolTipText = "Select multiple playlists" + ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image) + ActionButton5.Name = "Clear" + ActionButton5.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image) + ActionButton6.Name = "ArrowDown" + ActionButton6.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown Me.CMB_PLS.Buttons.Add(ActionButton3) + Me.CMB_PLS.Buttons.Add(ActionButton4) + Me.CMB_PLS.Buttons.Add(ActionButton5) + Me.CMB_PLS.Buttons.Add(ActionButton6) Me.CMB_PLS.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.Label Me.CMB_PLS.CaptionText = "Playlist" Me.CMB_PLS.CaptionToolTipEnabled = True @@ -558,21 +576,21 @@ Namespace API.YouTube.Controls ' 'TXT_SUBS ' - ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) - ActionButton4.Name = "Open" - ActionButton4.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open - ActionButton4.ToolTipText = "Choose subtitles" - ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image) - ActionButton5.Name = "Refresh" - ActionButton5.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh - ActionButton5.ToolTipText = "Reset subtitles to initial selected" - ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image) - ActionButton6.Name = "Clear" - ActionButton6.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - ActionButton6.ToolTipText = "Clear subtitles selection (don't download subtitles)" - Me.TXT_SUBS.Buttons.Add(ActionButton4) - Me.TXT_SUBS.Buttons.Add(ActionButton5) - Me.TXT_SUBS.Buttons.Add(ActionButton6) + ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image) + ActionButton7.Name = "Open" + ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton7.ToolTipText = "Choose subtitles" + ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image) + ActionButton8.Name = "Refresh" + ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton8.ToolTipText = "Reset subtitles to initial selected" + ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image) + ActionButton9.Name = "Clear" + ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + ActionButton9.ToolTipText = "Clear subtitles selection (don't download subtitles)" + Me.TXT_SUBS.Buttons.Add(ActionButton7) + Me.TXT_SUBS.Buttons.Add(ActionButton8) + Me.TXT_SUBS.Buttons.Add(ActionButton9) Me.TXT_SUBS.CaptionText = "Subtitles" Me.TXT_SUBS.CaptionToolTipEnabled = True Me.TXT_SUBS.CaptionToolTipText = "The selected subtitles will also be downloaded" @@ -685,10 +703,10 @@ Namespace API.YouTube.Controls ' 'TXT_FPS ' - ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image) - ActionButton7.Name = "Clear" - ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_FPS.Buttons.Add(ActionButton7) + ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image) + ActionButton10.Name = "Clear" + ActionButton10.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_FPS.Buttons.Add(ActionButton10) Me.TXT_FPS.CaptionText = "FPS" Me.TXT_FPS.CaptionToolTipEnabled = True Me.TXT_FPS.CaptionToolTipText = "You can reduce the video FPS by setting the FPS value in this field." @@ -716,24 +734,24 @@ Namespace API.YouTube.Controls ' 'TXT_SUBS_ADDIT ' - ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image) - ActionButton8.Enabled = False - ActionButton8.Name = "Open" - ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open - ActionButton8.ToolTipText = "Choose additional formats" - ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image) - ActionButton9.Enabled = False - ActionButton9.Name = "Refresh" - ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh - ActionButton9.ToolTipText = "Fill in additional formats from the defaults" - ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image) - ActionButton10.Enabled = False - ActionButton10.Name = "Clear" - ActionButton10.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - ActionButton10.ToolTipText = "Remove all additional formats" - Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton8) - Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton9) - Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton10) + ActionButton11.BackgroundImage = CType(resources.GetObject("ActionButton11.BackgroundImage"), System.Drawing.Image) + ActionButton11.Enabled = False + ActionButton11.Name = "Open" + ActionButton11.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton11.ToolTipText = "Choose additional formats" + ActionButton12.BackgroundImage = CType(resources.GetObject("ActionButton12.BackgroundImage"), System.Drawing.Image) + ActionButton12.Enabled = False + ActionButton12.Name = "Refresh" + ActionButton12.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton12.ToolTipText = "Fill in additional formats from the defaults" + ActionButton13.BackgroundImage = CType(resources.GetObject("ActionButton13.BackgroundImage"), System.Drawing.Image) + ActionButton13.Enabled = False + ActionButton13.Name = "Clear" + ActionButton13.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + ActionButton13.ToolTipText = "Remove all additional formats" + Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton11) + Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton12) + Me.TXT_SUBS_ADDIT.Buttons.Add(ActionButton13) Me.TXT_SUBS_ADDIT.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox Me.TXT_SUBS_ADDIT.CaptionText = "Additional subtitle formats" Me.TXT_SUBS_ADDIT.CaptionToolTipEnabled = True @@ -751,24 +769,24 @@ Namespace API.YouTube.Controls ' 'TXT_EXTRA_AUDIO_FORMATS ' - ActionButton11.BackgroundImage = CType(resources.GetObject("ActionButton11.BackgroundImage"), System.Drawing.Image) - ActionButton11.Enabled = False - ActionButton11.Name = "Open" - ActionButton11.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open - ActionButton11.ToolTipText = "Choose additional formats" - ActionButton12.BackgroundImage = CType(resources.GetObject("ActionButton12.BackgroundImage"), System.Drawing.Image) - ActionButton12.Enabled = False - ActionButton12.Name = "Refresh" - ActionButton12.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh - ActionButton12.ToolTipText = "Fill in additional formats from the defaults" - ActionButton13.BackgroundImage = CType(resources.GetObject("ActionButton13.BackgroundImage"), System.Drawing.Image) - ActionButton13.Enabled = False - ActionButton13.Name = "Clear" - ActionButton13.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - ActionButton13.ToolTipText = "Choose additional formats" - Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton11) - Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton12) - Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton13) + ActionButton14.BackgroundImage = CType(resources.GetObject("ActionButton14.BackgroundImage"), System.Drawing.Image) + ActionButton14.Enabled = False + ActionButton14.Name = "Open" + ActionButton14.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton14.ToolTipText = "Choose additional formats" + ActionButton15.BackgroundImage = CType(resources.GetObject("ActionButton15.BackgroundImage"), System.Drawing.Image) + ActionButton15.Enabled = False + ActionButton15.Name = "Refresh" + ActionButton15.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton15.ToolTipText = "Fill in additional formats from the defaults" + ActionButton16.BackgroundImage = CType(resources.GetObject("ActionButton16.BackgroundImage"), System.Drawing.Image) + ActionButton16.Enabled = False + ActionButton16.Name = "Clear" + ActionButton16.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + ActionButton16.ToolTipText = "Choose additional formats" + Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton14) + Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton15) + Me.TXT_EXTRA_AUDIO_FORMATS.Buttons.Add(ActionButton16) Me.TXT_EXTRA_AUDIO_FORMATS.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox Me.TXT_EXTRA_AUDIO_FORMATS.CaptionText = "Additional audio formats" Me.TXT_EXTRA_AUDIO_FORMATS.CaptionToolTipEnabled = True diff --git a/SCrawler.YouTube/Controls/VideoOptionsForm.resx b/SCrawler.YouTube/Controls/VideoOptionsForm.resx index e894896..8656187 100644 --- a/SCrawler.YouTube/Controls/VideoOptionsForm.resx +++ b/SCrawler.YouTube/Controls/VideoOptionsForm.resx @@ -137,6 +137,13 @@ + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAFFJREFUOE9joAr49u3bf1Lw169f50O1QgBI0MnJCY4/vP8Ix8hiILqtrQ3TEFIM + AGGYIVDtpBsAwkQbgIyR1dDWAGLwqAGD0gByMFQ7JYCBAQChNviRiQ8ETwAAAABJRU5ErkJggg== + + + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t 3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL @@ -238,7 +245,23 @@ False - + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAFFJREFUOE9joAr49u3bf1Lw169f50O1QgBI0MnJCY4/vP8Ix8hiILqtrQ3TEFIM + AGGYIVDtpBsAwkQbgIyR1dDWAGLwqAGD0gByMFQ7JYCBAQChNviRiQ8ETwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAeElE + QVQ4T2P4//8/RRhMFHQfKgDi/yAaXQEhDCZAmkNbnvyXta4CciESLEws//FhmDqYAQUgzUBMngsowVgF + ScFgYjQQsUsQi8FEYsXyAiD+D6LRFRDCYAKk2bPo6H9J40wgFyKBLeCQMUwdzIACkGYgHnKB+J8BAD5Q + tqhi4tzWAAAAAElFTkSuQmCC + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -246,7 +269,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t 3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL @@ -354,7 +377,7 @@ False - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -363,52 +386,9 @@ 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB cMaRN0UdBBkAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE - QVQ4T2P4//8/QczOJyyqHpzfiE0OQwAZC8iqszAzs7CJ69o4BR768V/W2jcGXQ0KB4aFNS3dDQtnrbCb - ePCK48wTN1wXXXzge/jXf/clV55zC4hIIatF0cjIyMikElzc57z0wX+XHd/+2+//99/ywP//xlu//tdb - +eK/4Zp3/1WTOhYzARViNUAluKjTdf37/0ZTTn9TbdhwXblhwwW1/qOP1Ja9+K8w+95/6cm3/6v2Xvkv - qKjniGGAoIqRpW3/4e8S9uGdzFz82gwMDFxAzCxm4ZegtuLDf+VJ1/8rZM25IqLvnM/CximCYYCic1QN - v7x2JIwPwyrJ3XNUylddE9G2TWNmZOBDl4czmJiZMSRBmFdSyYyJgUEQmxwIYxWEYXZBCUls4sgYq6CA - prWNbtG8nXKeaVPR5XiVjSxEzf0yYXy4BBMLO6eQjoOXZvrkbbazrv53Xf/2v4CSbjBMXkhBl1/CMyNZ - qWnvGy5pNQ+YONwAfjXzAOupl/47LLr333L50/96q9/8l23YdES6cO5KuYqVW+R7Tj6SnfP0v4hryjyY - HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74 - qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG - VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go - tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX - AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go - tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX - AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP - WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP - aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ - 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 - vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB - cMaRN0UdBBkAAAAASUVORK5CYII= - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -422,6 +402,14 @@ HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74 qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC @@ -465,6 +453,41 @@ xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE + QVQ4T2P4//8/QczOJyyqHpzfiE0OQwAZC8iqszAzs7CJ69o4BR768V/W2jcGXQ0KB4aFNS3dDQtnrbCb + ePCK48wTN1wXXXzge/jXf/clV55zC4hIIatF0cjIyMikElzc57z0wX+XHd/+2+//99/ywP//xlu//tdb + +eK/4Zp3/1WTOhYzARViNUAluKjTdf37/0ZTTn9TbdhwXblhwwW1/qOP1Ja9+K8w+95/6cm3/6v2Xvkv + qKjniGGAoIqRpW3/4e8S9uGdzFz82gwMDFxAzCxm4ZegtuLDf+VJ1/8rZM25IqLvnM/CximCYYCic1QN + v7x2JIwPwyrJ3XNUylddE9G2TWNmZOBDl4czmJiZMSRBmFdSyYyJgUEQmxwIYxWEYXZBCUls4sgYq6CA + prWNbtG8nXKeaVPR5XiVjSxEzf0yYXy4BBMLO6eQjoOXZvrkbbazrv53Xf/2v4CSbjBMXkhBl1/CMyNZ + qWnvGy5pNQ+YONwAfjXzAOupl/47LLr333L50/96q9/8l23YdES6cO5KuYqVW+R7Tj6SnfP0v4hryjyY + HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74 + qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG + VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC \ No newline at end of file diff --git a/SCrawler.YouTube/Controls/VideoOptionsForm.vb b/SCrawler.YouTube/Controls/VideoOptionsForm.vb index 6df1f54..0978bc0 100644 --- a/SCrawler.YouTube/Controls/VideoOptionsForm.vb +++ b/SCrawler.YouTube/Controls/VideoOptionsForm.vb @@ -31,6 +31,12 @@ Namespace API.YouTube.Controls Friend Property MyContainer As YouTubeMediaContainerBase Private Initialization As Boolean = True Private ReadOnly InheritsFromContainer As Boolean + Private ReadOnly M3U8Files As List(Of SFile) + Private ReadOnly Property M3U8FilesFull As List(Of SFile) + Get + Return ListAddList(Nothing, M3U8Files, LAP.NotContainsOnly).ListAddValue(CMB_PLS.Text, LAP.NotContainsOnly) + End Get + End Property Private Class FpsFieldChecker : Inherits FieldsCheckerProviderBase Private ReadOnly MyProvider As ANumbers = YouTubeSettings.FpsFormatProvider.MyProviderDefault Public Overrides Property ErrorMessage As String @@ -54,6 +60,7 @@ Namespace API.YouTube.Controls #Region "Initializers" Friend Sub New(ByVal Container As YouTubeMediaContainerBase, Optional ByVal InheritsFromContainer As Boolean = False) InitializeComponent() + M3U8Files = New List(Of SFile) MyContainer = Container CNT_PROCESSOR = New TableControlsProcessor(TP_CONTROLS) Me.InheritsFromContainer = InheritsFromContainer @@ -182,6 +189,7 @@ Namespace API.YouTube.Controls Private Sub VideoOptionsForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing MyView.DisposeIfReady() MyFieldsChecker.DisposeIfReady() + M3U8Files.Clear() End Sub #End Region #Region "Refill" @@ -315,7 +323,7 @@ Namespace API.YouTube.Controls ControlInvokeFast(TP_CONTROLS, Sub() With DirectCast(Container, YouTubeMediaContainerBase) .File = $"{TXT_FILE.Text.CSFilePS}{ .File.File}" - .M3U8_PlaylistFile = CMB_PLS.Text + .M3U8_PlaylistFiles = M3U8FilesFull If Full Then .OutputVideoExtension = CMB_FORMAT.Text.StringToLower .OutputVideoFPS = AConvert(Of Double)(TXT_FPS.Text, YouTubeSettings.FpsFormatProvider.MyProviderDefault, -1) @@ -344,7 +352,7 @@ Namespace API.YouTube.Controls .OutputVideoFPS = AConvert(Of Double)(TXT_FPS.Text, YouTubeSettings.FpsFormatProvider.MyProviderDefault, -1) .OutputAudioCodec = CMB_AUDIO_CODEC.Text.StringToLower .OutputSubtitlesFormat = CMB_SUBS_FORMAT.Text.StringToLower - .M3U8_PlaylistFile = CMB_PLS.Text + .M3U8_PlaylistFiles = M3U8FilesFull If Not .HasElements Then Dim cntIndex% = -1 @@ -514,6 +522,22 @@ Namespace API.YouTube.Controls End Sub #End Region #Region "Footer" + Private Sub CMB_PLS_ActionOnButtonClick(ByVal Sender As Object, ByVal e As ActionButtonEventArgs) Handles CMB_PLS.ActionOnButtonClick + Select Case e.DefaultButton + Case ADB.List + Dim result As Boolean = False + Dim selectedFiles As IEnumerable(Of SFile) = MyYouTubeSettings.PlaylistsLocations.ChooseNewPlaylistArray(CMB_PLS, result) + If result And selectedFiles.ListExists Then M3U8Files.ListAddList(selectedFiles, LAP.NotContainsOnly, LAP.ClearBeforeAdd) + Case ADB.Save + With MyYouTubeSettings.PlaylistsLocations + If Not CMB_PLS.Text.IsEmptyString AndAlso .IndexOf(CMB_PLS.Text,, True) = -1 Then + .Add(CMB_PLS.Text, True, True) + .PopulateComboBox(CMB_PLS, CMB_PLS.Text, True) + End If + End With + Case ADB.Clear : M3U8Files.Clear() + End Select + End Sub Private Sub BTT_PLS_BROWSE_MouseDown(sender As Object, e As MouseEventArgs) Handles BTT_PLS_BROWSE.MouseDown Try Dim f As SFile = Nothing @@ -555,6 +579,14 @@ Namespace API.YouTube.Controls _FilePathBeforeItemChange = Nothing End Try End Sub + Private Sub TXT_FILE_ActionOnButtonClick(ByVal Sender As Object, ByVal e As ActionButtonEventArgs) Handles TXT_FILE.ActionOnButtonClick + If e.DefaultButton = ADB.Save And Not TXT_FILE.Text.IsEmptyString Then + With MyYouTubeSettings.PlaylistsLocations + .Add(TXT_FILE.Text, True) + .PopulateComboBox(TXT_FILE, TXT_FILE.Text) + End With + End If + End Sub Private Sub BTT_BROWSE_MouseDown(sender As Object, e As MouseEventArgs) Handles BTT_BROWSE.MouseDown Dim f As SFile #Disable Warning BC40000 diff --git a/SCrawler.YouTube/Downloader/DownloadLocationsCollection.vb b/SCrawler.YouTube/Downloader/DownloadLocationsCollection.vb index 2a2b9c8..bb7acd1 100644 --- a/SCrawler.YouTube/Downloader/DownloadLocationsCollection.vb +++ b/SCrawler.YouTube/Downloader/DownloadLocationsCollection.vb @@ -9,6 +9,7 @@ Imports PersonalUtilities.Functions.XML Imports PersonalUtilities.Functions.XML.Base Imports PersonalUtilities.Functions.XML.Attributes +Imports PersonalUtilities.Forms Imports PersonalUtilities.Forms.Controls Imports PersonalUtilities.Forms.Controls.Base Imports PersonalUtilities.Tools @@ -141,6 +142,44 @@ Namespace DownloadObjects.STDownloader End If Return f End Function + Friend Function ChooseNewPlaylistArray(ByRef CMB As ComboBoxExtended, ByRef Result As Boolean) As IEnumerable(Of SFile) + Try + Dim initFiles As IEnumerable(Of SFile) = Nothing + Dim selectedFiles As IEnumerable(Of SFile) = Nothing + If Count > 0 Then initFiles = Me.Select(Function(l) l.Path.CSFile) + Dim addh As New EventHandler(Of SimpleListFormEventArgs)(Sub(ByVal s As Object, ByVal ee As SimpleListFormEventArgs) + Dim ff As List(Of SFile) = SFile.SelectFiles(,, "Select playlist files", "Playlist|*.m3u;*.m3u8|AllFiles|*.*", EDP.ReturnValue) + If ff.ListExists Then + ee.AddItem(ff.Cast(Of Object)) + ee.Result = True + Else + ee.Result = False + End If + End Sub) + Using f As New SimpleListForm(Of SFile)(initFiles, API.YouTube.MyYouTubeSettings.DesignXml) With { + .DesignXMLNodeName = "M3U8SelectorForm", + .FormText = "Playlists", + .Buttons = {ActionButton.DefaultButtons.Add}, + .Icon = ImageRenderer.GetIcon(My.Resources.StartPic_Green_16, EDP.ReturnValue), + .AddFunction = addh + } + If f.ShowDialog = DialogResult.OK Then Result = True : selectedFiles = ListAddList(Nothing, f.DataResult, LAP.NotContainsOnly) + End Using + If selectedFiles.ListExists Then + Dim added As Boolean = False + selectedFiles.ListForEach(Sub(ByVal plsFile As SFile, ByVal ii As Integer) + If IndexOf(plsFile.ToString,, True) = -1 Then Add(plsFile.ToString, True, True) : added = True + End Sub) + If added Then PopulateComboBox(CMB, selectedFiles(0).ToString, True) + CMB.Text = selectedFiles(0) + Return selectedFiles + Else + Return Nothing + End If + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Select playlist array") + End Try + End Function Private Sub Update() If Locations.Count > 0 Then Using x As New XmlFile With {.AllowSameNames = True} diff --git a/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb b/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb index 33e9617..896311c 100644 --- a/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb +++ b/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb @@ -628,15 +628,15 @@ Namespace API.YouTube.Objects If HasElements And Not IsMusic Then urls.ListAddList(Elements.SelectMany(Function(elem As YouTubeMediaContainerBase) elem.GetFiles()), LAP.NotContainsOnly) Return urls End Function - Private _M3U8_PlaylistFile As SFile = Nothing - Friend Property M3U8_PlaylistFile As SFile + Private _M3U8_PlaylistFiles As IEnumerable(Of SFile) = Nothing + Friend Property M3U8_PlaylistFiles As IEnumerable(Of SFile) Get - Return _M3U8_PlaylistFile + Return _M3U8_PlaylistFiles End Get - Set(ByVal f As SFile) + Set(ByVal f As IEnumerable(Of SFile)) If Not [Protected] Then - _M3U8_PlaylistFile = f - If HasElements Then Elements.ForEach(Sub(e As YouTubeMediaContainerBase) e.M3U8_PlaylistFile = f) + _M3U8_PlaylistFiles = f + If HasElements Then Elements.ForEach(Sub(e As YouTubeMediaContainerBase) e.M3U8_PlaylistFiles = f) End If End Set End Property @@ -1097,7 +1097,7 @@ Namespace API.YouTube.Objects If Not format = ac3 Or Not f.Exists Then ThrowAny(Token) .Execute($"ffmpeg -i ""{fAacAudio}"" -f {format} ""{f}""") - If Not M3U8_PlaylistFile.IsEmptyString AndAlso f.Exists Then M3U8_Append(f) + If Not M3U8_PlaylistFiles.ListExists AndAlso f.Exists Then M3U8_Append(f) End If Next End If @@ -1149,26 +1149,30 @@ Namespace API.YouTube.Objects End Try End Sub Private Sub M3U8_Append(Optional ByVal __file As SFile = Nothing) - If Not M3U8_PlaylistFile.IsEmptyString Then - Dim m3u8Row$ = String.Empty - If Not M3U8_PlaylistFile.Extension.IsEmptyString Then - If M3U8_PlaylistFile.Extension.ToLower = "m3u8" Then - m3u8Row = GetPlaylistRow(Me, __file) - ElseIf M3U8_PlaylistFile.Extension.ToLower = "m3u" Then - m3u8Row = __file.IfNullOrEmpty(File).ToString + If M3U8_PlaylistFiles.ListExists Then + For Each m3u8_file As SFile In M3U8_PlaylistFiles + If Not m3u8_file.IsEmptyString Then + Dim m3u8Row$ = String.Empty + If Not m3u8_file.Extension.IsEmptyString Then + If m3u8_file.Extension.ToLower = "m3u8" Then + m3u8Row = GetPlaylistRow(Me, __file) + ElseIf m3u8_file.Extension.ToLower = "m3u" Then + m3u8Row = __file.IfNullOrEmpty(File).ToString + End If + End If + If Not m3u8Row.IsEmptyString Then + Dim m3u8Text$ + If m3u8_file.Exists Then + m3u8Text = m3u8_file.GetText + m3u8_file.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.SendToLog) + Else + m3u8Text = "#EXTM3U" + End If + m3u8Text.StringAppendLine(m3u8Row, vbCrLf) + TextSaver.SaveTextToFile(m3u8Text, m3u8_file,,, EDP.SendToLog) + End If End If - End If - If Not m3u8Row.IsEmptyString Then - Dim m3u8Text$ - If M3U8_PlaylistFile.Exists Then - m3u8Text = M3U8_PlaylistFile.GetText - M3U8_PlaylistFile.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.SendToLog) - Else - m3u8Text = "#EXTM3U" - End If - m3u8Text.StringAppendLine(m3u8Row, vbCrLf) - TextSaver.SaveTextToFile(m3u8Text, M3U8_PlaylistFile,,, EDP.SendToLog) - End If + Next End If End Sub #End Region diff --git a/SCrawler/API/Base/UserDataBase.vb b/SCrawler/API/Base/UserDataBase.vb index 879157d..f4de94e 100644 --- a/SCrawler/API/Base/UserDataBase.vb +++ b/SCrawler/API/Base/UserDataBase.vb @@ -1409,12 +1409,14 @@ BlockNullPicture: If _ContentNew.Count > 0 Then If _ContentNew.Any(Function(mm) mm.State = UStates.Downloaded) Then Data.DownloadState = UserMediaStates.Downloaded + Dim thumbAlong As Boolean = False + If TypeOf Data Is DownloadableMediaHost Then thumbAlong = DirectCast(Data, DownloadableMediaHost).ThumbAlong If _ContentNew(0).Type = UTypes.Picture Or _ContentNew(0).Type = UTypes.GIF Then DirectCast(Data, IDownloadableMedia).ThumbnailFile = _ContentNew(0).File ElseIf Settings.STDownloader_TakeSnapshot And Settings.FfmpegFile.Exists And Not Settings.STDownloader_RemoveDownloadedAutomatically Then Dim f As SFile = _ContentNew(0).File Dim ff As SFile - If Settings.STDownloader_SnapshotsKeepWithFiles Then + If Settings.STDownloader_SnapshotsKeepWithFiles Or thumbAlong Then ff = f Else ff = Settings.CacheSnapshots(Settings.STDownloader_SnapShotsCachePermamnent).NewFile diff --git a/SCrawler/API/TikTok/SiteSettings.vb b/SCrawler/API/TikTok/SiteSettings.vb index aab1139..fa8b2a0 100644 --- a/SCrawler/API/TikTok/SiteSettings.vb +++ b/SCrawler/API/TikTok/SiteSettings.vb @@ -17,11 +17,13 @@ Namespace API.TikTok Friend ReadOnly Property RemoveTagsFromTitle As PropertyValue Friend ReadOnly Property TitleUseNative As PropertyValue - Friend ReadOnly Property TitleUseNativeSTD As PropertyValue Friend ReadOnly Property TitleAddVideoID As PropertyValue + + Friend ReadOnly Property TitleAddVideoIDSTD As PropertyValue Friend ReadOnly Property TitleUseRegexForTitle As PropertyValue @@ -29,15 +31,20 @@ Namespace API.TikTok Friend ReadOnly Property UseParsedVideoDate As PropertyValue + + Friend ReadOnly Property UseParsedVideoDateSTD As PropertyValue Friend Sub New(ByVal AccName As String, ByVal Temp As Boolean) MyBase.New("TikTok", "www.tiktok.com", AccName, Temp, My.Resources.SiteResources.TikTokIcon_32, My.Resources.SiteResources.TikTokPic_192) RemoveTagsFromTitle = New PropertyValue(False) TitleUseNative = New PropertyValue(True) - TitleUseNativeSTD = New PropertyValue(False) + TitleUseNativeSTD = New PropertyValue(True) TitleAddVideoID = New PropertyValue(True) + TitleAddVideoIDSTD = New PropertyValue(True) TitleUseRegexForTitle = New PropertyValue(False) TitleUseRegexForTitle_Value = New PropertyValue(String.Empty, GetType(String)) UseParsedVideoDate = New PropertyValue(True) + UseParsedVideoDateSTD = New PropertyValue(False) UseNetscapeCookies = True UrlPatternUser = "https://www.tiktok.com/@{0}/" UserRegex = RParams.DMS(String.Format(UserRegexDefaultPattern, "tiktok.com/@"), 1) diff --git a/SCrawler/API/TikTok/UserData.vb b/SCrawler/API/TikTok/UserData.vb index b275119..21cd63e 100644 --- a/SCrawler/API/TikTok/UserData.vb +++ b/SCrawler/API/TikTok/UserData.vb @@ -151,6 +151,23 @@ Namespace API.TikTok End Try Return Title End Function + Private Function GetNewFileName(ByVal Title As String, ByVal Native As Boolean, ByVal RemoveTags As Boolean, ByVal AddVideoID As Boolean, + ByVal PostID As String, ByVal TitleRegex As RParams) As String + If Not Title.IsEmptyString Then Title = Left(Title, 150).StringTrim + If Title.IsEmptyString Or Not Native Then + Title = PostID + Else + If RemoveTags Then Title = RegexReplace(Title, RegexTagsReplacer) + Title = Title.StringTrim + If Title.IsEmptyString Then + Title = PostID + ElseIf AddVideoID Then + Title &= $" ({PostID})" + End If + Title = ChangeTitleRegex(Title, TitleRegex) + End If + Return Title + End Function Friend Overrides Sub DownloadData(ByVal Token As CancellationToken) MyBase.DownloadData(Token) UserCache.DisposeIfReady(False) @@ -228,20 +245,8 @@ Namespace API.TikTok Else Exit Sub End If - title = j.Value("title").StringRemoveWinForbiddenSymbols - If Not title.IsEmptyString Then title = Left(title, 150) - If title.IsEmptyString Or Not TitleUseNative Then - title = postID - Else - If RemoveTagsFromTitle Then title = RegexReplace(title, RegexTagsReplacer) - title = title.StringTrim - If title.IsEmptyString Then - title = postID - ElseIf TitleAddVideoID Then - title &= $" ({postID})" - End If - title = ChangeTitleRegex(title, titleRegex) - End If + title = GetNewFileName(j.Value("title").StringRemoveWinForbiddenSymbols, + TitleUseNative, RemoveTagsFromTitle, TitleAddVideoID, postID, titleRegex) postDate = AConvert(Of Date)(j.Value("timestamp"), UnixDate32Provider, Nothing) If Not postDate.HasValue Then postDate = AConvert(Of Date)(j.Value("upload_date"), SimpleDateConverter, Nothing) Select Case CheckDatesLimit(postDate, SimpleDateConverter) @@ -296,7 +301,7 @@ Namespace API.TikTok End If If DateBefore.HasValue Then command &= $"--datebefore {DateBefore.Value.AddDays(1).ToStringDate(SimpleDateConverter)} " If DateAfter.HasValue Then command &= $"--dateafter {DateAfter.Value.AddDays(-1).ToStringDate(SimpleDateConverter)} " - If Not CBool(MySettings.UseParsedVideoDate.Value) Then command &= "--no-mtime " + If Not CBool(If(IsSingleObjectDownload, MySettings.UseParsedVideoDateSTD, MySettings.UseParsedVideoDate).Value) Then command &= "--no-mtime " If MySettings.CookiesNetscapeFile.Exists Then command &= $"--no-cookies-from-browser --cookies ""{MySettings.CookiesNetscapeFile}"" " command &= $"{URL} " If SupportOutput Then @@ -347,13 +352,9 @@ Namespace API.TikTok Dim m As New UserMedia(Data.URL, UserMedia.Types.Video) If Not f.IsEmptyString Then f = TitleHtmlConverter(f) If Not f.IsEmptyString Then - If CBool(MySettings.RemoveTagsFromTitle.Value) Then f = RegexReplace(f, RegexTagsReplacer) - f = f.StringTrim - If Not f.IsEmptyString Then - If CBool(MySettings.TitleAddVideoID.Value) Then f &= $" ({m.File.Name})" - f = ChangeTitleRegex(f, GetTitleRegex) - m.File.Name = f - End If + f = GetNewFileName(f, MySettings.TitleUseNativeSTD.Value, MySettings.RemoveTagsFromTitle.Value, MySettings.TitleAddVideoIDSTD.Value, + m.File.Name, GetTitleRegex) + If Not f.IsEmptyString Then m.File.Name = f.StringTrim End If _TempMediaList.Add(m) End Sub diff --git a/SCrawler/Download/Feed/DownloadFeedForm.vb b/SCrawler/Download/Feed/DownloadFeedForm.vb index 9abf652..1ea95f0 100644 --- a/SCrawler/Download/Feed/DownloadFeedForm.vb +++ b/SCrawler/Download/Feed/DownloadFeedForm.vb @@ -176,7 +176,7 @@ Namespace DownloadObjects Hide() End Sub Private Sub DownloadFeedForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed - ClearTable() + 'ClearTable() MyRange.Dispose() LoadedFeedNames.Clear() BTT_CLEAR_DAILY.Dispose() @@ -507,6 +507,7 @@ Namespace DownloadObjects Dim data As IEnumerable(Of UserMediaD) = Nothing Dim dd As UserMediaD Dim data_files As IEnumerable(Of SFile) = Nothing + Dim new_files As New List(Of SFile) Dim mm As UserMediaD Dim mm_data As API.Base.UserMedia Dim indx% @@ -605,10 +606,11 @@ Namespace DownloadObjects df = ff df.Path = moveOptions.DestinationTrue(dd).Path If isCopy Then - If ff.Copy(df) Then result = True + If ff.Copy(df) Then new_files.Add(df) : result = True Else If df.Exists And renameExisting Then df = SFile.IndexReindex(df,,,, New ErrorsDescriber(False, False, False, df)) If SFile.Move(ff, df) Then + new_files.Add(df) result = True If updateFileLocations Then filesReplace.Add(New KeyValuePair(Of SFile, SFile)(ff, df)) @@ -668,7 +670,10 @@ Namespace DownloadObjects If filesReplace.Count > 0 Then filesReplace.ForEach(Sub(fr) Settings.Feeds.UpdateDataByFile(fr.Key, fr.Value, moveOptions)) filesReplace.Clear() End If - If IsInternal Then MsgBoxE(New MMessage($"The following files were {IIf(isCopy, "copied", "moved")} to{vbCr}{moveOptions.Destination}{vbCr}{vbCr}{data_files.ListToString(vbCr)}", MsgTitle) With {.Editable = True}) + If IsInternal Then MsgBoxE(New MMessage($"The following files were {IIf(isCopy, "copied", "moved")} to{vbCr}{moveOptions.Destination}{vbCr}{vbCr}" & + $"Source:{vbCr}{data_files.ListToString(vbCr)}{vbCr}" & + $"Destination:{vbCr}{new_files.ListToString(vbCr)}", MsgTitle) With {.Editable = True}) + new_files.Clear() If Not isCopy And updateFileLocations Then RefillList() End If Else diff --git a/SCrawler/Download/Feed/FeedMedia.vb b/SCrawler/Download/Feed/FeedMedia.vb index 83d0db6..39f737e 100644 --- a/SCrawler/Download/Feed/FeedMedia.vb +++ b/SCrawler/Download/Feed/FeedMedia.vb @@ -504,7 +504,7 @@ Namespace DownloadObjects Else RaiseEvent MediaMove(Me, moveOptions, result) End If - If result Then MsgBoxE({$"File {IIf(isCopy, "copied", "moved")}{vbCr}Source: '{File}'{vbCr}Destination: '{ff}'", MsgTitle}) + If result Then MsgBoxE(New MMessage($"File {IIf(isCopy, "copied", "moved")}{vbCr}Source: '{File}'{vbCr}Destination: '{ff}'", MsgTitle) With {.Editable = True}) End If End If Catch ex As Exception @@ -549,7 +549,7 @@ Namespace DownloadObjects 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"}) + MsgBoxE(New MMessage(Information, "Post information") With {.Editable = True}) End Sub #End Region #Region "Delete" diff --git a/SCrawler/Download/STDownloader/DownloaderUrlForm.Designer.vb b/SCrawler/Download/STDownloader/DownloaderUrlForm.Designer.vb index 595c431..84a8bad 100644 --- a/SCrawler/Download/STDownloader/DownloaderUrlForm.Designer.vb +++ b/SCrawler/Download/STDownloader/DownloaderUrlForm.Designer.vb @@ -36,6 +36,7 @@ Namespace DownloadObjects.STDownloader Me.TXT_URL = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_PATH = New PersonalUtilities.Forms.Controls.ComboBoxExtended() Me.CMB_ACCOUNT = New PersonalUtilities.Forms.Controls.ComboBoxExtended() + Me.CH_THUMB_ALONG = New System.Windows.Forms.CheckBox() CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() TP_MAIN = New System.Windows.Forms.TableLayoutPanel() CONTAINER_MAIN.ContentPanel.SuspendLayout() @@ -52,13 +53,13 @@ Namespace DownloadObjects.STDownloader 'CONTAINER_MAIN.ContentPanel ' CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) - CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(484, 88) + CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(484, 114) 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(484, 113) + CONTAINER_MAIN.Size = New System.Drawing.Size(484, 139) CONTAINER_MAIN.TabIndex = 0 CONTAINER_MAIN.TopToolStripPanelVisible = False ' @@ -70,15 +71,17 @@ Namespace DownloadObjects.STDownloader TP_MAIN.Controls.Add(Me.TXT_URL, 0, 0) TP_MAIN.Controls.Add(Me.TXT_PATH, 0, 1) TP_MAIN.Controls.Add(Me.CMB_ACCOUNT, 0, 2) + TP_MAIN.Controls.Add(Me.CH_THUMB_ALONG, 0, 3) 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 = 4 + TP_MAIN.RowCount = 5 TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_MAIN.Size = New System.Drawing.Size(484, 88) + TP_MAIN.Size = New System.Drawing.Size(484, 114) TP_MAIN.TabIndex = 0 ' 'TXT_URL @@ -158,19 +161,30 @@ Namespace DownloadObjects.STDownloader Me.CMB_ACCOUNT.TabIndex = 2 Me.CMB_ACCOUNT.TextBoxBorderStyle = System.Windows.Forms.BorderStyle.FixedSingle ' + 'CH_THUMB_ALONG + ' + Me.CH_THUMB_ALONG.AutoSize = True + Me.CH_THUMB_ALONG.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_THUMB_ALONG.Location = New System.Drawing.Point(4, 91) + Me.CH_THUMB_ALONG.Name = "CH_THUMB_ALONG" + Me.CH_THUMB_ALONG.Size = New System.Drawing.Size(476, 19) + Me.CH_THUMB_ALONG.TabIndex = 3 + Me.CH_THUMB_ALONG.Text = "Save thumbnail with file" + Me.CH_THUMB_ALONG.UseVisualStyleBackColor = True + ' 'DownloaderUrlForm ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(484, 113) + Me.ClientSize = New System.Drawing.Size(484, 139) Me.Controls.Add(CONTAINER_MAIN) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle Me.Icon = Global.SCrawler.My.Resources.Resources.ArrowDownIcon_Blue_24 Me.KeyPreview = True Me.MaximizeBox = False - Me.MaximumSize = New System.Drawing.Size(500, 152) + Me.MaximumSize = New System.Drawing.Size(500, 178) Me.MinimizeBox = False - Me.MinimumSize = New System.Drawing.Size(500, 152) + Me.MinimumSize = New System.Drawing.Size(500, 178) Me.Name = "DownloaderUrlForm" Me.ShowInTaskbar = False Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide @@ -179,6 +193,7 @@ Namespace DownloadObjects.STDownloader CONTAINER_MAIN.ResumeLayout(False) CONTAINER_MAIN.PerformLayout() TP_MAIN.ResumeLayout(False) + TP_MAIN.PerformLayout() CType(Me.TXT_URL, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.CMB_ACCOUNT, System.ComponentModel.ISupportInitialize).EndInit() @@ -188,5 +203,6 @@ Namespace DownloadObjects.STDownloader Private WithEvents TXT_URL As PersonalUtilities.Forms.Controls.TextBoxExtended Private WithEvents TXT_PATH As PersonalUtilities.Forms.Controls.ComboBoxExtended Private WithEvents CMB_ACCOUNT As PersonalUtilities.Forms.Controls.ComboBoxExtended + Private WithEvents CH_THUMB_ALONG As CheckBox End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Download/STDownloader/DownloaderUrlForm.vb b/SCrawler/Download/STDownloader/DownloaderUrlForm.vb index db7bd03..54fcbd6 100644 --- a/SCrawler/Download/STDownloader/DownloaderUrlForm.vb +++ b/SCrawler/Download/STDownloader/DownloaderUrlForm.vb @@ -19,6 +19,11 @@ Namespace DownloadObjects.STDownloader Return CMB_ACCOUNT.Text End Get End Property + Friend ReadOnly Property ThumbAlong As Boolean + Get + Return CH_THUMB_ALONG.Checked + End Get + End Property Friend Sub New() InitializeComponent() MyDefs = New DefaultFormOptions(Me, Settings.Design) @@ -32,6 +37,7 @@ Namespace DownloadObjects.STDownloader TXT_PATH.Text = Settings.LatestSavingPath.Value If TXT_PATH.Text.IsEmptyString Then TXT_PATH.Text = Application.StartupPath.CSFileP.PathWithSeparator TXT_URL_ActionOnTextChanged() + CH_THUMB_ALONG.Checked = Settings.STDownloader_SnapshotsKeepWithFiles_ThumbAlong .MyFieldsChecker = New FieldsChecker With .MyFieldsCheckerE .AddControl(Of String)(TXT_URL, TXT_URL.CaptionText) diff --git a/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.Designer.vb b/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.Designer.vb index b5ada7c..8990b00 100644 --- a/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.Designer.vb +++ b/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.Designer.vb @@ -24,18 +24,19 @@ Namespace DownloadObjects.STDownloader Private Sub InitializeComponent() Dim CONTAINER_MAIN As System.Windows.Forms.ToolStripContainer Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel - Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(DownloaderUrlsArrForm)) - Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ListColumn1 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn() - Dim ListColumn2 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn() + Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ListColumn3 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn() + Dim ListColumn4 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn() Dim FRM_URLS As System.Windows.Forms.GroupBox - Dim ActionButton5 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton10 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Me.TXT_OUTPUT = New PersonalUtilities.Forms.Controls.ComboBoxExtended() Me.TXT_URLS = New System.Windows.Forms.TextBox() Me.CMB_ACCOUNT = New PersonalUtilities.Forms.Controls.ComboBoxExtended() + Me.CH_THUMB_ALONG = New System.Windows.Forms.CheckBox() CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() TP_MAIN = New System.Windows.Forms.TableLayoutPanel() FRM_URLS = New System.Windows.Forms.GroupBox() @@ -68,50 +69,52 @@ Namespace DownloadObjects.STDownloader TP_MAIN.ColumnCount = 1 TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) TP_MAIN.Controls.Add(Me.TXT_OUTPUT, 0, 0) - TP_MAIN.Controls.Add(FRM_URLS, 0, 2) + TP_MAIN.Controls.Add(FRM_URLS, 0, 3) TP_MAIN.Controls.Add(Me.CMB_ACCOUNT, 0, 1) + TP_MAIN.Controls.Add(Me.CH_THUMB_ALONG, 0, 2) TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill TP_MAIN.Location = New System.Drawing.Point(0, 0) TP_MAIN.Name = "TP_MAIN" - TP_MAIN.RowCount = 3 + TP_MAIN.RowCount = 4 TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) TP_MAIN.Size = New System.Drawing.Size(384, 261) TP_MAIN.TabIndex = 0 ' 'TXT_OUTPUT ' - ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) - ActionButton1.Name = "Open" - ActionButton1.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open - ActionButton1.ToolTipText = "Choose a new location (Ctrl+O)" - ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) - ActionButton2.Name = "Add" - ActionButton2.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Add - ActionButton2.ToolTipText = "Choose a new location and add it to the list (Alt+O)" - ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) - ActionButton3.Name = "Clear" - ActionButton3.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) - ActionButton4.Name = "ArrowDown" - ActionButton4.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown - Me.TXT_OUTPUT.Buttons.Add(ActionButton1) - Me.TXT_OUTPUT.Buttons.Add(ActionButton2) - Me.TXT_OUTPUT.Buttons.Add(ActionButton3) - Me.TXT_OUTPUT.Buttons.Add(ActionButton4) + ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image) + ActionButton6.Name = "Open" + ActionButton6.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton6.ToolTipText = "Choose a new location (Ctrl+O)" + ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image) + ActionButton7.Name = "Add" + ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Add + ActionButton7.ToolTipText = "Choose a new location and add it to the list (Alt+O)" + ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image) + ActionButton8.Name = "Clear" + ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image) + ActionButton9.Name = "ArrowDown" + ActionButton9.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown + Me.TXT_OUTPUT.Buttons.Add(ActionButton6) + Me.TXT_OUTPUT.Buttons.Add(ActionButton7) + Me.TXT_OUTPUT.Buttons.Add(ActionButton8) + Me.TXT_OUTPUT.Buttons.Add(ActionButton9) Me.TXT_OUTPUT.CaptionText = "Output path" Me.TXT_OUTPUT.CaptionWidth = 70.0R - ListColumn1.Name = "COL_NAME" - ListColumn1.Text = "Name" - ListColumn1.Width = -1 - ListColumn2.DisplayMember = True - ListColumn2.Name = "COL_VALUE" - ListColumn2.Text = "Value" - ListColumn2.ValueMember = True - ListColumn2.Visible = False - Me.TXT_OUTPUT.Columns.Add(ListColumn1) - Me.TXT_OUTPUT.Columns.Add(ListColumn2) + ListColumn3.Name = "COL_NAME" + ListColumn3.Text = "Name" + ListColumn3.Width = -1 + ListColumn4.DisplayMember = True + ListColumn4.Name = "COL_VALUE" + ListColumn4.Text = "Value" + ListColumn4.ValueMember = True + ListColumn4.Visible = False + Me.TXT_OUTPUT.Columns.Add(ListColumn3) + Me.TXT_OUTPUT.Columns.Add(ListColumn4) Me.TXT_OUTPUT.Dock = System.Windows.Forms.DockStyle.Fill Me.TXT_OUTPUT.ListAutoCompleteMode = PersonalUtilities.Forms.Controls.ComboBoxExtended.AutoCompleteModes.Disabled Me.TXT_OUTPUT.Location = New System.Drawing.Point(3, 3) @@ -124,9 +127,9 @@ Namespace DownloadObjects.STDownloader ' FRM_URLS.Controls.Add(Me.TXT_URLS) FRM_URLS.Dock = System.Windows.Forms.DockStyle.Fill - FRM_URLS.Location = New System.Drawing.Point(3, 59) + FRM_URLS.Location = New System.Drawing.Point(3, 84) FRM_URLS.Name = "FRM_URLS" - FRM_URLS.Size = New System.Drawing.Size(378, 199) + FRM_URLS.Size = New System.Drawing.Size(378, 174) FRM_URLS.TabIndex = 2 FRM_URLS.TabStop = False FRM_URLS.Text = "URLs (new line as delimiter)" @@ -139,15 +142,15 @@ Namespace DownloadObjects.STDownloader Me.TXT_URLS.Multiline = True Me.TXT_URLS.Name = "TXT_URLS" Me.TXT_URLS.ScrollBars = System.Windows.Forms.ScrollBars.Both - Me.TXT_URLS.Size = New System.Drawing.Size(372, 180) + Me.TXT_URLS.Size = New System.Drawing.Size(372, 155) Me.TXT_URLS.TabIndex = 0 ' 'CMB_ACCOUNT ' - ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image) - ActionButton5.Name = "ArrowDown" - ActionButton5.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown - Me.CMB_ACCOUNT.Buttons.Add(ActionButton5) + ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image) + ActionButton10.Name = "ArrowDown" + ActionButton10.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown + Me.CMB_ACCOUNT.Buttons.Add(ActionButton10) Me.CMB_ACCOUNT.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.Label Me.CMB_ACCOUNT.CaptionText = "Account" Me.CMB_ACCOUNT.CaptionToolTipEnabled = True @@ -161,6 +164,17 @@ Namespace DownloadObjects.STDownloader Me.CMB_ACCOUNT.TabIndex = 1 Me.CMB_ACCOUNT.TextBoxBorderStyle = System.Windows.Forms.BorderStyle.FixedSingle ' + 'CH_THUMB_ALONG + ' + Me.CH_THUMB_ALONG.AutoSize = True + Me.CH_THUMB_ALONG.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_THUMB_ALONG.Location = New System.Drawing.Point(3, 59) + Me.CH_THUMB_ALONG.Name = "CH_THUMB_ALONG" + Me.CH_THUMB_ALONG.Size = New System.Drawing.Size(378, 19) + Me.CH_THUMB_ALONG.TabIndex = 3 + Me.CH_THUMB_ALONG.Text = "Save thumbnail with file" + Me.CH_THUMB_ALONG.UseVisualStyleBackColor = True + ' 'DownloaderUrlsArrForm ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -177,6 +191,7 @@ Namespace DownloadObjects.STDownloader CONTAINER_MAIN.ResumeLayout(False) CONTAINER_MAIN.PerformLayout() TP_MAIN.ResumeLayout(False) + TP_MAIN.PerformLayout() CType(Me.TXT_OUTPUT, System.ComponentModel.ISupportInitialize).EndInit() FRM_URLS.ResumeLayout(False) FRM_URLS.PerformLayout() @@ -187,5 +202,6 @@ Namespace DownloadObjects.STDownloader Private WithEvents TXT_OUTPUT As PersonalUtilities.Forms.Controls.ComboBoxExtended Private WithEvents TXT_URLS As TextBox Private WithEvents CMB_ACCOUNT As PersonalUtilities.Forms.Controls.ComboBoxExtended + Private WithEvents CH_THUMB_ALONG As CheckBox End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.resx b/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.resx index cf94e9a..42e2b90 100644 --- a/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.resx +++ b/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.resx @@ -124,7 +124,7 @@ False - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -135,7 +135,7 @@ cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE @@ -157,7 +157,7 @@ 0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -165,7 +165,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t 3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL @@ -258,7 +258,7 @@ False - + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t 3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL diff --git a/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.vb b/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.vb index 2d062f6..389d414 100644 --- a/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.vb +++ b/SCrawler/Download/STDownloader/DownloaderUrlsArrForm.vb @@ -31,6 +31,11 @@ Namespace DownloadObjects.STDownloader Return CMB_ACCOUNT.Text End Get End Property + Friend ReadOnly Property ThumbAlong As Boolean + Get + Return CH_THUMB_ALONG.Checked + End Get + End Property Private _UseAccountName As Boolean = False Friend ReadOnly Property UseAccountName As Boolean Get @@ -50,6 +55,7 @@ Namespace DownloadObjects.STDownloader TXT_OUTPUT.Text = Settings.LatestSavingPath.Value.PathWithSeparator If TXT_OUTPUT.Text.IsEmptyString Then TXT_OUTPUT.Text = Application.StartupPath.CSFileP.PathWithSeparator TXT_URLS_TextChanged() + CH_THUMB_ALONG.Checked = Settings.STDownloader_SnapshotsKeepWithFiles_ThumbAlong .MyFieldsChecker = New FieldsChecker With .MyFieldsCheckerE .AddControl(Of String)(TXT_OUTPUT, TXT_OUTPUT.CaptionText) diff --git a/SCrawler/Download/STDownloader/VideoDownloaderForm.vb b/SCrawler/Download/STDownloader/VideoDownloaderForm.vb index 9abd79c..509ea50 100644 --- a/SCrawler/Download/STDownloader/VideoDownloaderForm.vb +++ b/SCrawler/Download/STDownloader/VideoDownloaderForm.vb @@ -67,6 +67,7 @@ Namespace DownloadObjects.STDownloader Dim disableDown As Boolean = e.Shift Dim output As SFile = Settings.LatestSavingPath Dim acc$ = String.Empty + Dim thumbAlong As Boolean = False Dim isArr As Boolean = (__tag = UrlsArrTag Or (isExternal And ExternalUrlsTemp.Count > 1)) Dim formOpened As Boolean = False Dim media As IYouTubeMediaContainer @@ -79,6 +80,8 @@ Namespace DownloadObjects.STDownloader url = f.URL output = f.OutputPath acc = f.AccountName + thumbAlong = f.ThumbAlong + Settings.STDownloader_SnapshotsKeepWithFiles_ThumbAlong.Value = thumbAlong Settings.LatestSavingPath.Value = output If Settings.STDownloader_UpdateYouTubeOutputPath Then _ API.YouTube.MyYouTubeSettings.OutputPath.Value = output @@ -128,6 +131,8 @@ Namespace DownloadObjects.STDownloader urls = fa.URLs.ToList output = fa.OutputPath If fa.UseAccountName Then acc = fa.AccountName + thumbAlong = fa.ThumbAlong + Settings.STDownloader_SnapshotsKeepWithFiles_ThumbAlong.Value = thumbAlong If Settings.STDownloader_UpdateYouTubeOutputPath Then API.YouTube.MyYouTubeSettings.OutputPath.Value = output If Settings.STDownloader_OutputPathAutoAddPaths Then Settings.DownloadLocations.Add(output, False) Else @@ -143,7 +148,11 @@ Namespace DownloadObjects.STDownloader For Each url In urls If Not TryYouTube.Invoke Then media = FindSource(url, output) - If Not media Is Nothing AndAlso ValidateContainerURL(media) Then media.AccountName = acc : ControlCreateAndAdd(media, disableDown) + If Not media Is Nothing AndAlso ValidateContainerURL(media) Then + media.AccountName = acc + If TypeOf media Is DownloadableMediaHost Then DirectCast(media, DownloadableMediaHost).ThumbAlong = thumbAlong + ControlCreateAndAdd(media, disableDown) + End If End If Next urls.Clear() @@ -175,6 +184,7 @@ Namespace DownloadObjects.STDownloader MsgBoxE({$"The URL you entered is not recognized by existing plugins.{vbCr}{url}", "Download video"}, vbCritical) ElseIf ValidateContainerURL(media) Then media.AccountName = acc + If TypeOf media Is DownloadableMediaHost Then DirectCast(media, DownloadableMediaHost).ThumbAlong = thumbAlong output.Exists(SFO.Path, True) ControlCreateAndAdd(media, disableDown) End If diff --git a/SCrawler/Download/TDownloader.vb b/SCrawler/Download/TDownloader.vb index 1df37c1..e08b725 100644 --- a/SCrawler/Download/TDownloader.vb +++ b/SCrawler/Download/TDownloader.vb @@ -511,7 +511,6 @@ Namespace DownloadObjects FilesUpdatePendingUsers() If FilesChanged Then FilesSave() : RaiseEvent FeedFilesChanged(True) If _SessionSavedPosts <> -1 Then Session = _SessionSavedPosts : _SessionSavedPosts = -1 - Settings.Plugins.ForEach(Sub(p) p.Settings.ResetIndexes()) End Try End Sub Private Sub StartDownloading(ByRef _Job As Job) diff --git a/SCrawler/Editors/UserCreatorForm.vb b/SCrawler/Editors/UserCreatorForm.vb index 91762ef..b3ded89 100644 --- a/SCrawler/Editors/UserCreatorForm.vb +++ b/SCrawler/Editors/UserCreatorForm.vb @@ -327,7 +327,7 @@ Namespace Editors End With If checkBuffer Then - Dim tempName$ = BufferText + Dim tempName$ = BufferText.StringTrim If Not tempName.IsEmptyString Then TXT_USER.Text = tempName If CMB_SITE.SelectedIndex = -1 Then TXT_USER.Text = String.Empty @@ -649,6 +649,7 @@ CloseForm: Return If(CMB_SITE.SelectedIndex >= 0, Settings(CStr(CMB_SITE.Items(CMB_SITE.SelectedIndex).Value(0))), Nothing) End Function Private Function CreateUsersByList() As Boolean + Const msgTitle$ = "Add user list" Try If CH_ADD_BY_LIST.Checked Then If Not TXT_DESCR.IsEmptyString Then @@ -657,11 +658,11 @@ CloseForm: Dim NonIdentified As New List(Of String) Dim UsersForCreate As New List(Of UserInfo) Dim UsersForCreate_Options As New List(Of String) - Dim BannedUsers() As String = Nothing + Dim BannedUsers$() = Nothing Dim uu$ Dim ulabels As List(Of String) = ListAddList(Nothing, UserLabels).ListAddValue(LabelsKeeper.NoParsedUser, LAP.NotContainsOnly) Dim tmpUser As UserInfo - Dim s As SettingsHost = GetSiteByCheckers().Default + Dim s As SettingsHost = If(GetSiteByCheckers()?.Default, Nothing) Dim sObj As ExchangeOptions = Nothing Dim Added% = 0 Dim Skipped% = 0 @@ -689,12 +690,19 @@ CloseForm: uu = sObj.UserName Else s = Nothing + uu = String.Empty + End If + Else + If s Is Nothing Then + MsgBoxE({$"Site not selected{vbCr}Operation canceled", msgTitle}, vbCritical) + Return False + Else + sObj = s.IsMyUser(uu) + uu = sObj.UserName End If - ElseIf i = 0 Then - sObj = GetSiteByText(uu) End If - If Not s Is Nothing AndAlso (Not IsSubscription OrElse s.Source.SubscriptionsAllowed) Then + If Not s Is Nothing AndAlso Not uu.IsEmptyString AndAlso (Not IsSubscription OrElse s.Source.SubscriptionsAllowed) Then tmpUser = New UserInfo(uu, s) tmpUser.SpecialPath = __getUserSpecialPath(tmpUser, s) tmpUser.UpdateUserFile() @@ -740,7 +748,7 @@ CloseForm: End If End If - Dim m As New MMessage($"Added {Added} users (skipped (already exists and/or duplicated) {Skipped})") + Dim m As New MMessage($"Added {Added} users (skipped (already exists and/or duplicated) {Skipped})", msgTitle) If BannedUsers.ListExists Or NonIdentified.Count > 0 Then Dim t$ = String.Empty If BannedUsers.ListExists Then t.StringAppendLine($"Banned users:{vbNewLine}{BannedUsers.ListToString(vbNewLine)}") @@ -757,10 +765,10 @@ CloseForm: If Added > 0 Then MyDef.ChangesDetected = False Return Added > 0 And Not BannedUsers.ListExists And NonIdentified.Count = 0 Else - MsgBoxE("No user can be recognized", MsgBoxStyle.Exclamation) + MsgBoxE({"No user can be recognized", msgTitle}, MsgBoxStyle.Exclamation) End If Else - MsgBoxE("[Users list] is empty", MsgBoxStyle.Critical) + MsgBoxE({"[Users list] is empty", msgTitle}, MsgBoxStyle.Critical) End If End If Return False diff --git a/SCrawler/PluginsEnvironment/Hosts/DownloadableMediaHost.vb b/SCrawler/PluginsEnvironment/Hosts/DownloadableMediaHost.vb index dd2ed53..b148002 100644 --- a/SCrawler/PluginsEnvironment/Hosts/DownloadableMediaHost.vb +++ b/SCrawler/PluginsEnvironment/Hosts/DownloadableMediaHost.vb @@ -11,6 +11,7 @@ Imports SCrawler.API.Base Imports SCrawler.API.YouTube.Objects Imports SCrawler.DownloadObjects.STDownloader Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.XML.Attributes Namespace Plugin.Hosts Friend Class DownloadableMediaHost : Inherits YouTubeMediaContainerBase Protected Overrides Property IDownloadableMedia_Instance As IPluginContentProvider @@ -23,6 +24,7 @@ Namespace Plugin.Hosts End Property Friend Property Instance As UserDataBase Friend ReadOnly Property ExternalSource As IDownloadableMedia = Nothing + Friend Property ThumbAlong As Boolean = False Public Overrides ReadOnly Property Exists As Boolean Get If SiteKey = API.YouTube.YouTubeSiteKey Then @@ -43,7 +45,7 @@ Namespace Plugin.Hosts End Property Public Overrides Sub Delete(ByVal RemoveFiles As Boolean) MyBase.Delete(RemoveFiles) - If Not RemoveFiles And Not Settings.STDownloader_SnapshotsKeepWithFiles And Settings.STDownloader_SnapShotsCachePermamnent Then _ + If Not RemoveFiles And Not Settings.STDownloader_SnapshotsKeepWithFiles And Settings.STDownloader_SnapShotsCachePermamnent And Not ThumbAlong Then _ ThumbnailFile.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.None) End Sub Friend Sub New(ByVal URL As String, ByVal OutputFile As SFile) @@ -100,6 +102,7 @@ Namespace Plugin.Hosts Site = .Site SiteKey = .SiteKey AccountName = .AccountName + If TypeOf ExternalSource Is DownloadableMediaHost Then ThumbAlong = DirectCast(ExternalSource, DownloadableMediaHost).ThumbAlong _HasError = .HasError _Exists = .Exists End With @@ -147,6 +150,8 @@ Namespace Plugin.Hosts d.Duration = s.Duration d.Checked = s.Checked d.AccountName = s.AccountName + If TypeOf s Is DownloadableMediaHost And TypeOf d Is DownloadableMediaHost Then _ + DirectCast(d, DownloadableMediaHost).ThumbAlong = DirectCast(s, DownloadableMediaHost).ThumbAlong End If End Sub Public Overrides Sub Load(ByVal f As SFile) diff --git a/SCrawler/PluginsEnvironment/Hosts/SettingsHostCollection.vb b/SCrawler/PluginsEnvironment/Hosts/SettingsHostCollection.vb index eec287a..38c0668 100644 --- a/SCrawler/PluginsEnvironment/Hosts/SettingsHostCollection.vb +++ b/SCrawler/PluginsEnvironment/Hosts/SettingsHostCollection.vb @@ -320,9 +320,6 @@ Namespace Plugin.Hosts End Property #End Region #Region "Forks" - Friend Sub ResetIndexes() - HostsUnavailableIndexes.Clear() - End Sub Friend Function Available(ByVal What As Download, ByVal Silent As Boolean, Optional ByVal FillIndexes As Boolean = True, Optional ByVal HostNames As IEnumerable(Of String) = Nothing, Optional ByVal HostNamesPassed As Boolean = False) As Boolean diff --git a/SCrawler/SettingsCLS.vb b/SCrawler/SettingsCLS.vb index 4c63e04..ba78753 100644 --- a/SCrawler/SettingsCLS.vb +++ b/SCrawler/SettingsCLS.vb @@ -293,6 +293,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable STDownloader_OnItemDoubleClick = New XMLValue(Of DoubleClickBehavior)("OnItemDoubleClick", DoubleClickBehavior.Folder, MyXML, n) STDownloader_TakeSnapshot = New XMLValue(Of Boolean)("TakeSnapshot", True, MyXML, n) STDownloader_SnapshotsKeepWithFiles = New XMLValue(Of Boolean)("SnapshotsKeepWithFiles", True, MyXML, n) + STDownloader_SnapshotsKeepWithFiles_ThumbAlong = New XMLValue(Of Boolean)("SnapshotsKeepWithFiles_ThumbAlong", False, MyXML, n) STDownloader_SnapShotsCachePermamnent = New XMLValue(Of Boolean)("SnapShotsCachePermamnent", False, MyXML, n) STDownloader_RemoveYTVideosOnClear = New XMLValue(Of Boolean)("RemoveYouTubeVideosOnClear", False, MyXML, n) STDownloader_LoadYTVideos = New XMLValue(Of Boolean)("LoadYouTubeVideos", False, MyXML, n) @@ -824,6 +825,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable End Property Friend ReadOnly Property STDownloader_TakeSnapshot As XMLValue(Of Boolean) Friend ReadOnly Property STDownloader_SnapshotsKeepWithFiles As XMLValue(Of Boolean) + Friend ReadOnly Property STDownloader_SnapshotsKeepWithFiles_ThumbAlong As XMLValue(Of Boolean) Friend ReadOnly Property STDownloader_SnapShotsCachePermamnent As XMLValue(Of Boolean) Friend ReadOnly Property STDownloader_RemoveYTVideosOnClear As XMLValue(Of Boolean) Friend ReadOnly Property STDownloader_LoadYTVideos As XMLValue(Of Boolean)