mirror of
https://github.com/AAndyProgram/SCrawler.git
synced 2026-11-10 05:35:25 +00:00
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
This commit is contained in:
@@ -137,6 +137,19 @@ Namespace API.YouTube.Controls
|
||||
End If
|
||||
CMB_FORMAT.Enabled = OPT_VIDEO.Checked
|
||||
|
||||
With .MediaObjects
|
||||
Dim disableOpts As Boolean = False
|
||||
If .Count = 0 Or .Count = 1 Then
|
||||
disableOpts = True
|
||||
ElseIf .Exists(Function(mm) mm.Type = UMTypes.Video Or mm.Type = YouTubeMediaContainerBase.TypeAudioVideo) And
|
||||
.Exists(Function(mm) mm.Type = UMTypes.Audio) Then
|
||||
disableOpts = False
|
||||
Else
|
||||
disableOpts = True
|
||||
End If
|
||||
If disableOpts Then OPT_AUDIO.Enabled = False : OPT_VIDEO.Enabled = False
|
||||
End With
|
||||
|
||||
arr = AvailableVideoFormats
|
||||
CMB_FORMAT.Items.AddRange(arr)
|
||||
If InheritsFromContainer Then
|
||||
@@ -232,7 +245,7 @@ Namespace API.YouTube.Controls
|
||||
data = .Elements.Select(Function(ee) New MediaItem(ee, True) With {.Dock = DockStyle.Fill, .Checked = ee.Checked, .UseCookies = UseCookies})
|
||||
Else
|
||||
data = (From m As MediaObject In .Self.MediaObjects
|
||||
Where m.Type = __contentType
|
||||
Where m.Type = __contentType Or (__contentType = UMTypes.Video And m.Type = YouTubeMediaContainerBase.TypeAudioVideo)
|
||||
Select New VideoOption(m, audio) With {.Dock = DockStyle.Fill, .Checked = m.Index = MyContainer.SelectedVideoIndex})
|
||||
End If
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ Namespace API.YouTube
|
||||
Friend ReadOnly TimeToStringProviderH As IFormatProvider = New TimeToStringConverter(True)
|
||||
Friend ReadOnly TitleHtmlConverter As Func(Of String, String) = Function(Input) Input.StringRemoveWinForbiddenSymbols().StringTrim()
|
||||
Friend ReadOnly ProgressProvider As IMyProgressNumberProvider = MyProgressNumberProvider.Percentage
|
||||
Friend ReadOnly DownloadProgressPattern As RParams = RParams.DMS("\[download\]\s*([\d\.,]+)", 1, EDP.ReturnValue)
|
||||
Public ReadOnly TrueUrlRegEx As RParams = RParams.DM(Base.YouTubeFunctions.TrueUrlPattern, 0, EDP.ReturnValue)
|
||||
Friend ReadOnly MusicUrlApply As RParams = RParams.DMS("https://([w\.]*)youtube.com.+", 1, RegexReturn.Replace, EDP.ReturnValue,
|
||||
CType(Function(input$) "music.", Func(Of String, String)), String.Empty)
|
||||
@@ -78,6 +79,15 @@ Namespace API.YouTube
|
||||
Return f
|
||||
End If
|
||||
End Function
|
||||
Public Function CreateYtdlpProgressHandler(ByVal Progress As MyProgress, ByVal Token As Threading.CancellationToken, ByVal Batch As BatchExecutor) As DataReceivedEventHandler
|
||||
Return Sub(ByVal Sender As Object, ByVal e As DataReceivedEventArgs)
|
||||
If Not e.Data.IsEmptyString Then
|
||||
Dim v# = AConvert(Of Double)(RegexReplace(e.Data, DownloadProgressPattern), NumberProvider, -1)
|
||||
If v >= 0 Then Progress.Value = v : Progress.Perform(0)
|
||||
If Token.IsCancellationRequested Then Batch.Kill()
|
||||
End If
|
||||
End Sub
|
||||
End Function
|
||||
Private Class TimeToStringConverter : Implements ICustomProvider
|
||||
Private ReadOnly _Provider As New ADateTime("mm\:ss") With {.TimeParseMode = ADateTime.TimeModes.TimeSpan}
|
||||
Private ReadOnly _ProviderWithHours As New ADateTime("h\:mm\:ss") With {.TimeParseMode = ADateTime.TimeModes.TimeSpan}
|
||||
|
||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
||||
' by using the '*' as shown below:
|
||||
' <Assembly: AssemblyVersion("1.0.*")>
|
||||
|
||||
<Assembly: AssemblyVersion("2025.11.25.0")>
|
||||
<Assembly: AssemblyFileVersion("2025.11.25.0")>
|
||||
<Assembly: AssemblyVersion("2026.9.21.0")>
|
||||
<Assembly: AssemblyFileVersion("2026.9.21.0")>
|
||||
<Assembly: NeutralResourcesLanguage("en")>
|
||||
|
||||
@@ -951,7 +951,6 @@ Namespace API.YouTube.Objects
|
||||
Return String.Format(m3u8DataRow, CInt(.Duration.TotalSeconds), fName, __f)
|
||||
End With
|
||||
End Function
|
||||
Private ReadOnly DownloadProgressPattern As RParams = RParams.DMS("\[download\]\s*([\d\.,]+)", 1, EDP.ReturnValue)
|
||||
Public Property Progress As MyProgress Implements IYouTubeMediaContainer.Progress
|
||||
Private Property IDownloadableMedia_Progress As Object Implements IDownloadableMedia.Progress
|
||||
Get
|
||||
@@ -1191,13 +1190,7 @@ Namespace API.YouTube.Objects
|
||||
If MediaState = UMStates.Downloaded Or Not Checked Then Exit Sub
|
||||
RaiseEvent FileDownloadStarted(Me, Nothing)
|
||||
Using batch As New BatchExecutor(True) With {.Encoding = 65001}
|
||||
Dim h As DataReceivedEventHandler = Sub(ByVal Sender As Object, ByVal e As DataReceivedEventArgs)
|
||||
If Not e.Data.IsEmptyString Then
|
||||
Dim v# = AConvert(Of Double)(RegexReplace(e.Data, DownloadProgressPattern), NumberProvider, -1)
|
||||
If v >= 0 Then Progress.Value = v : Progress.Perform(0)
|
||||
If Token.IsCancellationRequested Then batch.Kill()
|
||||
End If
|
||||
End Sub
|
||||
Dim h As DataReceivedEventHandler = CreateYtdlpProgressHandler(Progress, Token, batch)
|
||||
With batch
|
||||
Dim prExists As Boolean = Not Progress Is Nothing
|
||||
If prExists Then
|
||||
@@ -1698,6 +1691,7 @@ Namespace API.YouTube.Objects
|
||||
#End Region
|
||||
#Region "Parse"
|
||||
Friend Const DRC As String = "drc"
|
||||
Friend Const TypeAudioVideo As UMTypes = UMTypes.Audio + UMTypes.Video
|
||||
Public Overridable Function Parse(ByVal Container As EContainer, ByVal Path As SFile, ByVal IsMusic As Boolean,
|
||||
Optional ByVal Token As CancellationToken = Nothing, Optional ByVal Progress As IMyProgress = Nothing) As Boolean Implements IYouTubeMediaContainer.Parse
|
||||
Try
|
||||
@@ -1850,7 +1844,6 @@ Namespace API.YouTube.Objects
|
||||
Return _Exists
|
||||
End Function
|
||||
Protected Sub ParseFormats(ByVal e As EContainer)
|
||||
Const av As UMTypes = UMTypes.Audio + UMTypes.Video
|
||||
If If(e({"formats"})?.Count, 0) > 0 Then
|
||||
Dim obj As MediaObject
|
||||
Dim nValue#
|
||||
@@ -1887,7 +1880,7 @@ Namespace API.YouTube.Objects
|
||||
If validCodecValue(ee.Value("vcodec")) Then
|
||||
obj.Type = UMTypes.Video
|
||||
obj.Codec = sValue.Split(".").First
|
||||
If validCodecValue(ee.Value("acodec")) Then obj.Type = av
|
||||
If validCodecValue(ee.Value("acodec")) Then obj.Type = TypeAudioVideo
|
||||
ElseIf validCodecValue(ee.Value("acodec")) Then
|
||||
obj.Type = UMTypes.Audio
|
||||
obj.Codec = sValue.Split(".").First
|
||||
|
||||
Reference in New Issue
Block a user