- Fixed an issue where signature decipherer was throwing an exception due to recent YouTube changes.
- Fixed an issue where
GetVideoAsync
was throwing an exception due to recent YouTube changes.
- Fixed an issue where
GetVideoMediaStreamInfosAsync
was sometimes returning adaptive streams that were not working. There are very rare cases where it still might happen.
- Fixed an issue where external links were truncated in
Video.Description
if they are too long. - Added support for seeking in
MediaStream
.
- Improved
GetVideoAsync
,GetVideoAuthorChannelAsync
andGetVideoClosedCaptionTrackInfosAsync
so that they don't fail on unavailable videos. - Added extra result validation to
GetChannelIdAsync
to verify that the extracted value is indeed a valid channel ID. - Added static methods to parse and validate YouTube usernames.
- Fixed an issue where
JsonReaderException
was thrown on all videos due to recent YouTube changes. - Added support for itag 394.
- Added
GetChannelIdAsync
method that retrieves channel ID from username. - Added support for OL playlists.
- Added support for AV1 video codec.
- Fixed an issue where
ParseException
was thrown on signature-protected videos due to recent YouTube changes.
- Fixed an issue where retrieving some streams may throw a 403 HTTP error due to recent YouTube changes.
- Reworked
GetMediaStreamAsync
so that it implements the workaround for rate-limited streams, which was originally only available inDownloadMediaStreamAsync
. This is achieved by returning a stream that internally sends multiple segmented requests in a sequence. - Fixed
MediaStream.ReadAsync
not using theReadAsync
of the underlying stream. - Fixed
GetVideoQualityLabel
so that it displays the framerate as rounded up to the nearest 10, instead of always displaying it as '60'.
- Fixed an issue where some non-embeddable videos could not be processed.
- Fixed an issue where non-embeddable age-restricted videos could not be processed.
- Fixed exception messages not being shown in Visual Studio's exception popup.
- Fixed xml docs on
Playlist.Type
property.
- Fixed an issue where
VideoUnavailableException
would always be thrown for non-embeddable videos due to recent YouTube changes.
- Relaxed validation rules for all playlist IDs because there are even more variations than expected.
- Fixed an issue where
GetVideoAuthorChannelAsync
would always throw an exception due to recent YouTube changes.
- Added an extension method to parse
MediaStreamInfo.Url
expiry date --MediaStreamInfo.GetUrlExpiryDate
. - Replaced instances of
DateTime
withDateTimeOffset
. - Relaxed validation rules for RD playlist IDs because there are simply too many possible variations.
- Fixed some playlist IDs being considered invalid even though they aren't.
- Fixed an
OutOfMemoryException
issue that would occur when executingGetVideoMediaStreamInfosAsync
on a large video.
- Added overloads for
DownloadMediaStreamAsync
andDownloadClosedCaptionTrackAsync
that acceptStream
as output. - Removed
IHttpService
,HttpService
in favor of using unwrappedHttpClient
. - Added
IYoutubeClient
to aid in testing.
- Fixed an issue where
GetClosedCaptionTrackAsync
would throw on some malformed automatic captions. - Fixed an issue where some video qualities were not correctly identified due to itag inconsistency.
- Added support for 2880p video quality.
- Implemented segmented downloading for rate-limited media streams. This fixes slow download speed of
DownloadMediaStreamAsync
caused by YouTube changes. - Added
SearchVideosAsync
method toYoutubeClient
. Can be used to search for videos using given query. The method returnsVideo
objects but not all properties have valid values, due to how this internal API functions. - Added
HlsLiveStreamUrl
toMediaStreamInfoSet
which can be used to extract URL of M3U8 playlists for livestream videos. - Added
UploadDate
toVideo
. - Fixed incorrect return value in
GetVideoQualityLabel
/VideoQualityLabel
in cases where FPS was below 60 but above 30. - Renamed
GetRegularUrl
extension methods toGetUrl
. - Added some useful extension methods for models.
- Added some ReSharper annotations.
- Reworked
YoutubeClient
API by splitting workflows into separate methods. What was done solely byGetVideoAsync
is now done byGetVideoAsync
,GetVideoMediaStreamInfosAsync
,GetVideoClosedCaptionTrackInfosAsync
,GetVideoAuthorChannelAsync
. - Media stream and closed caption track information is no longer part of the
Video
model. Extended channel information was also removed. PlaylistVideo
has been removed as it now shares the same property set withVideo
. Existing usages ofPlaylistVideo
have been replaced withVideo
.- Order of some parameters in
Playlist
constructor has been changed. Be careful if you initialize it yourself. - Removed some properties from
Channel
that are no longer accessible due to YouTube changes. - Exception messages now provide more information, without needing to check inside properties.
ValidatePlaylistId
and(Try)ParsePlaylistId
are now more strict and check the first two characters in the ID as well.- Added a lot of useful extensions methods. Refactored some existing methods to extensions.
- Fixed incompatibility with age-restricted videos due to YouTube changes.
- Fixed other issues that prevented the library from being usable due to YouTube changes.
- Added dependency on
Newtonsoft.Json
andAngleSharp
.
This version has a lot of breaking changes and the migration isn't very straightforward. The readme has been updated with new usage examples and demo projects have been changed to work with new API.