@@ -175,7 +175,9 @@ Namespace API.YouTube.Objects
175
175
Protected _ThumbnailUrl As String = String .Empty
176
176
<XMLEC> Public Overridable Property ThumbnailUrl As String Implements IDownloadableMedia.ThumbnailUrl
177
177
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
179
181
Return Thumbnails.FirstOrDefault.URL
180
182
Else
181
183
Return _ThumbnailUrl
@@ -904,7 +906,8 @@ Namespace API.YouTube.Objects
904
906
Const m3u8DataRow$ = "#EXTINF:{0},{1}" & vbCrLf & "{2}"
905
907
With Element
906
908
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)
908
911
If Mode = M3U8CreationMode.Absolute Then __f = $"file:///{__f}"
909
912
Dim fName$ = .Title.IfNullOrEmpty(f.Name)
910
913
If MyYouTubeSettings.MusicPlaylistCreate_M3U8_AppendNumber And .PlaylistIndex > 0 Then fName = $"{ .PlaylistIndex}. {fName}"
@@ -1022,12 +1025,19 @@ Namespace API.YouTube.Objects
1022
1025
End If
1023
1026
1024
1027
Dim cDown As Boolean = False
1028
+ Dim fCover As SFile = Nothing
1029
+ Dim cUrl$ = String .Empty
1025
1030
For Each elem In Elements
1026
1031
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
1028
1036
AddHandler .FileDownloadStarted, fDown
1029
1037
.Download(UseCookies, Token)
1030
1038
cDown = .CoverDownloaded
1039
+ fCover = .CoverFile
1040
+ cUrl = .CoverURL
1031
1041
RemoveHandler .FileDownloadStarted, fDown
1032
1042
End With
1033
1043
If Token.IsCancellationRequested Or disposedValue Then Exit For
@@ -1054,6 +1064,8 @@ Namespace API.YouTube.Objects
1054
1064
End Try
1055
1065
End Sub
1056
1066
Protected CoverDownloaded As Boolean = False
1067
+ Protected CoverFile As SFile = Nothing
1068
+ Protected CoverURL As String = String .Empty
1057
1069
Private Sub DownloadPlaylistCover( ByVal PlsId As String , ByVal f As SFile, ByVal UseCookies As Boolean )
1058
1070
Try
1059
1071
Dim url$ = $"https://{IIf(IsMusic, " music ", " www ")}.youtube.com/playlist?list={PlsId}"
@@ -1089,7 +1101,8 @@ Namespace API.YouTube.Objects
1089
1101
url = LinkFormatterSecure(u)
1090
1102
f.Name = "cover"
1091
1103
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)
1093
1106
End If
1094
1107
End If
1095
1108
End Using
@@ -1270,10 +1283,10 @@ Namespace API.YouTube.Objects
1270
1283
End Sub
1271
1284
Dim embedThumbTo As Action( Of SFile) =
1272
1285
Sub ( ByVal dFile As SFile)
1273
- If dFile.Exists And ThumbnailFile.Exists Then
1286
+ If dFile.Exists And CoverFile.IfNullOrEmpty( ThumbnailFile) .Exists Then
1274
1287
Dim dFileNew As SFile = dFile
1275
1288
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}""" )
1277
1290
If dFileNew.Exists AndAlso dFile.Delete(,, EDP.ReturnValue) Then SFile.Rename(dFileNew, dFile)
1278
1291
End If
1279
1292
End Sub
@@ -1353,6 +1366,10 @@ Namespace API.YouTube.Objects
1353
1366
End If
1354
1367
End If
1355
1368
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
+
1356
1373
'Update video
1357
1374
ThrowAny(Token)
1358
1375
If SelectedVideoIndex >= 0 AndAlso tempFilesList.Count > 0 AndAlso tempFilesList.Exists( Function (tf) tf.ToReplace) Then
@@ -1725,6 +1742,7 @@ Namespace API.YouTube.Objects
1725
1742
Dim obj As MediaObject
1726
1743
Dim nValue#
1727
1744
Dim sValue$
1745
+ Dim allowWebm As Boolean = MyYouTubeSettings.DefaultVideoAllowWebm
1728
1746
Dim validCodecValue As Func( Of String , Boolean ) = Function (codec) Not codec.IsEmptyString AndAlso Not codec = "none"
1729
1747
1730
1748
For Each ee In e({ "formats" })
@@ -1775,12 +1793,13 @@ Namespace API.YouTube.Objects
1775
1793
Dim d As MediaObject = Nothing
1776
1794
Dim expWebm As Predicate( Of MediaObject) = Function (mo) mo.Extension = webm
1777
1795
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 )
1784
1803
For Each d In data
1785
1804
If MediaObjects.Count = 0 Then Exit For
1786
1805
If MediaObjects.LongCount(CountWebm) > 0 Then MediaObjects.RemoveAll(RemoveWebm)
0 commit comments