invidious-copy-2022-03-16/spec/extraction_spec.cr

107 lines
4.9 KiB
Crystal
Raw Normal View History

2021-08-12 02:29:19 +00:00
require "pg" # Required for DB::Serializable
require "spec"
# Required for initializing DB::Serializable objects with NamedTuples
require "../src/invidious/helpers/macros"
# Renderer structs
require "../src/invidious/data_structs/youtube/base"
require "../src/invidious/data_structs/youtube/renderers/*"
require "../src/invidious/data_structs/youtube/videos" # Category obj requires Video struct.
require "../src/invidious/helpers/extractors.cr"
require "./item_jsons/*"
describe YouTubeStructs::VideoRenderer do
it "It is able to extract a 'standard' videoRenderer without missing information" do
video = extract_item(JSON.parse(VIDEO_RENDERER_EXAMPLES[0])).as(YouTubeStructs::VideoRenderer)
video.author.should(eq("Kurzgesagt In a Nutshell"))
video.description_html.should(eq(""))
video.id.should(eq("E1KkQrFEl2I"))
video.length_seconds.should(eq(665))
video.live_now.should(eq(false))
video.paid.should(eq(false))
video.premiere_timestamp.should(eq(nil))
video.premium.should(eq(false))
# Invidious uses the current time (UTC) to compute a timestamp
# from YouTube's relative upload dates on renderers.
video.published.not_nil!.to_s("%Y-%m-%d").should(eq((Time.utc - 9.months).to_s("%Y-%m-%d")))
video.title.should(eq("How Large Can a Bacteria get? Life & Size 3"))
video.ucid.should(eq("UCsXVk37bltHxD1rDPwtNM8Q"))
video.views.should(eq(7324534))
end
end
describe YouTubeStructs::ChannelRenderer do
it "It is able to extract a 'standard' channelRenderer without missing information" do
channel = extract_item(JSON.parse(CHANNEL_RENDERER_EXAMPLES[0])).as(YouTubeStructs::ChannelRenderer)
channel.author.should(eq("Kurzgesagt In a Nutshell"))
channel.author_thumbnail.should(eq("//yt3.ggpht.com/ytc/AKedOLRvMf1ZTTCnC5Wc0EGOVPyrdyvfvs20vtdTUxz_vQ=s88-c-k-c0x00ffffff-no-rj-mo"))
channel.auto_generated.should(eq(false))
channel.description_html.should(eq("Videos explaining things with optimistic nihilism. We are a small team who want to make science look beautiful. Because it is ..."))
channel.subscriber_count.should(eq(15700000))
channel.ucid.should(eq("UCsXVk37bltHxD1rDPwtNM8Q"))
channel.video_count.should(eq(144))
end
it "It is able to extract a channelRenderer without subscription information" do
channel = extract_item(JSON.parse(CHANNEL_RENDERER_EXAMPLES[1])).as(YouTubeStructs::ChannelRenderer)
channel.author.should(eq("Langfocus"))
channel.author_thumbnail.should(eq("//yt3.ggpht.com/ytc/AKedOLRvsTYz7nlOWrGLc1GzlV96kXxY1Q9IE1KzqbXa3g=s88-c-k-c0x00ffffff-no-rj-mo"))
channel.auto_generated.should(eq(false))
channel.description_html.should(eq("Sharing my passion for languages and reaching out into the wider world."))
channel.subscriber_count.should(eq(0)) # Not accurate. This value should ideally be nil in this case
channel.ucid.should(eq("UCNhX3WQEkraW3VHPyup8jkQ"))
channel.video_count.should(eq(165))
end
end
describe YouTubeStructs::PlaylistRenderer do
it "It is able to extract a 'standard' playlistRenderer without missing information" do
playlist = extract_item(JSON.parse(PLAYLIST_RENDERER_EXAMPLES[0])).as(YouTubeStructs::PlaylistRenderer)
playlist.author.should(eq("Kurzgesagt In a Nutshell"))
playlist.id.should(eq("PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF"))
playlist.thumbnail.should(eq("https://i.ytimg.com/vi/0FH9cgRhQ-k/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLD9giG-6BICfsfD6p8l0OxjPEqiPg"))
playlist.title.should(eq("The Universe and Space stuff"))
playlist.ucid.should(eq("UCsXVk37bltHxD1rDPwtNM8Q"))
playlist.video_count.should(eq(32))
playlist.videos.should(eq([
{title: "The Largest Black Hole in the Universe - Size Comparison",
id: "0FH9cgRhQ-k",
length_seconds: 824},
{title: "How To Terraform Venus (Quickly)",
id: "G-WO-z-QuWI",
length_seconds: 768},
]))
end
it "It is able to extract a playlistRenderer located in a grid, and has no missing information" do
# We'll add the channel name and UCID as a fallback
# as the author information just isn't returned by InnerTube in a gridPlaylistRenderer.
playlist = extract_item(
JSON.parse(PLAYLIST_RENDERER_EXAMPLES[1]),
"Kurzgesagt In a Nutshell",
"UCsXVk37bltHxD1rDPwtNM8Q"
).as(YouTubeStructs::PlaylistRenderer)
playlist.author.should(eq("Kurzgesagt In a Nutshell"))
playlist.id.should(eq("PLFs4vir_WsTxontcYm5ctqp89cNBJKNrs"))
playlist.thumbnail.should(eq("https://i.ytimg.com/vi/0FH9cgRhQ-k/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLD9depPKF_lMsYL7jWnLoCVyw-0pg"))
playlist.title.should(eq("The Existential Crisis Playlist"))
playlist.ucid.should(eq("UCsXVk37bltHxD1rDPwtNM8Q"))
playlist.video_count.should(eq(34))
playlist.videos.should(eq(Array(YouTubeStructs::PlaylistVideoRenderer).new))
end
end
describe YouTubeStructs::Category do
# TODO
end