mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-11-04 06:31:57 +00:00 
			
		
		
		
	Add JSON mapping for captions
This commit is contained in:
		@@ -216,12 +216,12 @@ get "/watch" do |env|
 | 
			
		||||
 | 
			
		||||
  captions = video.captions
 | 
			
		||||
  if preferences
 | 
			
		||||
    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 = captions.select { |caption| preferences.captions.includes? caption.name.simpleText }
 | 
			
		||||
    preferred_captions.sort_by! { |caption| preferences.captions.index(caption.name.simpleText).not_nil! }
 | 
			
		||||
 | 
			
		||||
    captions = captions - preferred_captions
 | 
			
		||||
  end
 | 
			
		||||
  preferred_captions ||= [] of JSON::Any
 | 
			
		||||
  preferred_captions ||= [] of Caption
 | 
			
		||||
 | 
			
		||||
  video.description = fill_links(video.description, "https", "www.youtube.com")
 | 
			
		||||
  video.description = add_alt_links(video.description)
 | 
			
		||||
@@ -1586,8 +1586,8 @@ get "/api/v1/captions/:id" do |env|
 | 
			
		||||
          json.array do
 | 
			
		||||
            captions.each do |caption|
 | 
			
		||||
              json.object do
 | 
			
		||||
                json.field "label", caption["name"]["simpleText"]
 | 
			
		||||
                json.field "languageCode", caption["languageCode"]
 | 
			
		||||
                json.field "label", caption.name.simpleText
 | 
			
		||||
                json.field "languageCode", caption.languageCode
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
@@ -1598,7 +1598,7 @@ get "/api/v1/captions/:id" do |env|
 | 
			
		||||
    next response
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  caption = captions.select { |caption| caption["name"]["simpleText"] == label }
 | 
			
		||||
  caption = captions.select { |caption| caption.name.simpleText == label }
 | 
			
		||||
 | 
			
		||||
  env.response.content_type = "text/vtt"
 | 
			
		||||
  if caption.empty?
 | 
			
		||||
@@ -1607,13 +1607,13 @@ get "/api/v1/captions/:id" do |env|
 | 
			
		||||
    caption = caption[0]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  caption_xml = client.get(caption["baseUrl"].as_s).body
 | 
			
		||||
  caption_xml = client.get(caption.baseUrl).body
 | 
			
		||||
  caption_xml = XML.parse(caption_xml)
 | 
			
		||||
 | 
			
		||||
  webvtt = <<-END_VTT
 | 
			
		||||
  WEBVTT
 | 
			
		||||
  Kind: captions
 | 
			
		||||
  Language: #{caption["languageCode"]}
 | 
			
		||||
  Language: #{caption.languageCode}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  END_VTT
 | 
			
		||||
@@ -1965,8 +1965,8 @@ get "/api/v1/videos/:id" do |env|
 | 
			
		||||
        json.array do
 | 
			
		||||
          captions.each do |caption|
 | 
			
		||||
            json.object do
 | 
			
		||||
              json.field "label", caption["name"]["simpleText"]
 | 
			
		||||
              json.field "languageCode", caption["languageCode"]
 | 
			
		||||
              json.field "label", caption.name.simpleText
 | 
			
		||||
              json.field "languageCode", caption.languageCode
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 
 | 
			
		||||
@@ -87,6 +87,7 @@ CAPTION_LANGUAGES = [
 | 
			
		||||
  "Somali",
 | 
			
		||||
  "Southern Sotho",
 | 
			
		||||
  "Spanish",
 | 
			
		||||
  "Spanish (Latin America)",
 | 
			
		||||
  "Sundanese",
 | 
			
		||||
  "Swahili",
 | 
			
		||||
  "Swedish",
 | 
			
		||||
@@ -164,10 +165,16 @@ class Video
 | 
			
		||||
  def captions
 | 
			
		||||
    player_response = JSON.parse(self.info["player_response"])
 | 
			
		||||
 | 
			
		||||
    captions = [] of Caption
 | 
			
		||||
    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
 | 
			
		||||
    captions ||= [] of JSON::Any
 | 
			
		||||
 | 
			
		||||
    return captions
 | 
			
		||||
  end
 | 
			
		||||
@@ -207,6 +214,20 @@ class Video
 | 
			
		||||
  })
 | 
			
		||||
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)
 | 
			
		||||
  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)
 | 
			
		||||
 
 | 
			
		||||
@@ -56,8 +56,8 @@ video, #my_video, .video-js, .vjs-default-skin
 | 
			
		||||
        <% end %>
 | 
			
		||||
 | 
			
		||||
        <% captions.each do |caption| %>
 | 
			
		||||
            <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption["name"]["simpleText"] %>"
 | 
			
		||||
                label="<%= caption["name"]["simpleText"]%> ">
 | 
			
		||||
            <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name.simpleText %>"
 | 
			
		||||
                label="<%= caption.name.simpleText %> ">
 | 
			
		||||
        <% end %>
 | 
			
		||||
    <% end %>
 | 
			
		||||
</video>
 | 
			
		||||
 
 | 
			
		||||
@@ -61,14 +61,14 @@
 | 
			
		||||
                <% end %>
 | 
			
		||||
                
 | 
			
		||||
                <% preferred_captions.each_with_index do |caption, i| %>
 | 
			
		||||
                <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption["name"]["simpleText"] %>"
 | 
			
		||||
                    label="<%= caption["name"]["simpleText"]%>" <% if i == 0 %>default<% end %>>
 | 
			
		||||
                <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name.simpleText %>"
 | 
			
		||||
                    label="<%= caption.name.simpleText %>" <% if i == 0 %>default<% end %>>
 | 
			
		||||
                <% end %>
 | 
			
		||||
            <% end %>
 | 
			
		||||
 | 
			
		||||
            <% captions.each do |caption| %>
 | 
			
		||||
            <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption["name"]["simpleText"] %>"
 | 
			
		||||
                label="<%= caption["name"]["simpleText"]%>">
 | 
			
		||||
            <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name.simpleText %>"
 | 
			
		||||
                label="<%= caption.name.simpleText %>">
 | 
			
		||||
            <% end %>
 | 
			
		||||
        <% end %>
 | 
			
		||||
    </video>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user