Files
SCrawler/SCrawler/PluginsEnvironment/Hosts/DownloadableMediaHost.vb
Andy d99243ce46 2023.12.5.0
YT
VideoListForm: add a check of adding a URL if it has already been downloaded ('ValidateContainerURL')
YouTubeMediaContainerBase: add 'GetUrls' and 'GetFiles' functions; make 'Files' protected friend; update 'CreateUrlFile' function

SCrawler
Add downloaded saved posts to the feed
API.ProfileSaved: add token verification for multi-acc
API.SiteSettingsBase: update 'UpdateResponserFile' and 'CLONE_PROPERTIES.filterUC' functions
API.UserDataBase: add a null host check before request a new key; update 'OpenFolder' function (for saved posts)
API.YouTube: add the ability to download YouTube user community feeds
DownloadProgress: add 'KeyClickEventArgs' to download saved posts excluding from feed; add 'FeedFilesChanged' event; update 'Start' function
DownloadSavedPostsForm: add 'FeedFilesChanged' event and handler; update 'Start' function
Feed.FeedMedia: make the class compatible to work with saved posts
StandaloneDownloader.VideoDownloaderForm: add a check of adding a URL if it has already been downloaded ('ValidateContainerURL')
TDownloader: add the 'IsSavedPosts' field to the 'UserMediaD' structure; update 'UserMediaD.New(EContainer)' function (for saved posts); update 'UserMediaD.ToEContainer' function; add 'SessionSavedPosts' property
MainFrame: add 'Alt+A' hotkey to show scheduler; add 'Alt+P' hotkey to show progress form
Hosts.DownloadableMediaHost: add URL file to files list
2023-12-05 12:05:20 +03:00

178 lines
7.8 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
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
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 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
ElseIf SiteKey = API.Imgur.Envir.SiteKey Then
Instance = New API.Imgur.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
_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 Files.Add(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
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