forked from midou/invidious
Fix caption parsing on age restricted videos
This commit is contained in:
parent
ca4df29670
commit
54b19a04bb
@ -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)
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
getter languageCode : String
|
||||||
|
getter baseUrl : String
|
||||||
|
|
||||||
|
setter name
|
||||||
|
|
||||||
|
def initialize(@name, @languageCode, @baseUrl)
|
||||||
end
|
end
|
||||||
|
|
||||||
struct Caption
|
|
||||||
include JSON::Serializable
|
|
||||||
|
|
||||||
property name : CaptionName
|
|
||||||
property baseUrl : String
|
|
||||||
property languageCode : String
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class VideoRedirect < Exception
|
class VideoRedirect < Exception
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user