From 92be0994aee22ad079631aae13661cd0e7ed33bb Mon Sep 17 00:00:00 2001 From: Andy <88590076+AAndyProgram@users.noreply.github.com> Date: Fri, 16 Sep 2022 19:41:24 +0300 Subject: [PATCH] 2022.9.16.0 Removed some compatible functions Fixed Settings.GetUser bug Design improvements Changed UserMediD comparer FeedVideo design updated, incorrect time position fixed, bugs fixed Fixed getting Reddit channel video thumbnail --- Changelog.md | 9 +++ SCrawler/API/Base/UserDataBase.vb | 10 +++ SCrawler/API/Reddit/UserData.vb | 44 ++++++++++- SCrawler/Content/Pictures/StopPic32.png | Bin 0 -> 652 bytes SCrawler/Download/DownloadFeedForm.vb | 85 +++++++++------------- SCrawler/Download/FeedMedia.vb | 2 +- SCrawler/Download/FeedVideo.Designer.vb | 43 +++++------ SCrawler/Download/FeedVideo.resx | 14 ++++ SCrawler/Download/FeedVideo.vb | 40 +++++++++- SCrawler/Download/TDownloader.vb | 17 ++++- SCrawler/MainMod.vb | 1 + SCrawler/My Project/AssemblyInfo.vb | 4 +- SCrawler/My Project/Resources.Designer.vb | 10 +++ SCrawler/My Project/Resources.resx | 3 + SCrawler/SCrawler.vbproj | 1 + SCrawler/SettingsCLS.vb | 35 ++------- 16 files changed, 204 insertions(+), 114 deletions(-) create mode 100644 SCrawler/Content/Pictures/StopPic32.png diff --git a/Changelog.md b/Changelog.md index 7f13c62..a88fca2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,12 @@ +# 2022.9.16.0 + +*2022-09-16* + +- Fixed + - Failed to get video thumbnail for channel video post + - Incorrect rendering of the 'Feed' table when the number of columns is more than one + - Minor design bugs + # 2022.9.13.0 *2022-09-13* diff --git a/SCrawler/API/Base/UserDataBase.vb b/SCrawler/API/Base/UserDataBase.vb index 64da767..f6a9ebb 100644 --- a/SCrawler/API/Base/UserDataBase.vb +++ b/SCrawler/API/Base/UserDataBase.vb @@ -1213,6 +1213,16 @@ BlockNullPicture: Return IIf(FriendlyName.IsEmptyString, Name, FriendlyName) End If End Function + Public Overrides Function GetHashCode() As Integer + Dim hcStr$ + If Not CollectionName.IsEmptyString Then + hcStr = CollectionName + Else + hcStr = IIf(FriendlyName.IsEmptyString, Name, FriendlyName) + End If + If hcStr.IsEmptyString Then hcStr = LVIKey + Return hcStr.GetHashCode + End Function #Region "Buttons actions" Private Sub BTT_CONTEXT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN.Click Downloader.Add(Me) diff --git a/SCrawler/API/Reddit/UserData.vb b/SCrawler/API/Reddit/UserData.vb index 10aef4b..50470dc 100644 --- a/SCrawler/API/Reddit/UserData.vb +++ b/SCrawler/API/Reddit/UserData.vb @@ -164,6 +164,8 @@ Namespace API.Reddit End If If DownloadTopCount.HasValue Then DownloadLimitCount = DownloadTopCount End If + If SaveToCache AndAlso Not Responser.Decoders.Contains(SymbolsConverter.Converters.HTML) Then _ + Responser.Decoders.Add(SymbolsConverter.Converters.HTML) DownloadDataChannel(String.Empty, Token) If ChannelInfo Is Nothing Then _TempPostsList.ListAddList(_TempMediaList.Select(Function(m) m.Post.ID), LNC) Else @@ -371,9 +373,10 @@ Namespace API.Reddit ElseIf Not s.Value({"media", "reddit_video"}, "fallback_url").IsEmptyString Then tmpUrl = s.Value({"media", "reddit_video"}, "fallback_url") If SaveToCache Then - tmpUrl = s.Value("thumbnail") + 'tmpUrl = s.Value("thumbnail") + tmpUrl = GetVideoRedditPreview(s) If Not tmpUrl.IsEmptyString Then - _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) + _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, tmpUrl, PostID, PostDate, _UserID, IsChannel, False), LNC) _TotalPostsDownloaded += 1 End If ElseIf UseM3U8 AndAlso Not s.Value({"media", "reddit_video"}, "hls_url").IsEmptyString Then @@ -471,6 +474,38 @@ Namespace API.Reddit Return False End Try End Function + Private Function GetVideoRedditPreview(ByVal Node As EContainer) As String + Try + If Not Node Is Nothing Then + Dim n As EContainer = Node.ItemF({"preview", "images", 0}) + Dim DestNode$() = Nothing + If If(n?.Count, 0) > 0 Then + If If(n("resolutions")?.Count, 0) > 0 Then + DestNode = {"resolutions"} + ElseIf If(n({"variants", "nsfw", "resolutions"})?.Count, 0) > 0 Then + DestNode = {"variants", "nsfw", "resolutions"} + End If + If Not DestNode Is Nothing Then + With n(DestNode) + Dim sl As List(Of Sizes) = .Select(Function(e) New Sizes(e.Value("width"), e.Value("url"))). + ListWithRemove(Function(ss) ss.HasError Or ss.Data.IsEmptyString) + If sl.ListExists Then + Dim s As Sizes + sl.Sort() + s = sl.First + sl.Clear() + Return s.Data + End If + End With + End If + End If + End If + Return String.Empty + Catch ex As Exception + ProcessException(ex, Nothing, "reddit video preview parsing error", False) + Return String.Empty + End Try + End Function Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken) Try ThrowAny(Token) @@ -593,12 +628,13 @@ Namespace API.Reddit #End Region #Region "Structure creator" Protected Shared Function MediaFromData(ByVal t As UTypes, ByVal _URL As String, ByVal PostID As String, ByVal PostDate As String, - Optional ByVal _UserID As String = "", Optional ByVal IsChannel As Boolean = False) As UserMedia + Optional ByVal _UserID As String = "", Optional ByVal IsChannel As Boolean = False, + Optional ByVal ReplacePreview As Boolean = True) As UserMedia If _URL.IsEmptyString And t = UTypes.Picture Then Return Nothing _URL = LinkFormatterSecure(RegexReplace(_URL.Replace("\", String.Empty), LinkPattern)) Dim m As New UserMedia(_URL, t) With {.Post = New UserPost With {.ID = PostID, .UserID = _UserID}} If t = UTypes.Picture Or t = UTypes.GIF Then m.File = UrlToFile(m.URL) Else m.File = Nothing - If m.URL.Contains("preview") Then m.URL = $"https://i.redd.it/{m.File.File}" + If ReplacePreview And m.URL.Contains("preview") Then m.URL = $"https://i.redd.it/{m.File.File}" If Not PostDate.IsEmptyString Then m.Post.Date = AConvert(Of Date)(PostDate, DateTrueProvider(IsChannel), Nothing) Else m.Post.Date = Nothing Return m End Function diff --git a/SCrawler/Content/Pictures/StopPic32.png b/SCrawler/Content/Pictures/StopPic32.png new file mode 100644 index 0000000000000000000000000000000000000000..c93f6a2ee3d0656a6dd4c4be74c590c00f55ccf9 GIT binary patch literal 652 zcmV;70(1R|P)n6`OUtuM0>{u zU=fm5u2n1qD??ZzX+nxDq)K-xn3Pvoq)e3*X;kpQDCm6f7RDJ4_Lkkf#vi6QZubA) zzInWPTalFN_xp7bY1*}DS7X4ou3d+A#kE?kCn;1(0bUW24ZG?xoCsjo26B)k0Kl^% z5+!eYdvPxRzkHPIpT~0ZGD_~yXvTfdX5 z4||e_CRW#NHnv37ax-E4GtV22@WN9S!3qKZu4#ASc?RJgMh zu#_oP1#AGI+S%Z1=HG25;GgM=xB?F2(awItJTThf>VT=-q6GsMOxQ--D@{hqkjH8o z?d^29Qs5qI(Il;w_F9HKR>QajQoKTzkrC@50OQ{0#VceP9T*rUN`ZTHw;*eWqu!MGrf*2Ei=RA4#yL37_fpqz}&8XFhC|j6fu;xl@)eE(&7g3`2A;1 zS>`jx!-vNMTd`9Qt>ic+PkvFkS*o39-L$vxPIVV(l=E(3PM!WGD;R24!nXy+9`?Eg mhZmls_&Du&;6Nk)Jii0*R|SoWcFIiv0000= 0 Then + If Not RefillInProgress AndAlso Sender.CurrentIndex >= 0 Then + RefillInProgress = True AllowTopScroll = False ScrollSuspended = True - Dim d As List(Of Integer) = MyRange.Indexes(Sender.CurrentIndex, EDP.ReturnValue).ListIfNothing + Dim d As List(Of UserMediaD) = MyRange.Current + Dim d2 As List(Of UserMediaD) Dim i% - If d.Count > 0 Then + If d.ListExists Then ClearTable() If Sender.CurrentIndex > 0 And FeedEndless Then - i = MyRange.Indexes(Sender.CurrentIndex - 1, EDP.ReturnValue).DefaultIfEmpty(-1).Last - If i.ValueBetween(0, DataList.Count - 1) Then - If d.Count = 0 Then d.Add(i) Else d.Insert(0, i) - End If + d2 = DirectCast(MyRange.Switcher, RangeSwitcher(Of UserMediaD)).Item(Sender.CurrentIndex - 1).ListTake(-2, DataColumns, EDP.ReturnValue).ListIfNothing + If d2.Count > 0 Then d.InsertRange(0, d2) : d2.Clear() End If Dim w% = GetWidth() - Dim hp% = PaddingE.GetOf({TP_DATA}).Vertical(2) Dim p As New TPCELL(DataRows, DataColumns) Dim fmList As New List(Of FeedMedia) - Dim rhd As New Dictionary(Of Integer, List(Of Integer)) - For Each i In d - If i.ValueBetween(0, DataList.Count - 1) Then fmList.Add(New FeedMedia(DataList(i), w)) - Next + d.ForEach(Sub(de) fmList.Add(New FeedMedia(de, w))) If fmList.Count > 0 Then fmList.ListDisposeRemoveAll(Function(fm) fm Is Nothing OrElse fm.HasError) If fmList.Count > 0 Then For i = 0 To fmList.Count - 1 - If Not rhd.ContainsKey(p.Row) Then rhd.Add(p.Row, New List(Of Integer)) - rhd(p.Row).Add(fmList(i).Height) - p = p.Next - Next - p = New TPCELL(DataRows, DataColumns) - ControlInvoke(TP_DATA, Sub() - With TP_DATA - With .RowStyles - For i = 0 To .Count - 1 - With .Item(i) : .SizeType = SizeType.Absolute : .Height = 0 : End With - Next - End With - .AutoScroll = False - .AutoScroll = True - End With - End Sub) - For i = 0 To fmList.Count - 1 - ControlInvoke(TP_DATA, Sub() - With TP_DATA - With .RowStyles(p.Row) : .SizeType = SizeType.Absolute : .Height = rhd(p.Row).Max : End With - .Controls.Add(fmList(i), p.Column, p.Row) - End With - End Sub) + ControlInvoke(TP_DATA, Sub() TP_DATA.Controls.Add(fmList(i), p.Column, p.Row)) p = p.Next Next End If + ResizeGrid() fmList.Clear() - rhd.ListForEach(Sub(kv, ii) kv.Value.Clear()) - rhd.Clear() d.Clear() End If + RefillInProgress = False End If Catch ex As Exception ErrorsDescriber.Execute(EDP.SendInLog, ex, $"[DownloadObjects.DownloadFeedForm.Range.IndexChanged({Sender.CurrentIndex})]") + RefillInProgress = False Finally - ControlInvoke(TP_DATA, Sub() - With TP_DATA.VerticalScroll - If Offset = 1 Then .Value = 0 Else .Value = .Maximum - End With - End Sub) - ScrollSuspended = False - DataPopulated = True + If Not RefillInProgress Then + ControlInvoke(TP_DATA, Sub() + With TP_DATA.VerticalScroll + If Offset = 1 Then .Value = 0 Else .Value = .Maximum + End With + End Sub) + ScrollSuspended = False + DataPopulated = True + End If End Try End Sub #End Region #Region "Size" + Private LastWinState As FormWindowState = FormWindowState.Normal Private Function GetWidth() As Integer Return (TP_DATA.Width - PaddingE.GetOf({Me, TP_DATA}).Horizontal(2)) / DataColumns End Function Private Sub DownloadFeedForm_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd + ResizeGrid() + End Sub + Private Sub DownloadFeedForm_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged + If Not LastWinState = WindowState And Not If(MyDefs?.Initializing, True) Then LastWinState = WindowState : ResizeGrid() + End Sub + Private Sub ResizeGrid() ControlInvoke(TP_DATA, Sub() With TP_DATA If .Controls.Count > 0 Then @@ -282,9 +268,10 @@ Namespace DownloadObjects If Not rh.ContainsKey(p.Row) Then rh.Add(p.Row, New List(Of Integer)) rh(p.Row).Add(cnt.Height) Next + For i% = 0 To .RowStyles.Count - 1 : .RowStyles(i).Height = 0 : Next If rh.Count > 0 Then For Each kv In rh - With .RowStyles(kv.Key) : .SizeType = SizeType.Absolute : .Height = kv.Value.Max : End With + .RowStyles(kv.Key).Height = kv.Value.Max kv.Value.Clear() Next End If diff --git a/SCrawler/Download/FeedMedia.vb b/SCrawler/Download/FeedMedia.vb index fbf1cc9..cb7bee4 100644 --- a/SCrawler/Download/FeedMedia.vb +++ b/SCrawler/Download/FeedMedia.vb @@ -131,7 +131,6 @@ Namespace DownloadObjects End With End If - If Not MyVideo Is Nothing Then info &= $" ({MyVideo.VideoLength})" LBL_INFO.Text = info 'TT_MAIN.SetToolTip(LBL_INFO, Information) s = New Size(Width, h + TP_MAIN.RowStyles(0).Height + PaddingE.GetOf({TP_MAIN}).Vertical(2)) @@ -219,6 +218,7 @@ Namespace DownloadObjects If Not Silent Then MsgBoxE({"File deleted", msgTitle}) LBL_INFO.Height = 0 If Not MyPicture Is Nothing Then MyPicture.Size = New Size(0, 0) + If Not MyVideo Is Nothing Then MyVideo.MinimumSize = New Size(0, 0) : MyVideo.Size = New Size(0, 0) Height = 0 Return True End If diff --git a/SCrawler/Download/FeedVideo.Designer.vb b/SCrawler/Download/FeedVideo.Designer.vb index 6a85461..df9b9d2 100644 --- a/SCrawler/Download/FeedVideo.Designer.vb +++ b/SCrawler/Download/FeedVideo.Designer.vb @@ -24,13 +24,14 @@ Namespace DownloadObjects Private Sub InitializeComponent() Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel Dim TP_BUTTONS As System.Windows.Forms.TableLayoutPanel + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(FeedVideo)) Me.MyVideo = New LibVLCSharp.WinForms.VideoView() Me.TR_POSITION = New System.Windows.Forms.TrackBar() + Me.TR_VOLUME = New System.Windows.Forms.TrackBar() + Me.LBL_TIME = New System.Windows.Forms.Label() Me.BTT_PLAY = New System.Windows.Forms.Button() Me.BTT_PAUSE = New System.Windows.Forms.Button() Me.BTT_STOP = New System.Windows.Forms.Button() - Me.TR_VOLUME = New System.Windows.Forms.TrackBar() - Me.LBL_TIME = New System.Windows.Forms.Label() TP_MAIN = New System.Windows.Forms.TableLayoutPanel() TP_BUTTONS = New System.Windows.Forms.TableLayoutPanel() TP_MAIN.SuspendLayout() @@ -99,6 +100,24 @@ Namespace DownloadObjects TP_BUTTONS.Size = New System.Drawing.Size(178, 26) TP_BUTTONS.TabIndex = 2 ' + 'TR_VOLUME + ' + Me.TR_VOLUME.Dock = System.Windows.Forms.DockStyle.Fill + Me.TR_VOLUME.Location = New System.Drawing.Point(81, 3) + Me.TR_VOLUME.Name = "TR_VOLUME" + Me.TR_VOLUME.Size = New System.Drawing.Size(94, 20) + Me.TR_VOLUME.TabIndex = 3 + ' + 'LBL_TIME + ' + Me.LBL_TIME.AutoSize = True + Me.LBL_TIME.Dock = System.Windows.Forms.DockStyle.Fill + Me.LBL_TIME.Location = New System.Drawing.Point(78, 0) + Me.LBL_TIME.Name = "LBL_TIME" + Me.LBL_TIME.Size = New System.Drawing.Size(1, 26) + Me.LBL_TIME.TabIndex = 4 + Me.LBL_TIME.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + ' 'BTT_PLAY ' Me.BTT_PLAY.BackgroundImage = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 @@ -125,7 +144,7 @@ Namespace DownloadObjects ' 'BTT_STOP ' - Me.BTT_STOP.BackgroundImage = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_STOP.BackgroundImage = CType(resources.GetObject("BTT_STOP.BackgroundImage"), System.Drawing.Image) Me.BTT_STOP.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom Me.BTT_STOP.Dock = System.Windows.Forms.DockStyle.Fill Me.BTT_STOP.Location = New System.Drawing.Point(51, 1) @@ -135,24 +154,6 @@ Namespace DownloadObjects Me.BTT_STOP.TabIndex = 2 Me.BTT_STOP.UseVisualStyleBackColor = True ' - 'TR_VOLUME - ' - Me.TR_VOLUME.Dock = System.Windows.Forms.DockStyle.Fill - Me.TR_VOLUME.Location = New System.Drawing.Point(81, 3) - Me.TR_VOLUME.Name = "TR_VOLUME" - Me.TR_VOLUME.Size = New System.Drawing.Size(94, 20) - Me.TR_VOLUME.TabIndex = 3 - ' - 'LBL_TIME - ' - Me.LBL_TIME.AutoSize = True - Me.LBL_TIME.Dock = System.Windows.Forms.DockStyle.Fill - Me.LBL_TIME.Location = New System.Drawing.Point(78, 0) - Me.LBL_TIME.Name = "LBL_TIME" - Me.LBL_TIME.Size = New System.Drawing.Size(1, 26) - Me.LBL_TIME.TabIndex = 4 - Me.LBL_TIME.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - ' 'FeedVideo ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) diff --git a/SCrawler/Download/FeedVideo.resx b/SCrawler/Download/FeedVideo.resx index 9ff4749..98674e2 100644 --- a/SCrawler/Download/FeedVideo.resx +++ b/SCrawler/Download/FeedVideo.resx @@ -123,4 +123,18 @@ False + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAGLSURBVFhH7Vc7TsNAEPUNaDhAxAl8EaT0UKRFoqdNTcsp + qHIEHyGn4CNAiihwu7w3mTFrZeI466Ch4Emv8O7Mm9nd8X6qsWjbtgaXYAOmPWQfbWp1mw6ILcA16AUc + In0WKnM84DwDu9F+vb6kzcN9eru6TM8XZ+npvOqRbeyjDW3NTzVmKjsOcJiDGwpQ7P3meifgIdInS4Ra + c5UfBgw55eL4uXp0RzuW9KWG6VFbw/iAAUcuxh93t65oCalluoyh4fpAB9dcpv2UwY1ZEoyxWxNolILj + lHkCp2C2HI2G3QINsu4smilrfojUzgrzpx7wIf/5vmovhafFGJrA2oJzh5PMPAeyFJ4Wmc1CzQS4dcoG + 4hmTpfC0SMbSBJZd8XEX84zJUnhaJGNpAg0TkI+h4iuFp0UylsXtEvAMjaXwtIz/Cfy9BCKLMPw3DN+I + YrdiPQ/iDiMCHxHHcf9mhIa4CwmBxtgrGYGOuEupAQZx13IDDOMeJgY4xD3NcsB5yuP0uFEPAWK/8Dyv + qm/Ki638CNApKAAAAABJRU5ErkJggg== + + \ No newline at end of file diff --git a/SCrawler/Download/FeedVideo.vb b/SCrawler/Download/FeedVideo.vb index 1080111..7272982 100644 --- a/SCrawler/Download/FeedVideo.vb +++ b/SCrawler/Download/FeedVideo.vb @@ -10,6 +10,7 @@ Imports LibVLCSharp Imports System.ComponentModel Imports PersonalUtilities.Tools Imports PersonalUtilities.Tools.WEB +Imports VLCState = LibVLCSharp.Shared.VLCState Namespace DownloadObjects Public Class FeedVideo @@ -21,11 +22,16 @@ Namespace DownloadObjects Private ReadOnly TimeChangeLabel As Action = Sub() If MediaPlayer.Time >= 0 Then Dim t As TimeSpan = TimeSpan.FromMilliseconds(MediaPlayer.Time) - LBL_TIME.Text = $"{VideoLength}/{t}" + If Not VideoLength.HasValue Then + VideoLength = TimeSpan.FromMilliseconds(MediaPlayer.Length) + VideoLengthStr = VideoLength.Value.ToStringTime(FeedVideoLengthProvider) + End If + LBL_TIME.Text = $"{t.ToStringTime(FeedVideoLengthProvider)}/{VideoLengthStr}" End If End Sub Private ReadOnly MyImage As ImageRenderer - Friend ReadOnly VideoLength As TimeSpan + Private VideoLength As TimeSpan? + Private VideoLengthStr As String Public Sub New() InitializeComponent() End Sub @@ -38,7 +44,6 @@ Namespace DownloadObjects MediaPlayer = New [Shared].MediaPlayer(New [Shared].Media(New [Shared].LibVLC(enableDebugLogs:=debugLogs), New Uri(File.ToString))) MyVideo.MediaPlayer = MediaPlayer TR_VOLUME.Value = MediaPlayer.Volume / 10 - If MediaPlayer.Length >= 0 Then VideoLength = TimeSpan.FromMilliseconds(MediaPlayer.Length) If Settings.UseM3U8 Then Dim f As SFile = $"{Settings.CachePath.PathWithSeparator}FeedSnapshots\{File.GetHashCode}.png" If Not f.Exists Then f = FFMPEG.TakeSnapshot(File, f, Settings.FfmpegFile, TimeSpan.FromSeconds(1)) @@ -50,19 +55,30 @@ Namespace DownloadObjects End If End If End If + UpdateButtons() End Sub Private Sub FeedVideo_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed If Not MediaPlayer Is Nothing Then MediaPlayer.Dispose() If Not MyImage Is Nothing Then MyImage.Dispose() End Sub Private Sub BTT_PLAY_Click(sender As Object, e As EventArgs) Handles BTT_PLAY.Click - Try : MediaPlayer.Play() : Catch : End Try + Try + Select Case MediaPlayer.State + Case VLCState.NothingSpecial, VLCState.Stopped, VLCState.Paused : MediaPlayer.Play() + Case VLCState.Ended : MediaPlayer.Stop() : MediaPlayer.Play() + End Select + Catch + Finally + UpdateButtons() + End Try End Sub Private Sub BTT_PAUSE_Click(sender As Object, e As EventArgs) Handles BTT_PAUSE.Click Try : MediaPlayer.Pause() : Catch : End Try + UpdateButtons() End Sub Private Sub BTT_STOP_Click(sender As Object, e As EventArgs) Handles BTT_STOP.Click Try : MediaPlayer.Stop() : Catch : End Try + UpdateButtons() End Sub Private Sub MediaPlayer_TimeChanged(sender As Object, e As [Shared].MediaPlayerTimeChangedEventArgs) Handles MediaPlayer.TimeChanged If TR_POSITION.InvokeRequired Then TR_POSITION.Invoke(TimeChange) Else TimeChange.Invoke @@ -77,6 +93,22 @@ Namespace DownloadObjects Private Sub MediaPlayer_Stopped(sender As Object, e As EventArgs) Handles MediaPlayer.Stopped Dim a As Action = Sub() TR_POSITION.Value = TR_POSITION.Maximum If TR_POSITION.InvokeRequired Then TR_POSITION.Invoke(a) Else a.Invoke + UpdateButtons() + End Sub + Private Sub UpdateButtons() Handles MediaPlayer.Playing, MediaPlayer.Paused, MediaPlayer.Opening + Try + Dim _play As Boolean = False, _pause As Boolean = False, _stop As Boolean = False + Select Case MediaPlayer.State + Case VLCState.NothingSpecial, VLCState.Stopped : _play = True + Case VLCState.Paused : _play = True : _stop = True + Case VLCState.Ended : _play = True + Case VLCState.Playing : _pause = True : _stop = True + End Select + ControlInvoke(BTT_PLAY, Sub() BTT_PLAY.Enabled = _play) + ControlInvoke(BTT_PAUSE, Sub() BTT_PAUSE.Enabled = _pause) + ControlInvoke(BTT_STOP, Sub() BTT_STOP.Enabled = _stop) + Catch + End Try End Sub End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Download/TDownloader.vb b/SCrawler/Download/TDownloader.vb index 68936a4..fc6e090 100644 --- a/SCrawler/Download/TDownloader.vb +++ b/SCrawler/Download/TDownloader.vb @@ -27,13 +27,22 @@ Namespace DownloadObjects Friend ReadOnly User As IUserData Friend ReadOnly Data As UserMedia Friend ReadOnly [Date] As Date - Friend Sub New(ByVal Data As UserMedia, ByVal User As IUserData) + Private ReadOnly Session As Integer + Friend Sub New(ByVal Data As UserMedia, ByVal User As IUserData, ByVal Session As Integer) Me.Data = Data Me.User = User [Date] = Now + Me.Session = Session End Sub Private Function CompareTo(ByVal Other As UserMediaD) As Integer Implements IComparable(Of UserMediaD).CompareTo - Return [Date].Ticks.CompareTo(Other.Date.Ticks) * -1 + 'Return [Date].Ticks.CompareTo(Other.Date.Ticks) * -1 + Return GetCompareValue(Me).CompareTo(GetCompareValue(Other)) * -1 + End Function + Private Function GetCompareValue(ByVal m As UserMediaD) As Double + Dim v# = m.Session * 10000 + If Not m.User Is Nothing Then v += m.User.GetHashCode + 'v += m.[Date].Ticks + Return v End Function Private Overloads Function Equals(ByVal Other As UserMediaD) As Boolean Implements IEquatable(Of UserMediaD).Equals Return Data.File = Other.Data.File @@ -214,12 +223,14 @@ Namespace DownloadObjects #Region "Thread" Private CheckerThread As Thread Private MissingPostsDetected As Boolean = False + Private Session As Integer = 0 Private Sub [Start]() If Not AutoDownloaderWorking AndAlso MyProgressForm.ReadyToOpen AndAlso Pool.LongCount(Function(p) p.Count > 0) > 1 Then MyProgressForm.Show() : MainFrameObj.Focus() If Not If(CheckerThread?.IsAlive, False) Then MainProgress.Visible = True If Not AutoDownloaderWorking AndAlso InfoForm.ReadyToOpen Then InfoForm.Show() : MainFrameObj.Focus() MissingPostsDetected = False + Session += 1 CheckerThread = New Thread(New ThreadStart(AddressOf JobsChecker)) CheckerThread.SetApartmentState(ApartmentState.MTA) CheckerThread.Start() @@ -342,7 +353,7 @@ Namespace DownloadObjects If Not .Disposed AndAlso Not .IsCollection AndAlso .DownloadedTotal(False) > 0 Then If Not Downloaded.Contains(.Self) Then Downloaded.Add(Settings.GetUser(.Self)) With DirectCast(.Self, UserDataBase) - If .LatestData.Count > 0 Then Files.ListAddList(.LatestData.Select(Function(d) New UserMediaD(d, .Self)), FilesLP) + If .LatestData.Count > 0 Then Files.ListAddList(.LatestData.Select(Function(d) New UserMediaD(d, .Self, Session)), FilesLP) End With dcc = True End If diff --git a/SCrawler/MainMod.vb b/SCrawler/MainMod.vb index 25f1bfd..ab3a2e1 100644 --- a/SCrawler/MainMod.vb +++ b/SCrawler/MainMod.vb @@ -95,6 +95,7 @@ Friend Module MainMod Friend MyProgressForm As ActiveDownloadingProgress Friend MainFrameObj As MainFrameObjects Friend ReadOnly ParsersDataDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Friend ReadOnly FeedVideoLengthProvider As New ADateTime("hh\:mm\:ss") With {.TimeParseMode = ADateTime.TimeModes.TimeSpan} Friend ReadOnly LogConnector As New LogHost #Region "File name operations" Friend FileDateAppenderProvider As IFormatProvider diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb index 870ff4f..ff2baa7 100644 --- a/SCrawler/My Project/AssemblyInfo.vb +++ b/SCrawler/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler/My Project/Resources.Designer.vb b/SCrawler/My Project/Resources.Designer.vb index 2e86318..86ed3f0 100644 --- a/SCrawler/My Project/Resources.Designer.vb +++ b/SCrawler/My Project/Resources.Designer.vb @@ -350,6 +350,16 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property StopPic32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("StopPic32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + ''' ''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon). ''' diff --git a/SCrawler/My Project/Resources.resx b/SCrawler/My Project/Resources.resx index be49678..dc3a063 100644 --- a/SCrawler/My Project/Resources.resx +++ b/SCrawler/My Project/Resources.resx @@ -211,4 +211,7 @@ ..\Content\Pictures\RSSPic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Content\Pictures\StopPic32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/SCrawler/SCrawler.vbproj b/SCrawler/SCrawler.vbproj index 596e4ac..4973176 100644 --- a/SCrawler/SCrawler.vbproj +++ b/SCrawler/SCrawler.vbproj @@ -491,6 +491,7 @@ + PreserveNewest diff --git a/SCrawler/SettingsCLS.vb b/SCrawler/SettingsCLS.vb index dc8ca16..a565e7f 100644 --- a/SCrawler/SettingsCLS.vb +++ b/SCrawler/SettingsCLS.vb @@ -77,9 +77,7 @@ Friend Class SettingsCLS : Implements IDisposable FastProfilesLoading = New XMLValue(Of Boolean)("FastProfilesLoading", False, MyXML) MaxLargeImageHeight = New XMLValue(Of Integer)("MaxLargeImageHeight", 150, MyXML) - MaxLargeImageHeight.ReplaceByValue("MaxLargeImageHeigh",, MyXML) MaxSmallImageHeight = New XMLValue(Of Integer)("MaxSmallImageHeight", 15, MyXML) - MaxSmallImageHeight.ReplaceByValue("MaxSmallImageHeigh",, MyXML) DownloadOpenInfo = New XMLValueAttribute(Of Boolean, Boolean)("DownloadOpenInfo", "OpenAgain", False, False, MyXML) DownloadOpenProgress = New XMLValueAttribute(Of Boolean, Boolean)("DownloadOpenProgress", "OpenAgain", False, False, MyXML) DownloadsCompleteCommand = New XMLValueAttribute(Of String, Boolean)("DownloadsCompleteCommand", "Use",,, MyXML) @@ -344,46 +342,23 @@ Friend Class SettingsCLS : Implements IDisposable End Try End Sub Friend Overloads Function GetUser(ByVal User As IUserData, Optional ByVal GetCollection As Boolean = False) As IUserData - If Users.Count > 0 Then - Dim uSimple As Predicate(Of IUserData) = Function(u) u.Equals(DirectCast(User, UserDataBase)) - Dim uCol As Predicate(Of IUserData) = Function(ByVal u As IUserData) As Boolean - If u.IsCollection Then - Return DirectCast(u, UserDataBind).Collections.Exists(uSimple) - Else - Return False - End If - End Function - Dim uu As Predicate(Of IUserData) - If User.IncludedInCollection Then uu = uCol Else uu = uSimple - Dim i% = Users.FindIndex(uu) - If i >= 0 Then - If Users(i).IsCollection Then - With DirectCast(Users(i), UserDataBind) - i = .Collections.FindIndex(uSimple) - If i >= 0 Then Return If(GetCollection, Users(i), .Collections(i)) - End With - Else - Return Users(i) - End If - End If - End If - Return Nothing + Return GetUser(If(User?.Key, String.Empty), GetCollection) End Function Friend Overloads Function GetUser(ByVal UserKey As String, Optional ByVal GetCollection As Boolean = False) As IUserData - If Users.Count > 0 Then + If Users.Count > 0 And Not UserKey.IsEmptyString Then Dim finder As Predicate(Of IUserData) = Function(u) u.Key = UserKey Dim i%, ii% For i = 0 To Users.Count - 1 With Users(i) - If .IsCollection Then + If finder.Invoke(.Self) Then + Return .Self + ElseIf .IsCollection Then With DirectCast(.Self, UserDataBind) If .Count > 0 Then ii = .Collections.FindIndex(finder) If ii >= 0 Then Return If(GetCollection, .Self, .Collections(ii)) End If End With - Else - If finder.Invoke(.Self) Then Return .Self End If End With Next