Add JSON mapping for captions

This commit is contained in:
Omar Roth 2018-08-06 18:25:25 -05:00
parent f3646dc0bb
commit 6c71227766
4 changed files with 39 additions and 18 deletions

View file

@ -216,12 +216,12 @@ get "/watch" do |env|
captions = video.captions captions = video.captions
if preferences if preferences
preferred_captions = captions.select { |caption| preferences.captions.includes? caption["name"]["simpleText"] } preferred_captions = captions.select { |caption| preferences.captions.includes? caption.name.simpleText }
preferred_captions.sort_by! { |caption| preferences.captions.index(caption["name"]["simpleText"]).not_nil! } preferred_captions.sort_by! { |caption| preferences.captions.index(caption.name.simpleText).not_nil! }
captions = captions - preferred_captions captions = captions - preferred_captions
end end
preferred_captions ||= [] of JSON::Any preferred_captions ||= [] of Caption
video.description = fill_links(video.description, "https", "www.youtube.com") video.description = fill_links(video.description, "https", "www.youtube.com")
video.description = add_alt_links(video.description) video.description = add_alt_links(video.description)
@ -1586,8 +1586,8 @@ get "/api/v1/captions/:id" do |env|
json.array do json.array do
captions.each do |caption| captions.each do |caption|
json.object do json.object do
json.field "label", caption["name"]["simpleText"] json.field "label", caption.name.simpleText
json.field "languageCode", caption["languageCode"] json.field "languageCode", caption.languageCode
end end
end end
end end
@ -1598,7 +1598,7 @@ get "/api/v1/captions/:id" do |env|
next response next response
end end
caption = captions.select { |caption| caption["name"]["simpleText"] == label } caption = captions.select { |caption| caption.name.simpleText == label }
env.response.content_type = "text/vtt" env.response.content_type = "text/vtt"
if caption.empty? if caption.empty?
@ -1607,13 +1607,13 @@ get "/api/v1/captions/:id" do |env|
caption = caption[0] caption = caption[0]
end end
caption_xml = client.get(caption["baseUrl"].as_s).body caption_xml = client.get(caption.baseUrl).body
caption_xml = XML.parse(caption_xml) caption_xml = XML.parse(caption_xml)
webvtt = <<-END_VTT webvtt = <<-END_VTT
WEBVTT WEBVTT
Kind: captions Kind: captions
Language: #{caption["languageCode"]} Language: #{caption.languageCode}
END_VTT END_VTT
@ -1965,8 +1965,8 @@ get "/api/v1/videos/:id" do |env|
json.array do json.array do
captions.each do |caption| captions.each do |caption|
json.object do json.object do
json.field "label", caption["name"]["simpleText"] json.field "label", caption.name.simpleText
json.field "languageCode", caption["languageCode"] json.field "languageCode", caption.languageCode
end end
end end
end end

View file

@ -87,6 +87,7 @@ CAPTION_LANGUAGES = [
"Somali", "Somali",
"Southern Sotho", "Southern Sotho",
"Spanish", "Spanish",
"Spanish (Latin America)",
"Sundanese", "Sundanese",
"Swahili", "Swahili",
"Swedish", "Swedish",
@ -164,10 +165,16 @@ class Video
def captions def captions
player_response = JSON.parse(self.info["player_response"]) player_response = JSON.parse(self.info["player_response"])
captions = [] of Caption
if player_response["captions"]? if player_response["captions"]?
captions = player_response["captions"]["playerCaptionsTracklistRenderer"]["captionTracks"]?.try &.as_a caption_list = player_response["captions"]["playerCaptionsTracklistRenderer"]["captionTracks"].as_a
caption_list.each do |caption|
caption = Caption.from_json(caption.to_json)
caption.name.simpleText = caption.name.simpleText.split(" - ")[0]
captions << caption
end
end end
captions ||= [] of JSON::Any
return captions return captions
end end
@ -207,6 +214,20 @@ class Video
}) })
end end
class Caption
JSON.mapping(
name: CaptionName,
baseUrl: String,
languageCode: String
)
end
class CaptionName
JSON.mapping(
simpleText: String,
)
end
def get_video(id, db, refresh = true) def get_video(id, db, refresh = true)
if db.query_one?("SELECT EXISTS (SELECT true FROM videos WHERE id = $1)", id, as: Bool) if db.query_one?("SELECT EXISTS (SELECT true FROM videos WHERE id = $1)", id, as: Bool)
video = db.query_one("SELECT * FROM videos WHERE id = $1", id, as: Video) video = db.query_one("SELECT * FROM videos WHERE id = $1", id, as: Video)

View file

@ -56,8 +56,8 @@ video, #my_video, .video-js, .vjs-default-skin
<% end %> <% end %>
<% captions.each do |caption| %> <% captions.each do |caption| %>
<track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption["name"]["simpleText"] %>" <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name.simpleText %>"
label="<%= caption["name"]["simpleText"]%> "> label="<%= caption.name.simpleText %> ">
<% end %> <% end %>
<% end %> <% end %>
</video> </video>

View file

@ -61,14 +61,14 @@
<% end %> <% end %>
<% preferred_captions.each_with_index do |caption, i| %> <% preferred_captions.each_with_index do |caption, i| %>
<track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption["name"]["simpleText"] %>" <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name.simpleText %>"
label="<%= caption["name"]["simpleText"]%>" <% if i == 0 %>default<% end %>> label="<%= caption.name.simpleText %>" <% if i == 0 %>default<% end %>>
<% end %> <% end %>
<% end %> <% end %>
<% captions.each do |caption| %> <% captions.each do |caption| %>
<track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption["name"]["simpleText"] %>" <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name.simpleText %>"
label="<%= caption["name"]["simpleText"]%>"> label="<%= caption.name.simpleText %>">
<% end %> <% end %>
<% end %> <% end %>
</video> </video>