@@ -175,7 +175,9 @@ Namespace API.YouTube.Objects
175175 Protected _ThumbnailUrl As String = String .Empty
176176 <XMLEC> Public Overridable Property ThumbnailUrl As String Implements IDownloadableMedia.ThumbnailUrl
177177 Get
178- If _ThumbnailUrl.IsEmptyString And Thumbnails.Count > 0 Then
178+ If Not CoverURL.IsEmptyString Then
179+ Return CoverURL
180+ ElseIf _ThumbnailUrl.IsEmptyString And Thumbnails.Count > 0 Then
179181 Return Thumbnails.FirstOrDefault.URL
180182 Else
181183 Return _ThumbnailUrl
@@ -904,7 +906,8 @@ Namespace API.YouTube.Objects
904906 Const m3u8DataRow$ = "#EXTINF:{0},{1}" & vbCrLf & "{2}"
905907 With Element
906908 Dim f As SFile = __file.IfNullOrEmpty(.File)
907- Dim __f$ = SymbolsConverter.ASCII.EncodeSymbolsOnly( If (Mode = M3U8CreationMode.Absolute, f.ToString, f.File))
909+ Dim fStr$ = f.ToString.StringReplaceSymbols({ "\" }, "/" , EDP.ReturnValue)
910+ Dim __f$ = SymbolsConverter.ASCII.Extended.EncodeSymbolsOnly( If (Mode = M3U8CreationMode.Absolute, fStr, f.File), M3U8ExcludedSymbols)
908911 If Mode = M3U8CreationMode.Absolute Then __f = $"file:///{__f}"
909912 Dim fName$ = .Title.IfNullOrEmpty(f.Name)
910913 If MyYouTubeSettings.MusicPlaylistCreate_M3U8_AppendNumber And .PlaylistIndex > 0 Then fName = $"{ .PlaylistIndex}. {fName}"
@@ -1022,12 +1025,19 @@ Namespace API.YouTube.Objects
10221025 End If
10231026
10241027 Dim cDown As Boolean = False
1028+ Dim fCover As SFile = Nothing
1029+ Dim cUrl$ = String .Empty
10251030 For Each elem In Elements
10261031 With DirectCast (elem, YouTubeMediaContainerBase)
1027- If Not .CoverDownloaded Then .CoverDownloaded = cDown
1032+ 'If Not .CoverDownloaded Then .CoverDownloaded = cDown
1033+ .CoverDownloaded = cDown
1034+ .CoverFile = fCover
1035+ .CoverURL = cUrl
10281036 AddHandler .FileDownloadStarted, fDown
10291037 .Download(UseCookies, Token)
10301038 cDown = .CoverDownloaded
1039+ fCover = .CoverFile
1040+ cUrl = .CoverURL
10311041 RemoveHandler .FileDownloadStarted, fDown
10321042 End With
10331043 If Token.IsCancellationRequested Or disposedValue Then Exit For
@@ -1054,6 +1064,8 @@ Namespace API.YouTube.Objects
10541064 End Try
10551065 End Sub
10561066 Protected CoverDownloaded As Boolean = False
1067+ Protected CoverFile As SFile = Nothing
1068+ Protected CoverURL As String = String .Empty
10571069 Private Sub DownloadPlaylistCover( ByVal PlsId As String , ByVal f As SFile, ByVal UseCookies As Boolean )
10581070 Try
10591071 Dim url$ = $"https://{IIf(IsMusic, " music ", " www ")}.youtube.com/playlist?list={PlsId}"
@@ -1089,7 +1101,8 @@ Namespace API.YouTube.Objects
10891101 url = LinkFormatterSecure(u)
10901102 f.Name = "cover"
10911103 f.Extension = "jpg"
1092- If resp.DownloadFile(url, f, EDP.ReturnValue) And f.Exists Then CoverDownloaded = True : AddFile(f)
1104+ If resp.DownloadFile(url, f, EDP.ReturnValue) And f.Exists Then _
1105+ CoverFile = f : CoverURL = url : CoverDownloaded = True : AddFile(f)
10931106 End If
10941107 End If
10951108 End Using
@@ -1270,10 +1283,10 @@ Namespace API.YouTube.Objects
12701283 End Sub
12711284 Dim embedThumbTo As Action( Of SFile) =
12721285 Sub ( ByVal dFile As SFile)
1273- If dFile.Exists And ThumbnailFile.Exists Then
1286+ If dFile.Exists And CoverFile.IfNullOrEmpty( ThumbnailFile) .Exists Then
12741287 Dim dFileNew As SFile = dFile
12751288 dFileNew.Name &= "_NEW"
1276- .Execute( $"ffmpeg -i ""{dFile}"" -i ""{ThumbnailFile}"" -map 0:0 -map 1:0 -c copy -id3v2_version 3 -metadata:s:v title=""Cover"" -metadata:s:v comment=""Cover"" ""{dFileNew}""" )
1289+ .Execute( $"ffmpeg -i ""{dFile}"" -i ""{CoverFile.IfNullOrEmpty( ThumbnailFile) }"" -map 0:0 -map 1:0 -c copy -id3v2_version 3 -metadata:s:v title=""Cover"" -metadata:s:v comment=""Cover"" ""{dFileNew}""" )
12771290 If dFileNew.Exists AndAlso dFile.Delete(,, EDP.ReturnValue) Then SFile.Rename(dFileNew, dFile)
12781291 End If
12791292 End Sub
@@ -1353,6 +1366,10 @@ Namespace API.YouTube.Objects
13531366 End If
13541367 End If
13551368
1369+ 'mp3
1370+ If IsMusic And ObjectType = YouTubeMediaType.Single And File.Extension = mp3 And
1371+ Not mp3ThumbEmbedded And CoverFile.Exists And MyYouTubeSettings.DefaultAudioEmbedThumbnail_Cover Then embedThumbTo.Invoke(File)
1372+
13561373 'Update video
13571374 ThrowAny(Token)
13581375 If SelectedVideoIndex >= 0 AndAlso tempFilesList.Count > 0 AndAlso tempFilesList.Exists( Function (tf) tf.ToReplace) Then
@@ -1725,6 +1742,7 @@ Namespace API.YouTube.Objects
17251742 Dim obj As MediaObject
17261743 Dim nValue#
17271744 Dim sValue$
1745+ Dim allowWebm As Boolean = MyYouTubeSettings.DefaultVideoAllowWebm
17281746 Dim validCodecValue As Func( Of String , Boolean ) = Function (codec) Not codec.IsEmptyString AndAlso Not codec = "none"
17291747
17301748 For Each ee In e({ "formats" })
@@ -1775,12 +1793,13 @@ Namespace API.YouTube.Objects
17751793 Dim d As MediaObject = Nothing
17761794 Dim expWebm As Predicate( Of MediaObject) = Function (mo) mo.Extension = webm
17771795 Dim expAVC As Predicate( Of MediaObject) = Function (mo) mo.Codec.IfNullOrEmpty( "/" ).ToLower.StartsWith(avc)
1778- Dim comp As Func( Of MediaObject, Predicate( Of MediaObject), Boolean , Boolean ) =
1779- Function (mo, exp, isTrue) mo.Type = t And exp.Invoke(mo) = isTrue And mo.Width = d.Width
1780- Dim CountWebm As Func( Of MediaObject, Boolean ) = Function (mo) comp.Invoke(mo, expWebm, False )
1781- Dim RemoveWebm As Predicate( Of MediaObject) = Function (mo) comp.Invoke(mo, expWebm, True )
1782- Dim CountAVC As Func( Of MediaObject, Boolean ) = Function (mo) comp.Invoke(mo, expAVC, True )
1783- Dim RemoveAVC As Predicate( Of MediaObject) = Function (mo) comp.Invoke(mo, expAVC, False )
1796+ Dim comp As Func( Of MediaObject, Predicate( Of MediaObject), Boolean , Boolean , Boolean ) =
1797+ Function (mo, exp, isTrue, checkHttp) mo.Type = t And exp.Invoke(mo) = isTrue And mo.Width = d.Width And
1798+ ( Not checkHttp OrElse mo.ProtocolType = Protocols.https)
1799+ Dim CountWebm As Func( Of MediaObject, Boolean ) = Function (mo) comp.Invoke(mo, expWebm, False , allowWebm)
1800+ Dim RemoveWebm As Predicate( Of MediaObject) = Function (mo) comp.Invoke(mo, expWebm, True , allowWebm)
1801+ Dim CountAVC As Func( Of MediaObject, Boolean ) = Function (mo) comp.Invoke(mo, expAVC, True , False )
1802+ Dim RemoveAVC As Predicate( Of MediaObject) = Function (mo) comp.Invoke(mo, expAVC, False , False )
17841803 For Each d In data
17851804 If MediaObjects.Count = 0 Then Exit For
17861805 If MediaObjects.LongCount(CountWebm) > 0 Then MediaObjects.RemoveAll(RemoveWebm)
0 commit comments