mirror of
https://github.com/AAndyProgram/SCrawler.git
synced 2026-03-15 00:02:17 +00:00
Add 'Path' plugin UserDataBase: changed file names for saved posts; removed 'Self' property; add 'MyFileSettings' field; added UserSiteName; changed download envir algo Twitter: added MD5 comparison; duplicate images removal option; UserSiteName parsing; download icon and banner Instagram: added a new option for token 'www_claim'; removed requirement of token 'www_claim'; UserSiteName parsing; download icon Reddit: UserSiteName parsing; download icon and banner PornHub: fixed unicode titles XHamster: added channels ffmpeg: fixed max input length error during files combining; fixed encoding issue Feed: added images centering; added BackColor and ForeColor change MainFrame: added BackColor, ForeColor, and BackgroungImage change; added 'UpdateLogButton' when load completed ListImagesLoader: fixed wrong notification when no users found SettingsCLS: updated users loading algo
296 lines
14 KiB
VB.net
296 lines
14 KiB
VB.net
' Copyright (C) 2023 Andy https://github.com/AAndyProgram
|
|
' This program is free software: you can redistribute it and/or modify
|
|
' it under the terms of the GNU General Public License as published by
|
|
' the Free Software Foundation, either version 3 of the License, or
|
|
' (at your option) any later version.
|
|
'
|
|
' This program is distributed in the hope that it will be useful,
|
|
' but WITHOUT ANY WARRANTY
|
|
Imports System.ComponentModel
|
|
Imports SCrawler.API.Base
|
|
Imports PersonalUtilities.Forms
|
|
Imports PersonalUtilities.Tools
|
|
Imports UserMediaD = SCrawler.DownloadObjects.TDownloader.UserMediaD
|
|
Namespace DownloadObjects
|
|
<ToolboxItem(False), DesignTimeVisible(False)>
|
|
Public Class FeedMedia
|
|
#Region "Events"
|
|
Friend Event MediaDeleted(ByVal Sender As Object)
|
|
#End Region
|
|
#Region "Declarations"
|
|
Private Const VideoHeight As Integer = 450
|
|
Private WithEvents MyPicture As PictureBox
|
|
Private ReadOnly MyImage As ImageRenderer
|
|
Private ReadOnly MyVideo As FeedVideo
|
|
Friend ReadOnly Property Exists As Boolean
|
|
Get
|
|
Return Not MyPicture Is Nothing Or Not MyVideo Is Nothing
|
|
End Get
|
|
End Property
|
|
Friend ReadOnly Property HasError As Boolean
|
|
Friend ReadOnly File As SFile
|
|
Public Shadows Property Width(Optional ByVal UpdateImage As Boolean = True) As Integer
|
|
Get
|
|
Return MyBase.Width
|
|
End Get
|
|
Set(ByVal w As Integer)
|
|
If Size.Width <> w Then
|
|
Dim s As New Size(w, If(MyImage Is Nothing, VideoHeight, If(UpdateImage, MyImage.FitToWidthF(w).Height, MyPicture.Height)))
|
|
Dim objSize As Size = s
|
|
objSize.Height += ObjectsPaddingHeight
|
|
MinimumSize = objSize
|
|
MyBase.MaximumSize = objSize
|
|
Size = objSize
|
|
If UpdateImage AndAlso Not MyImage Is Nothing Then
|
|
With MyPicture
|
|
.MinimumSize = Nothing
|
|
.MaximumSize = Nothing
|
|
.Size = s
|
|
.MinimumSize = s
|
|
.MaximumSize = s
|
|
End With
|
|
End If
|
|
End If
|
|
End Set
|
|
End Property
|
|
Private ReadOnly Property ObjectsPaddingHeight
|
|
Get
|
|
Return TP_MAIN.RowStyles(0).Height + PaddingE.GetOf({TP_MAIN}).Vertical(2)
|
|
End Get
|
|
End Property
|
|
Private ReadOnly UserKey As String
|
|
Private ReadOnly Post As UserMedia
|
|
Friend ReadOnly Property Checked As Boolean
|
|
Get
|
|
Return CH_CHECKED.Checked
|
|
End Get
|
|
End Property
|
|
Friend ReadOnly Property Information As String
|
|
Private Function GetImageResize(ByVal Width As Integer, ByVal Height As Integer) As Size
|
|
If Height > 0 Then
|
|
Dim h% = Height = ObjectsPaddingHeight
|
|
If h <= 0 Then h = Height
|
|
Dim s As Size = MyImage.FitToHeightF(h)
|
|
s = MyImage.FitToWidthF(s, Width, False)
|
|
If s.Height > MyImage.Height Then s = MyImage.Size
|
|
Return s
|
|
Else
|
|
Return MyImage.FitToWidthF(Width)
|
|
End If
|
|
End Function
|
|
Friend Sub RerenderObject(ByVal Width As Integer, ByVal Height As Integer)
|
|
If Not MyImage Is Nothing Then
|
|
Dim s As Size
|
|
If Height > 0 Then
|
|
s = GetImageResize(Width, Height)
|
|
With MyPicture
|
|
.MinimumSize = Nothing
|
|
.MaximumSize = Nothing
|
|
.Size = s
|
|
.MinimumSize = s
|
|
.MaximumSize = s
|
|
.Anchor = AnchorStyles.Top
|
|
End With
|
|
Me.Width(False) = Width
|
|
Else
|
|
Me.Width = Width
|
|
MyPicture.Anchor = AnchorStyles.Left + AnchorStyles.Top
|
|
End If
|
|
Else
|
|
Me.Width = Width
|
|
End If
|
|
End Sub
|
|
Private Sub ApplyColors()
|
|
If Settings.FeedBackColor.Exists Then
|
|
BackColor = Settings.FeedBackColor
|
|
LBL_INFO.BackColor = Settings.FeedBackColor
|
|
End If
|
|
If Settings.FeedForeColor.Exists Then
|
|
ForeColor = Settings.FeedForeColor
|
|
LBL_INFO.ForeColor = Settings.FeedForeColor
|
|
End If
|
|
End Sub
|
|
#End Region
|
|
#Region "Initializers"
|
|
Public Sub New()
|
|
InitializeComponent()
|
|
End Sub
|
|
Friend Sub New(ByVal Media As UserMediaD, ByVal Width As Integer, ByVal Height As Integer, ByVal Handler As MediaDeletedEventHandler)
|
|
Try
|
|
InitializeComponent()
|
|
File = Media.Data.File
|
|
If Not File.Exists And Media.Data.Type = UserMedia.Types.Video Then File.Path = $"{File.Path.CSFilePS}Video"
|
|
If Not File.Exists Then
|
|
If Not Media.Data.SpecialFolder.IsEmptyString Then
|
|
File.Path = $"{File.Path.CSFilePS}{Media.Data.SpecialFolder}".CSFileP
|
|
If Not File.Exists And Media.Data.Type = UserMedia.Types.Video Then File.Path = $"{File.Path.CSFilePS}Video"
|
|
End If
|
|
End If
|
|
If File.Exists Then
|
|
Information = $"Type: {Media.Data.Type}"
|
|
Information.StringAppendLine($"File: {File.File}")
|
|
Information.StringAppendLine($"Address: {File}")
|
|
Information.StringAppendLine($"Downloaded: {Media.Date.ToStringDate(ADateTime.Formats.BaseDateTime)}")
|
|
If Media.Data.Post.Date.HasValue Then Information.StringAppendLine($"Posted: {Media.Data.Post.Date.Value.ToStringDate(ADateTime.Formats.BaseDateTime)}")
|
|
Dim infoType As UserMedia.Types = Media.Data.Type
|
|
Dim h%
|
|
Dim s As Size
|
|
|
|
Post = Media.Data
|
|
|
|
Select Case Media.Data.Type
|
|
Case UserMedia.Types.Picture, UserMedia.Types.GIF
|
|
MyImage = New ImageRenderer(File)
|
|
Dim a As AnchorStyles = AnchorStyles.Top + If(Height > 0, 0, AnchorStyles.Left)
|
|
s = GetImageResize(Width, Height)
|
|
h = s.Height
|
|
MyPicture = New PictureBox With {
|
|
.SizeMode = PictureBoxSizeMode.Zoom,
|
|
.Image = MyImage,
|
|
.InitialImage = .Image,
|
|
.Dock = DockStyle.None,
|
|
.Anchor = a,
|
|
.Size = s,
|
|
.MinimumSize = s,
|
|
.MaximumSize = s,
|
|
.Tag = File,
|
|
.Margin = New Padding(0),
|
|
.Padding = New Padding(0),
|
|
.ContextMenuStrip = CONTEXT_DATA
|
|
}
|
|
TP_MAIN.Controls.Add(MyPicture, 0, 1)
|
|
BTT_CONTEXT_OPEN_MEDIA.Text &= " picture"
|
|
BTT_CONTEXT_DELETE.Text &= " picture"
|
|
Case UserMedia.Types.Video, UserMedia.Types.m3u8
|
|
infoType = UserMedia.Types.Video
|
|
MyVideo = New FeedVideo(File) With {.Tag = File, .Dock = DockStyle.Fill, .ContextMenuStrip = CONTEXT_DATA}
|
|
If MyVideo.HasError Then HasError = True
|
|
TP_MAIN.Controls.Add(MyVideo, 0, 1)
|
|
BTT_CONTEXT_OPEN_MEDIA.Text &= " video"
|
|
BTT_CONTEXT_DELETE.Text &= " video"
|
|
h = VideoHeight
|
|
Case Else : Throw New ArgumentNullException With {.HelpLink = 1}
|
|
End Select
|
|
|
|
Dim info$ = $"[{infoType}] - "
|
|
|
|
If Not Media.User Is Nothing Then
|
|
With Media.User
|
|
UserKey = .Key
|
|
Information &= vbNewLine.StringDup(2)
|
|
If .IncludedInCollection Then Information.StringAppendLine($"User collection: { .CollectionName}")
|
|
Information.StringAppendLine($"User site: { .Site}")
|
|
Information.StringAppendLine($"User name: {IIf(Not .FriendlyName.IsEmptyString And Not .IncludedInCollection, .FriendlyName, .Name)}")
|
|
If .Site = API.Instagram.InstagramSite Then BTT_CONTEXT_OPEN_USER_POST.Visible = False
|
|
If .IncludedInCollection Then info &= $"[{ .CollectionName}]: "
|
|
info &= $"{ .Site} - {IIf(Not .FriendlyName.IsEmptyString And Not .IncludedInCollection, .FriendlyName, .Name)}"
|
|
End With
|
|
End If
|
|
|
|
If Settings.FeedAddSessionToCaption Then info = $"[{Media.Session}] {info}"
|
|
If Settings.FeedAddDateToCaption Then info &= $" ({Media.Date.ToStringDate(ADateTime.Formats.BaseDateTime)})"
|
|
LBL_INFO.Text = info
|
|
|
|
s = New Size(Width, h + ObjectsPaddingHeight)
|
|
Size = s
|
|
MinimumSize = s
|
|
MaximumSize = s
|
|
ApplyColors()
|
|
If Not Handler Is Nothing Then AddHandler Me.MediaDeleted, Handler
|
|
Else
|
|
Throw New ArgumentNullException With {.HelpLink = 1}
|
|
End If
|
|
Catch aex As ArgumentNullException When aex.HelpLink = 1
|
|
HasError = True
|
|
Catch tex As Threading.ThreadStateException
|
|
HasError = True
|
|
Catch ex As Exception
|
|
ErrorsDescriber.Execute(EDP.SendInLog, ex, $"[DownloadObjects.FeedMedia({File})]")
|
|
HasError = True
|
|
End Try
|
|
End Sub
|
|
#End Region
|
|
#Region "Dispose"
|
|
Private Sub FeedImage_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
|
|
If Not MyImage Is Nothing Then MyImage.Dispose()
|
|
If Not MyPicture Is Nothing Then MyPicture.Dispose()
|
|
If Not MyVideo Is Nothing Then MyVideo.Dispose()
|
|
End Sub
|
|
#End Region
|
|
#Region "LBL"
|
|
Private Sub LBL_INFO_MouseClick(sender As Object, e As MouseEventArgs) Handles LBL_INFO.MouseClick
|
|
If e.Button = MouseButtons.Left Then ControlInvoke(CH_CHECKED, Sub() CH_CHECKED.Checked = Not CH_CHECKED.Checked)
|
|
End Sub
|
|
Private Sub LBL_INFO_DoubleClick(sender As Object, e As EventArgs) Handles LBL_INFO.DoubleClick
|
|
If Not UserKey.IsEmptyString Then
|
|
Dim u As IUserData = Settings.GetUser(UserKey)
|
|
If Not u Is Nothing Then u.OpenFolder()
|
|
End If
|
|
End Sub
|
|
#End Region
|
|
#Region "Picture / Video objects"
|
|
Private Sub MyPicture_DoubleClick(sender As Object, e As EventArgs) Handles MyPicture.DoubleClick
|
|
Try : Process.Start(File) : Catch : End Try
|
|
End Sub
|
|
#End Region
|
|
#Region "Context"
|
|
Private Sub BTT_CONTEXT_OPEN_MEDIA_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_MEDIA.Click
|
|
File.Open(, EDP.None)
|
|
End Sub
|
|
Private Sub BTT_CONTEXT_OPEN_USER_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_USER.Click
|
|
If Not UserKey.IsEmptyString Then
|
|
Dim u As IUserData = Settings.GetUser(UserKey)
|
|
If Not u Is Nothing Then u.OpenFolder()
|
|
End If
|
|
End Sub
|
|
Private Sub BTT_CONTEXT_OPEN_USER_URL_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_USER_URL.Click
|
|
If Not UserKey.IsEmptyString Then
|
|
Dim u As IUserData = Settings.GetUser(UserKey)
|
|
If Not u Is Nothing Then u.OpenSite()
|
|
End If
|
|
End Sub
|
|
Private Sub BTT_CONTEXT_OPEN_USER_POST_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_USER_POST.Click
|
|
Try
|
|
If Not UserKey.IsEmptyString And Not Post.Post.ID.IsEmptyString Then
|
|
Dim u As IUserData = Settings.GetUser(UserKey)
|
|
If Not u Is Nothing Then
|
|
Dim url$ = UserDataBase.GetPostUrl(u, Post)
|
|
If Not url.IsEmptyString Then
|
|
Try : Process.Start(url) : Catch : End Try
|
|
End If
|
|
End If
|
|
End If
|
|
Catch ex As Exception
|
|
ErrorsDescriber.Execute(EDP.LogMessageValue, ex, $"[FeedMedia.OpenPost({UserKey}, {Post.Post.ID})]")
|
|
End Try
|
|
End Sub
|
|
Private Sub BTT_CONTEXT_FIND_USER_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_FIND_USER.Click
|
|
If Not UserKey.IsEmptyString Then MainFrameObj.FocusUser(UserKey, True)
|
|
End Sub
|
|
Private Sub BTT_CONTEXT_INFO_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_INFO.Click
|
|
MsgBoxE({Information, "Post information"})
|
|
End Sub
|
|
Private Sub BTT_CONTEXT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DELETE.Click
|
|
DeleteFile(False)
|
|
End Sub
|
|
Friend Function DeleteFile(ByVal Silent As Boolean) As Boolean
|
|
Const msgTitle$ = "Deleting a file"
|
|
Try
|
|
If Silent OrElse MsgBoxE({$"Are you sure you want to delete the [{File.File}] file?{vbCr}{File}", msgTitle}, vbExclamation,,, {"Process", "Cancel"}) = 0 Then
|
|
If Not MyVideo Is Nothing Then MyVideo.Stop()
|
|
If File.Delete(SFO.File, Settings.DeleteMode, EDP.ThrowException) Then
|
|
If Not Silent Then RaiseEvent MediaDeleted(Me) : MsgBoxE({"File deleted", msgTitle})
|
|
LBL_INFO.Height = 0
|
|
Height = 0
|
|
Return True
|
|
End If
|
|
End If
|
|
Return False
|
|
Catch ex As Exception
|
|
Dim e As New ErrorsDescriber(EDP.LogMessageValue) With {.ShowMainMsg = Not Silent, .ShowExMsg = .ShowMainMsg}
|
|
Return ErrorsDescriber.Execute(e, ex, $"[FeedMedia.DeleteFile({File})]", False)
|
|
End Try
|
|
End Function
|
|
#End Region
|
|
End Class
|
|
End Namespace |