From d53151fdd28ef9e55279778e51001ac258963bd3 Mon Sep 17 00:00:00 2001 From: Manfred Stienstra Date: Mon, 3 Feb 2025 11:54:50 +0100 Subject: [PATCH] Add CLI command to fetch text track contents. --- src/teletube/cli.cr | 6 ++++++ src/teletube/client.cr | 32 +++++++++++++++++++++++++++++++- src/teletube/option_parser.cr | 12 ++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/teletube/cli.cr b/src/teletube/cli.cr index 0c47ca4..d850dab 100644 --- a/src/teletube/cli.cr +++ b/src/teletube/cli.cr @@ -52,6 +52,12 @@ module Teletube @client.get_browsable_waveform when "chapter-markers" @client.get_browsable_chapter_markers + when "text-tracks" + if context.params.has_key?("format") + @client.get_browsable_text_track + else + @client.get_browsable_text_tracks + end end when "config" @config.attributes = { diff --git a/src/teletube/client.cr b/src/teletube/client.cr index 33d6075..c3a6fc5 100644 --- a/src/teletube/client.cr +++ b/src/teletube/client.cr @@ -93,7 +93,7 @@ module Teletube if response.status_code == 200 offset = response.headers["Upload-Offset"].to_i elsif response.status_code == 423 - sleep 10 + sleep(1.second) end end offset @@ -292,6 +292,36 @@ module Teletube handle_response(@http.get(path: "/api/v1/browse/videos/#{@context.params["video_id"]}/chapter_markers")) end + def get_browsable_text_tracks + handle_response(@http.get(path: "/api/v1/browse/videos/#{@context.params["video_id"]}/text_tracks")) + end + + def get_browsable_text_track + response = get_browsable_text_tracks + if response.status_code == 200 + text_tracks = JSON.parse(response.body).as_a + text_tracks.each do |text_track| + if @context.params.has_key?("language") + if @context.params["language"].as_s == text_track["language"].as_s + print_browsable_text_track(text_track) + return + end + else + print_browsable_text_track(text_track) + return + end + end + end + end + + def print_browsable_text_track(text_track) + path = text_track["#{@context.params["format"]}_path"].as_s + response = handle_response(@http.get(path: path)) + if response.status_code == 200 + puts response.body + end + end + def handle_response(response) STDERR.puts "⚡️ #{response.status} (#{response.status_code})" puts response.body unless response.body.blank? diff --git a/src/teletube/option_parser.cr b/src/teletube/option_parser.cr index 602356d..8bdc732 100644 --- a/src/teletube/option_parser.cr +++ b/src/teletube/option_parser.cr @@ -295,6 +295,18 @@ module Teletube context.params["video_id"] = JSON::Any.new(id) end end + parser.on("text-tracks", "Show details for the text-tracks for a video.") do + context.command = "text-tracks" + parser.on("--video-id ID", "The public identifier of the video.") do |id| + context.params["video_id"] = JSON::Any.new(id) + end + parser.on("--language LANGUAGE", "Which of the tracks you want to fetch.") do |language| + context.params["language"] = JSON::Any.new(language) + end + parser.on("--format ", "Which of the tracks you want to fetch.") do |format| + context.params["format"] = JSON::Any.new(format) + end + end end parser.separator "Other options:"