mirror of
				https://gitea.invidious.io/iv-org/invidious
				synced 2025-06-05 23:29:12 +02:00 
			
		
		
		
	Merge pull request #3060 from SamantazFox/video-api-newpipe-compat
Video API: Improve NewPipe compatibility
This commit is contained in:
		| @@ -62,6 +62,9 @@ module Invidious::Routes::API::Manifest | ||||
|  | ||||
|             xml.element("AdaptationSet", id: i, mimeType: mime_type, startWithSAP: 1, subsegmentAlignment: true) do | ||||
|               mime_streams.each do |fmt| | ||||
|                 # OTF streams aren't supported yet (See https://github.com/TeamNewPipe/NewPipe/issues/2415) | ||||
|                 next if !(fmt.has_key?("indexRange") && fmt.has_key?("initRange")) | ||||
|  | ||||
|                 codecs = fmt["mimeType"].as_s.split("codecs=")[1].strip('"') | ||||
|                 bandwidth = fmt["bitrate"].as_i | ||||
|                 itag = fmt["itag"].as_i | ||||
| @@ -90,6 +93,9 @@ module Invidious::Routes::API::Manifest | ||||
|             heights = [] of Int32 | ||||
|             xml.element("AdaptationSet", id: i, mimeType: mime_type, startWithSAP: 1, subsegmentAlignment: true, scanType: "progressive") do | ||||
|               mime_streams.each do |fmt| | ||||
|                 # OTF streams aren't supported yet (See https://github.com/TeamNewPipe/NewPipe/issues/2415) | ||||
|                 next if !(fmt.has_key?("indexRange") && fmt.has_key?("initRange")) | ||||
|  | ||||
|                 codecs = fmt["mimeType"].as_s.split("codecs=")[1].strip('"') | ||||
|                 bandwidth = fmt["bitrate"].as_i | ||||
|                 itag = fmt["itag"].as_i | ||||
|   | ||||
| @@ -374,18 +374,25 @@ struct Video | ||||
|         json.array do | ||||
|           self.adaptive_fmts.each do |fmt| | ||||
|             json.object do | ||||
|               json.field "index", "#{fmt["indexRange"]["start"]}-#{fmt["indexRange"]["end"]}" | ||||
|               json.field "bitrate", fmt["bitrate"].as_i.to_s | ||||
|               json.field "init", "#{fmt["initRange"]["start"]}-#{fmt["initRange"]["end"]}" | ||||
|               # Only available on regular videos, not livestreams/OTF streams | ||||
|               if init_range = fmt["initRange"]? | ||||
|                 json.field "init", "#{init_range["start"]}-#{init_range["end"]}" | ||||
|               end | ||||
|               if index_range = fmt["indexRange"]? | ||||
|                 json.field "index", "#{index_range["start"]}-#{index_range["end"]}" | ||||
|               end | ||||
|  | ||||
|               # Not available on MPEG-4 Timed Text (`text/mp4`) streams (livestreams only) | ||||
|               json.field "bitrate", fmt["bitrate"].as_i.to_s if fmt["bitrate"]? | ||||
|  | ||||
|               json.field "url", fmt["url"] | ||||
|               json.field "itag", fmt["itag"].as_i.to_s | ||||
|               json.field "type", fmt["mimeType"] | ||||
|               json.field "clen", fmt["contentLength"] | ||||
|               json.field "clen", fmt["contentLength"]? || "-1" | ||||
|               json.field "lmt", fmt["lastModified"] | ||||
|               json.field "projectionType", fmt["projectionType"] | ||||
|  | ||||
|               fmt_info = itag_to_metadata?(fmt["itag"]) | ||||
|               if fmt_info | ||||
|               if fmt_info = itag_to_metadata?(fmt["itag"]) | ||||
|                 fps = fmt_info["fps"]?.try &.to_i || fmt["fps"]?.try &.as_i || 30 | ||||
|                 json.field "fps", fps | ||||
|                 json.field "container", fmt_info["ext"] | ||||
| @@ -405,6 +412,15 @@ struct Video | ||||
|                   end | ||||
|                 end | ||||
|               end | ||||
|  | ||||
|               # Audio-related data | ||||
|               json.field "audioQuality", fmt["audioQuality"] if fmt.has_key?("audioQuality") | ||||
|               json.field "audioSampleRate", fmt["audioSampleRate"].as_s.to_i if fmt.has_key?("audioSampleRate") | ||||
|               json.field "audioChannels", fmt["audioChannels"] if fmt.has_key?("audioChannels") | ||||
|  | ||||
|               # Extra misc stuff | ||||
|               json.field "colorInfo", fmt["colorInfo"] if fmt.has_key?("colorInfo") | ||||
|               json.field "captionTrack", fmt["captionTrack"] if fmt.has_key?("captionTrack") | ||||
|             end | ||||
|           end | ||||
|         end | ||||
| @@ -612,6 +628,7 @@ struct Video | ||||
|       fmt["url"] = JSON::Any.new("#{fmt["url"]}&host=#{URI.parse(fmt["url"].as_s).host}") | ||||
|       fmt["url"] = JSON::Any.new("#{fmt["url"]}®ion=#{self.info["region"]}") if self.info["region"]? | ||||
|     end | ||||
|  | ||||
|     fmt_stream.sort_by! { |f| f["width"]?.try &.as_i || 0 } | ||||
|     @fmt_stream = fmt_stream | ||||
|     return @fmt_stream.as(Array(Hash(String, JSON::Any))) | ||||
| @@ -631,9 +648,7 @@ struct Video | ||||
|       fmt["url"] = JSON::Any.new("#{fmt["url"]}&host=#{URI.parse(fmt["url"].as_s).host}") | ||||
|       fmt["url"] = JSON::Any.new("#{fmt["url"]}®ion=#{self.info["region"]}") if self.info["region"]? | ||||
|     end | ||||
|     # See https://github.com/TeamNewPipe/NewPipe/issues/2415 | ||||
|     # Some streams are segmented by URL `sq/` rather than index, for now we just filter them out | ||||
|     fmt_stream.reject! { |f| !f["indexRange"]? } | ||||
|  | ||||
|     fmt_stream.sort_by! { |f| f["width"]?.try &.as_i || 0 } | ||||
|     @adaptive_fmts = fmt_stream | ||||
|     return @adaptive_fmts.as(Array(Hash(String, JSON::Any))) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user