YoutubeExplode v6.0 Release Notes
-
- ๐ Fixed an issue where an attempt to get playlist metadata or playlist videos resulted in an exception, due to YouTube's recent changes.
- ๐ Fixed an issue where an attempt to get videos returned by a search query resulted in an exception, due to YouTube's recent changes.
- ๐ Fixed an issue where an attempt to get video metadata resulted in an exception, due to YouTube's recent changes.
- ๐ Fixed an issue where some age-restricted videos were reported as unplayable, due to YouTube's recent changes.
- ๐ Fixed an issue where
av01
-encoded video-only streams were occasionally missing from the resolved stream manifest. - ๐ Fixed many other issues brought on by recent YouTube changes.
- ๐ Changes to videos:
- Changed
Video.Duration
to a nullable property. It may benull
on videos that haven't finished yet (i.e. ongoing livestreams). - Changed
Video.Author
type fromstring
toAuthor
object, which encapsulates both channel ID and channel title. RemovedVideo.ChannelId
. - Changed
Video.Thumbnails
type fromThumbnailSet
toIReadOnlyList<Thumbnail>
. - Removed public constructor from
VideoId
. To create an instance ofVideoId
, useVideoId.Parse(...)
,VideoId.TryParse(...)
, or the implicit conversion fromstring
toVideoId
. - Changes to streams:
- Removed
IStreamInfo.Tag
property. - Reworked
VideoQuality
into a struct (from an enum) which encapsulates video quality label, maximum height, and framerate. RemovedIVideoStreamInfo.VideoQualityLabel
andIVideoStreamInfo.Framerate
in favor of this new consolidated type. - Renamed extension method
WithHighestBitrate(...)
toTryGetWithHighestBitrate(...)
. Also addedGetWithHighestBitrate(...)
which does not returnnull
, but instead throws if the source sequence is empty. - Renamed extension method
WithHighestVideoQuality(...)
toTryGetWithHighestVideoQuality(...)
. Also addedGetWithHighestVideoQuality(...)
which does not returnnull
, but instead throws if the source sequence is empty. - Changed the behavior of
TryGetWithHighestVideoQuality(...)
andGetWithHighestVideoQuality(...)
extension methods so that they now also take into account the framerate of the stream. - Removed
GetAllVideoQualityLabels(...)
extension method. - Changes to closed captions:
- Added
ClosedCaptionManifest.GetByLanguage(...)
. It works likeClosedCaptionManifest.TryGetByLanguage(...)
but throws an exception in case of failure instead of returningnull
. - Added
ClosedCaptionTrack.GetByTime(...)
. It works likeClosedCaptionTrack.TryGetByTime(...)
but throws an exception in case of failure instead of returningnull
. - Added
ClosedCaption.GetPartByTime(...)
. It works likeClosedCaption.TryGetPartByTime(...)
but throws an exception in case of failure instead of returningnull
.
- Changed
- ๐ Changes to playlists:
- Changed
Playlist.Author
type toAuthor
. Note that this property is nullable because auto-generated playlists (mixed, topics, etc.) don't have an author. - Changed
Playlist.Thumbnails
type fromThumbnailSet
toIReadOnlyList<Thumbnail>
. - Videos contained within playlists are now of type
PlaylistVideo
instead ofVideo
. PlaylistVideo
implementsIVideo
interface, which outlines properties shared withVideo
.PlaylistVideo
no longer contains some of the properties available onVideo
, specifically:UploadDate
,Description
,Keywords
, andEngagement
.- Changed
PlaylistVideo.Author
type toAuthor
. - Added
PlaylistClient.GetVideoBatchesAsync(...)
which returns videos in batches, each encompassing one response from YouTube. - Removed the previously available parameters for specifying starting page and page count on
PlaylistClient.GetVideosAsync(...)
. It is no longer possible to specify the starting page altogether because the new endpoint used by YoutubeExplode does not have the concept of pages. If you need manual control over how many requests you make, usePlaylistClient.GetVideoBatchesAsync(...)
instead. - Removed public constructor from
PlaylistId
. To create an instance ofPlaylistId
, usePlaylistId.Parse(...)
,PlaylistId.TryParse(...)
, or the implicit conversion fromstring
toPlaylistId
.
- Changed
- ๐ Changes to search:
- Search functionality is now using a different endpoint, which also returns channels and playlists in addition to just videos.
- Added
VideoSearchResult
,PlaylistSearchResult
, andChannelSearchResult
to represent the different possible result types. They implementIVideo
,IPlaylist
, andIChannel
respectively. - Added
SearchClient.GetResultsAsync(...)
which returns instances ofISearchResult
. You will need to match the instance with one of its possible implementations (VideoSearchResult
,PlaylistSearchResult
, orChannelSearchResult
) to extract detailed information. - Added
SearchClient.GetResultBatchesAsync(...)
that provides more granular control over how many requests are sent to YouTube, similar toPlaylistClient.GetVideoBatchesAsync(...)
. - Added additional methods to filter results by type:
SearchClient.GetVideosAsync(...)
,SearchClient.GetChannelsAsync(...)
, andSearchClient.GetPlaylistsAsync(...)
. Under the hood, these methods callSearchClient.GetResultsAsync(...)
.
- ๐ Changes to channels:
- Removed
Channel.LogoUrl
in favor ofChannel.Thumbnails
of typeIReadOnlyList<Thumbnail>
. - Removed public constructor from
ChannelId
. To create an instance ofChannelId
, useChannelId.Parse(...)
,ChannelId.TryParse(...)
, or the implicit conversion fromstring
toChannelId
. - Removed public constructor from
UserName
. To create an instance ofUserName
, useUserName.Parse(...)
,UserName.TryParse(...)
, or the implicit conversion fromstring
toUserName
.
- Removed
- ๐ Renamed
VideoResolution
toResolution
and moved it fromYoutubeExplode.Video.Streams
namespace toYoutubeExplode.Common
. This type is now also used inThumbnail
to specify the size of the thumbnail image. - โ Added
TryGetWithHighestResolution(...)
andGetWithHighestResolution(...)
extension methods onIEnumerable<Thumbnail>
. These methods return the thumbnail with the highest resolution by area (width multiplied by height). - ๐ Moved extension methods that enable
await
expressions on certainIAsyncEnumerable<T>
instances fromYoutubeExplode
namespace toYoutubeExplode.Common
. Remember to add corresponding using directive for this namespace when working with playlists or search. - ๐ Renamed
BufferAsync(...)
extension method toCollectAsync(...)
. - โ Added
CancellationToken
parameter to all asynchronous client methods where it was previously missing. - Consolidated exceptions into fewer types.
โช Thanks to @d4n3436, @Benjamin K., and @Baimbekka who helped find workarounds for recent YouTube breakages by submitting pull requests. Your contribution is very appreciated!