Files
SCrawler/SCrawler/PluginsEnvironment/Hosts/DownloadableMediaHost.vb
Andy 51d8326807 2026.9.21.0
YT
VideoOptionsForm: handling of type 'audio+video'
YouTubeMediaContainerBase: move 'DataReceivedEventHandler' to a public module

SC
REMOVE: Mastodon, Imgur
API.UserDataBase: remove unused references; optimize the use of '_ForceSaveUserData' and '_ForceSaveUserInfo'; update 'ErrorDownloading' function
API.Base.YTDLP: add 'SetProgress' and 'CreateFileExchanger' functions
API.Bluesky: add 'UseMD5Comparison' and 'RemoveExistingDuplicates' options; handling errors 502 and 504; update 'UserExists' detection
API.Instagram: switch to 'GraphQL'
API.OnlyFans: add a special label 'DRM'
API.PornHub: fix photo and video downloads; add yt-dlp support
API.Reddit: remove predefined 'ClientID' and 'ClientSecret'; update 'AvailableTrueValue' function; add REST API support; fix carousels downloading; remove Imgur support
API.ThisVid: fix profile info
API.Twitter: remove Mastodon compatibility; update bookmarks link
API.Xhamster: update yt-dlp
Automation: remove unused references
DownloadFeedForm: new feeds do not appear in the 'Load' toolbar dropdown
MissingPostsForm: add 'ESC' hotkey
TDownloader: implement the ability to add to the log a list of users who have missing posts; exclude the 'Path' plugin from downloading
VideoDownloaderForm: remove Imgur support
DownloadableMediaHost: remove Imgur support; protect photos from deletion
PluginHost: remove Mastodon
SettingsCLS: add 'AddMissingPostUsersToLog' property
2026-09-21 17:57:58 +03:00

183 lines
8.3 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.Threading
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
Get
Return Instance
End Get
Set(ByVal _Instance As IPluginContentProvider)
Instance = _Instance
End Set
End Property
Friend Property Instance As UserDataBase
Friend ReadOnly Property ExternalSource As IDownloadableMedia = Nothing
<XMLEC> Friend Property ThumbAlong As Boolean = False
Public Overrides ReadOnly Property Exists As Boolean
Get
If SiteKey = API.YouTube.YouTubeSiteKey Then
Return MyBase.Exists
Else
Return _Exists
End If
End Get
End Property
Public Overrides Property File As SFile
Get
Return _File
End Get
Set(ByVal f As SFile)
_File = f
FileSetManually = True
End Set
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 And Not ThumbAlong And
(Files.Count = 0 OrElse Not Files.Contains(ThumbnailFile)) Then _
ThumbnailFile.Delete(SFO.File, SFODelete.DeleteToRecycleBin, EDP.None)
End Sub
Friend Sub New(ByVal URL As String, ByVal OutputFile As SFile)
Me.URL = URL
Me.File = OutputFile
End Sub
Friend Sub New(ByVal f As SFile)
Load(f)
If _Exists Then
Dim plugin As SettingsHostCollection
SiteIcon = Nothing
If Not MediaState = UserMediaStates.Downloaded Then
If Not SiteKey.IsEmptyString Then
If SiteKey = API.Gfycat.Envir.SiteKey Then
Instance = New API.Gfycat.Envir
Else
plugin = Settings(SiteKey)
If plugin Is Nothing Then
_Exists = False
Else
Instance = plugin(AccountName, True).GetInstance(ISiteSettings.Download.SingleObject, Nothing, False, False)
Instance.AccountName = AccountName
End If
End If
If _Exists And Not Instance Is Nothing AndAlso Not Instance.HOST Is Nothing Then SiteIcon = Instance.HOST.Source.Image
Else
_Exists = False
End If
Else
plugin = Settings(SiteKey)
If Not plugin Is Nothing Then
Dim i As UserDataBase = plugin(AccountName, True).GetInstance(ISiteSettings.Download.SingleObject, Nothing, False, False)
If Not i Is Nothing Then
i.AccountName = AccountName
If Not i.HOST.Source.Image Is Nothing Then
SiteIcon = i.HOST.Source.Image
ElseIf Not i.HOST.Source.Icon Is Nothing Then
SiteIcon = i.HOST.Source.Icon.ToBitmap
End If
i.Dispose()
End If
End If
End If
End If
End Sub
Friend Sub New(ByVal Source As IDownloadableMedia)
ExternalSource = Source
ExchangeData(ExternalSource, Me)
If Not ExternalSource Is Nothing Then
With ExternalSource
SiteIcon = .SiteIcon
Site = .Site
SiteKey = .SiteKey
AccountName = .AccountName
If TypeOf ExternalSource Is DownloadableMediaHost Then ThumbAlong = DirectCast(ExternalSource, DownloadableMediaHost).ThumbAlong
_HasError = .HasError
_Exists = .Exists
End With
End If
End Sub
Public Overrides Function ToString(ByVal ForMediaItem As Boolean) As String
If SiteKey = API.YouTube.YouTubeSiteKey Then
Return MyBase.ToString(ForMediaItem)
Else
Return Title.IfNullOrEmpty(URL)
End If
End Function
Public Overrides Sub Download(ByVal UseCookies As Boolean, ByVal Token As CancellationToken)
ExchangeData(Me, ExternalSource)
If Not ExternalSource Is Nothing Then
With ExternalSource : .Progress = Progress : .Instance = Instance : End With
End If
Instance.DownloadSingleObject(If(ExternalSource, Me), Token)
ExchangeData(ExternalSource, Me)
Dim __url$ = DirectCast(Me, IDownloadableMedia).URL_BASE.IfNullOrEmpty(URL)
If File.Exists And Not __url.IsEmptyString And MyDownloaderSettings.CreateUrlFiles Then
Dim urlFile As SFile = CreateUrlFile(__url, File)
If urlFile.Exists Then AddFile(urlFile)
End If
If Not ExternalSource Is Nothing Then
With ExternalSource : _HasError = .HasError : _Exists = .Exists : End With
End If
End Sub
Friend Sub ExchangeData(ByVal s As IDownloadableMedia, ByVal d As IDownloadableMedia)
If Not s Is Nothing And Not d Is Nothing Then
d.ContentType = s.ContentType
d.URL = s.URL
d.URL_BASE = s.URL_BASE
d.MD5 = s.MD5
d.File = s.File
d.DownloadState = s.DownloadState
d.PostID = s.PostID
d.PostDate = s.PostDate
d.SpecialFolder = s.SpecialFolder
d.Attempts = s.Attempts
d.ThumbnailUrl = s.ThumbnailUrl
d.ThumbnailFile = s.ThumbnailFile
d.Title = s.Title
d.Size = s.Size
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)
MyBase.Load(f)
If _Exists Then _Exists = Not MediaState = UserMediaStates.Downloaded OrElse File.Exists
End Sub
Public Overrides Sub Save()
If FileSettings.IsEmptyString Then
Dim f As SFile = MyFilesCache.NewFile
f.Extension = "xml"
FileSettings = f
End If
If NeedToSave() Then
Using x As New XmlFile With {.AllowSameNames = True}
x.AddRange(ToEContainer.Elements)
x.Name = "MediaContainer"
x.Save(FileSettings)
End Using
End If
End Sub
Public Overrides Function GetHashCode() As Integer
Return URL.GetHashCode
End Function
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If Not disposedValue And disposing Then Instance.DisposeIfReady() : ExternalSource.DisposeIfReady(False)
MyBase.Dispose(disposing)
End Sub
End Class
End Namespace