Add JSON mapping for captions
This commit is contained in:
parent
f3646dc0bb
commit
6c71227766
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue