invidious-copy-2022-03-16/spec/extraction_spec.cr
2021-10-04 01:07:40 -07:00

106 lines
4.9 KiB
Crystal
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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