Fixed an issue where trying to get stream manifest failed on some videos with 404 HTTP error due to recent YouTube changes.
Fixed an issue where trying to get stream manifest occasionally resulted in a FormatException.
Fixed an issue where some required cookies were not passed along with requests, which caused them to fail.
v6.0 (17-Apr-2021)
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 be null on videos that haven't finished yet (i.e. ongoing livestreams).
Changed Video.Author type from string to Author object, which encapsulates both channel ID and channel title. Removed Video.ChannelId.
Changed Video.Thumbnails type from ThumbnailSet to IReadOnlyList<Thumbnail>.
Removed public constructor from VideoId. To create an instance of VideoId, use VideoId.Parse(...), VideoId.TryParse(...), or the implicit conversion from string to VideoId.
Changes to streams:
Removed IStreamInfo.Tag property.
Reworked VideoQuality into a struct (from an enum) which encapsulates video quality label, maximum height, and framerate. Removed IVideoStreamInfo.VideoQualityLabel and IVideoStreamInfo.Framerate in favor of this new consolidated type.
Renamed extension method WithHighestBitrate(...) to TryGetWithHighestBitrate(...). Also added GetWithHighestBitrate(...) which does not return null, but instead throws if the source sequence is empty.
Renamed extension method WithHighestVideoQuality(...) to TryGetWithHighestVideoQuality(...). Also added GetWithHighestVideoQuality(...) which does not return null, but instead throws if the source sequence is empty.
Changed the behavior of TryGetWithHighestVideoQuality(...) and GetWithHighestVideoQuality(...) extension methods so that they now also take into account the framerate of the stream.
Added ClosedCaptionManifest.GetByLanguage(...). It works like ClosedCaptionManifest.TryGetByLanguage(...) but throws an exception in case of failure instead of returning null.
Added ClosedCaptionTrack.GetByTime(...). It works like ClosedCaptionTrack.TryGetByTime(...) but throws an exception in case of failure instead of returning null.
Added ClosedCaption.GetPartByTime(...). It works like ClosedCaption.TryGetPartByTime(...) but throws an exception in case of failure instead of returning null.
Changes to playlists:
Changed Playlist.Author type to Author. Note that this property is nullable because auto-generated playlists (mixed, topics, etc.) don't have an author.
Changed Playlist.Thumbnails type from ThumbnailSet to IReadOnlyList<Thumbnail>.
Videos contained within playlists are now of type PlaylistVideo instead of Video.
PlaylistVideo implements IVideo interface, which outlines properties shared with Video.
PlaylistVideo no longer contains some of the properties available on Video, specifically: UploadDate, Description, Keywords, and Engagement.
Changed PlaylistVideo.Author type to Author.
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, use PlaylistClient.GetVideoBatchesAsync(...) instead.
Removed public constructor from PlaylistId. To create an instance of PlaylistId, use PlaylistId.Parse(...), PlaylistId.TryParse(...), or the implicit conversion from string to PlaylistId.
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, and ChannelSearchResult to represent the different possible result types. They implement IVideo, IPlaylist, and IChannel respectively.
Added SearchClient.GetResultsAsync(...) which returns instances of ISearchResult. You will need to match the instance with one of its possible implementations (VideoSearchResult, PlaylistSearchResult, or ChannelSearchResult) to extract detailed information.
Added SearchClient.GetResultBatchesAsync(...) that provides more granular control over how many requests are sent to YouTube, similar to PlaylistClient.GetVideoBatchesAsync(...).
Added additional methods to filter results by type: SearchClient.GetVideosAsync(...), SearchClient.GetChannelsAsync(...), and SearchClient.GetPlaylistsAsync(...). Under the hood, these methods call SearchClient.GetResultsAsync(...).
Changes to channels:
Removed Channel.LogoUrl in favor of Channel.Thumbnails of type IReadOnlyList<Thumbnail>.
Removed public constructor from ChannelId. To create an instance of ChannelId, use ChannelId.Parse(...), ChannelId.TryParse(...), or the implicit conversion from string to ChannelId.
Removed public constructor from UserName. To create an instance of UserName, use UserName.Parse(...), UserName.TryParse(...), or the implicit conversion from string to UserName.
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Bumps YoutubeExplode from 6.0.0 to 6.0.1.
Changelog
Sourced from YoutubeExplode's changelog.
... (truncated)
Commits
e77c294
Update version9a4235f
Add "html5=1" to get_video_info request230d057
Update assert in one of channel tests due to change in data9700416
Ignore rawcc dash streams9dc0a9f
Change cookie handlingafc4ee2
Remove feature request form90915b2
Use issue formscc02475
Update ReadMe.md5dacb0c
Update readme132686b
Update ReadMe.mdDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase
.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)