Fix caption parsing on age restricted videos

This commit is contained in:
syeopite 2021-06-27 07:18:16 -07:00
parent ca4df29670
commit 54b19a04bb
No known key found for this signature in database
GPG key ID: 6FA616E5A5294A82
6 changed files with 32 additions and 27 deletions

View file

@ -1961,9 +1961,9 @@ 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
json.field "languageCode", caption.languageCode json.field "languageCode", caption.languageCode
json.field "url", "/api/v1/captions/#{id}?label=#{URI.encode_www_form(caption.name.simpleText)}" json.field "url", "/api/v1/captions/#{id}?label=#{URI.encode_www_form(caption.name)}"
end end
end end
end end
@ -1979,7 +1979,7 @@ get "/api/v1/captions/:id" do |env|
if lang if lang
caption = captions.select { |caption| caption.languageCode == lang } caption = captions.select { |caption| caption.languageCode == lang }
else else
caption = captions.select { |caption| caption.name.simpleText == label } caption = captions.select { |caption| caption.name == label }
end end
if caption.empty? if caption.empty?
@ -1993,7 +1993,7 @@ get "/api/v1/captions/:id" do |env|
# Auto-generated captions often have cues that aren't aligned properly with the video, # Auto-generated captions often have cues that aren't aligned properly with the video,
# as well as some other markup that makes it cumbersome, so we try to fix that here # as well as some other markup that makes it cumbersome, so we try to fix that here
if caption.name.simpleText.includes? "auto-generated" if caption.name.includes? "auto-generated"
caption_xml = YT_POOL.client &.get(url).body caption_xml = YT_POOL.client &.get(url).body
caption_xml = XML.parse(caption_xml) caption_xml = XML.parse(caption_xml)

View file

@ -165,11 +165,11 @@ class Invidious::Routes::Embed < Invidious::Routes::BaseRoute
captions = video.captions captions = video.captions
preferred_captions = captions.select { |caption| preferred_captions = captions.select { |caption|
params.preferred_captions.includes?(caption.name.simpleText) || params.preferred_captions.includes?(caption.name) ||
params.preferred_captions.includes?(caption.languageCode.split("-")[0]) params.preferred_captions.includes?(caption.languageCode.split("-")[0])
} }
preferred_captions.sort_by! { |caption| preferred_captions.sort_by! { |caption|
(params.preferred_captions.index(caption.name.simpleText) || (params.preferred_captions.index(caption.name) ||
params.preferred_captions.index(caption.languageCode.split("-")[0])).not_nil! params.preferred_captions.index(caption.languageCode.split("-")[0])).not_nil!
} }
captions = captions - preferred_captions captions = captions - preferred_captions

View file

@ -150,11 +150,11 @@ class Invidious::Routes::Watch < Invidious::Routes::BaseRoute
captions = video.captions captions = video.captions
preferred_captions = captions.select { |caption| preferred_captions = captions.select { |caption|
params.preferred_captions.includes?(caption.name.simpleText) || params.preferred_captions.includes?(caption.name) ||
params.preferred_captions.includes?(caption.languageCode.split("-")[0]) params.preferred_captions.includes?(caption.languageCode.split("-")[0])
} }
preferred_captions.sort_by! { |caption| preferred_captions.sort_by! { |caption|
(params.preferred_captions.index(caption.name.simpleText) || (params.preferred_captions.index(caption.name) ||
params.preferred_captions.index(caption.languageCode.split("-")[0])).not_nil! params.preferred_captions.index(caption.languageCode.split("-")[0])).not_nil!
} }
captions = captions - preferred_captions captions = captions - preferred_captions

View file

@ -425,9 +425,9 @@ struct Video
json.array do json.array do
self.captions.each do |caption| self.captions.each do |caption|
json.object do json.object do
json.field "label", caption.name.simpleText json.field "label", caption.name
json.field "languageCode", caption.languageCode json.field "languageCode", caption.languageCode
json.field "url", "/api/v1/captions/#{id}?label=#{URI.encode_www_form(caption.name.simpleText)}" json.field "url", "/api/v1/captions/#{id}?label=#{URI.encode_www_form(caption.name)}"
end end
end end
end end
@ -706,8 +706,12 @@ struct Video
def captions : Array(Caption) def captions : Array(Caption)
return @captions.as(Array(Caption)) if @captions return @captions.as(Array(Caption)) if @captions
captions = info["captions"]?.try &.["playerCaptionsTracklistRenderer"]?.try &.["captionTracks"]?.try &.as_a.map do |caption| captions = info["captions"]?.try &.["playerCaptionsTracklistRenderer"]?.try &.["captionTracks"]?.try &.as_a.map do |caption|
caption = Caption.from_json(caption.to_json) name = caption["name"]["simpleText"]? || caption["name"]["runs"][0]["text"]
caption.name.simpleText = caption.name.simpleText.split(" - ")[0] languageCode = caption["languageCode"].to_s
baseUrl = caption["baseUrl"].to_s
caption = Caption.new(name.to_s, languageCode, baseUrl)
caption.name = caption.name.split(" - ")[0]
caption caption
end end
captions ||= [] of Caption captions ||= [] of Caption
@ -782,18 +786,19 @@ struct Video
end end
end end
struct CaptionName class Caption
include JSON::Serializable property name
property languageCode
property baseUrl
property simpleText : String getter name : String
end getter languageCode : String
getter baseUrl : String
struct Caption setter name
include JSON::Serializable
property name : CaptionName def initialize(@name, @languageCode, @baseUrl)
property baseUrl : String end
property languageCode : String
end end
class VideoRedirect < Exception class VideoRedirect < Exception

View file

@ -25,13 +25,13 @@
<% end %> <% end %>
<% preferred_captions.each do |caption| %> <% preferred_captions.each do |caption| %>
<track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name.simpleText %>&hl=<%= env.get("preferences").as(Preferences).locale %>" <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name %>&hl=<%= env.get("preferences").as(Preferences).locale %>"
label="<%= caption.name.simpleText %>"> label="<%= caption.name %>">
<% end %> <% end %>
<% captions.each do |caption| %> <% captions.each do |caption| %>
<track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name.simpleText %>&hl=<%= env.get("preferences").as(Preferences).locale %>" <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name %>&hl=<%= env.get("preferences").as(Preferences).locale %>"
label="<%= caption.name.simpleText %>"> label="<%= caption.name %>">
<% end %> <% end %>
<% end %> <% end %>
</video> </video>

View file

@ -178,8 +178,8 @@ we're going to need to do it here in order to allow for translations.
</option> </option>
<% end %> <% end %>
<% captions.each do |caption| %> <% captions.each do |caption| %>
<option value='{"id":"<%= video.id %>","label":"<%= caption.name.simpleText %>","title":"<%= URI.encode_www_form(video.title) %>-<%= video.id %>.<%= caption.languageCode %>.vtt"}'> <option value='{"id":"<%= video.id %>","label":"<%= caption.name %>","title":"<%= URI.encode_www_form(video.title) %>-<%= video.id %>.<%= caption.languageCode %>.vtt"}'>
<%= translate(locale, "Subtitles - `x` (.vtt)", caption.name.simpleText) %> <%= translate(locale, "Subtitles - `x` (.vtt)", caption.name) %>
</option> </option>
<% end %> <% end %>
</select> </select>