mirror of
https://git.nadeko.net/Fijxu/invidious.git
synced 2025-12-23 19:38:50 +00:00
Add API endpoint to fetch YouTube transcripts
This commit is contained in:
@@ -411,4 +411,69 @@ module Invidious::Routes::API::V1::Videos
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Fetches transcripts from YouTube
|
||||
#
|
||||
# Use the `lang` and `autogen` query parameter to select which transcript to fetch
|
||||
# Request without any URL parameters to see all the available transcripts.
|
||||
def self.transcripts(env)
|
||||
env.response.content_type = "application/json"
|
||||
|
||||
id = env.params.url["id"]
|
||||
lang = env.params.query["lang"]?
|
||||
auto_generated = env.params.query["autogen"]? ? true : false
|
||||
|
||||
# Return all available transcript options when none is given
|
||||
if !lang
|
||||
begin
|
||||
video = get_video(id)
|
||||
rescue ex : NotFoundException
|
||||
return error_json(404, ex)
|
||||
rescue ex
|
||||
return error_json(500, ex)
|
||||
end
|
||||
|
||||
response = JSON.build do |json|
|
||||
# The amount of transcripts available to fetch is the
|
||||
# same as the amount of captions available.
|
||||
available_transcripts = video.captions
|
||||
|
||||
json.object do
|
||||
json.field "transcripts" do
|
||||
json.array do
|
||||
available_transcripts.each do |transcript|
|
||||
json.object do
|
||||
json.field "label", transcript.name
|
||||
json.field "languageCode", transcript.language_code
|
||||
json.field "autoGenerated", transcript.auto_generated
|
||||
|
||||
if transcript.auto_generated
|
||||
json.field "url", "/api/v1/transcripts/#{id}?lang=#{URI.encode_www_form(transcript.language_code)}&autogen"
|
||||
else
|
||||
json.field "url", "/api/v1/transcripts/#{id}?lang=#{URI.encode_www_form(transcript.language_code)}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return response
|
||||
end
|
||||
|
||||
params = Invidious::Videos::Transcript.generate_param(id, lang, auto_generated)
|
||||
|
||||
begin
|
||||
transcript = Invidious::Videos::Transcript.from_raw(
|
||||
YoutubeAPI.get_transcript(params), lang, auto_generated
|
||||
)
|
||||
rescue ex : NotFoundException
|
||||
return error_json(404, ex)
|
||||
rescue ex
|
||||
return error_json(500, ex)
|
||||
end
|
||||
|
||||
return transcript.to_json
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user