mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-11-03 22:21:55 +00:00 
			
		
		
		
	videos: move formats structure to a separate file/module
This commit is contained in:
		@@ -37,6 +37,7 @@ require "./invidious/database/migrations/*"
 | 
			
		||||
require "./invidious/helpers/*"
 | 
			
		||||
require "./invidious/yt_backend/*"
 | 
			
		||||
require "./invidious/frontend/*"
 | 
			
		||||
require "./invidious/videos/*"
 | 
			
		||||
 | 
			
		||||
require "./invidious/*"
 | 
			
		||||
require "./invidious/channels/*"
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ module Invidious::Frontend::WatchPage
 | 
			
		||||
      video_assets.full_videos.each do |option|
 | 
			
		||||
        mimetype = option["mimeType"].as_s.split(";")[0]
 | 
			
		||||
 | 
			
		||||
        height = itag_to_metadata?(option["itag"]).try &.["height"]?
 | 
			
		||||
        height = Invidious::Videos::Formats.itag_to_metadata?(option["itag"]).try &.["height"]?
 | 
			
		||||
 | 
			
		||||
        value = {"itag": option["itag"], "ext": mimetype.split("/")[1]}.to_json
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -131,117 +131,6 @@ CAPTION_LANGUAGES = {
 | 
			
		||||
  "Zulu",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# See https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L380-#L476
 | 
			
		||||
VIDEO_FORMATS = {
 | 
			
		||||
  "5"  => {"ext" => "flv", "width" => 400, "height" => 240, "acodec" => "mp3", "abr" => 64, "vcodec" => "h263"},
 | 
			
		||||
  "6"  => {"ext" => "flv", "width" => 450, "height" => 270, "acodec" => "mp3", "abr" => 64, "vcodec" => "h263"},
 | 
			
		||||
  "13" => {"ext" => "3gp", "acodec" => "aac", "vcodec" => "mp4v"},
 | 
			
		||||
  "17" => {"ext" => "3gp", "width" => 176, "height" => 144, "acodec" => "aac", "abr" => 24, "vcodec" => "mp4v"},
 | 
			
		||||
  "18" => {"ext" => "mp4", "width" => 640, "height" => 360, "acodec" => "aac", "abr" => 96, "vcodec" => "h264"},
 | 
			
		||||
  "22" => {"ext" => "mp4", "width" => 1280, "height" => 720, "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
  "34" => {"ext" => "flv", "width" => 640, "height" => 360, "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
  "35" => {"ext" => "flv", "width" => 854, "height" => 480, "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
 | 
			
		||||
  "36" => {"ext" => "3gp", "width" => 320, "acodec" => "aac", "vcodec" => "mp4v"},
 | 
			
		||||
  "37" => {"ext" => "mp4", "width" => 1920, "height" => 1080, "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
  "38" => {"ext" => "mp4", "width" => 4096, "height" => 3072, "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
  "43" => {"ext" => "webm", "width" => 640, "height" => 360, "acodec" => "vorbis", "abr" => 128, "vcodec" => "vp8"},
 | 
			
		||||
  "44" => {"ext" => "webm", "width" => 854, "height" => 480, "acodec" => "vorbis", "abr" => 128, "vcodec" => "vp8"},
 | 
			
		||||
  "45" => {"ext" => "webm", "width" => 1280, "height" => 720, "acodec" => "vorbis", "abr" => 192, "vcodec" => "vp8"},
 | 
			
		||||
  "46" => {"ext" => "webm", "width" => 1920, "height" => 1080, "acodec" => "vorbis", "abr" => 192, "vcodec" => "vp8"},
 | 
			
		||||
  "59" => {"ext" => "mp4", "width" => 854, "height" => 480, "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
  "78" => {"ext" => "mp4", "width" => 854, "height" => 480, "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
 | 
			
		||||
  # 3D videos
 | 
			
		||||
  "82"  => {"ext" => "mp4", "height" => 360, "format" => "3D", "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
  "83"  => {"ext" => "mp4", "height" => 480, "format" => "3D", "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
  "84"  => {"ext" => "mp4", "height" => 720, "format" => "3D", "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
  "85"  => {"ext" => "mp4", "height" => 1080, "format" => "3D", "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
  "100" => {"ext" => "webm", "height" => 360, "format" => "3D", "acodec" => "vorbis", "abr" => 128, "vcodec" => "vp8"},
 | 
			
		||||
  "101" => {"ext" => "webm", "height" => 480, "format" => "3D", "acodec" => "vorbis", "abr" => 192, "vcodec" => "vp8"},
 | 
			
		||||
  "102" => {"ext" => "webm", "height" => 720, "format" => "3D", "acodec" => "vorbis", "abr" => 192, "vcodec" => "vp8"},
 | 
			
		||||
 | 
			
		||||
  # Apple HTTP Live Streaming
 | 
			
		||||
  "91"  => {"ext" => "mp4", "height" => 144, "format" => "HLS", "acodec" => "aac", "abr" => 48, "vcodec" => "h264"},
 | 
			
		||||
  "92"  => {"ext" => "mp4", "height" => 240, "format" => "HLS", "acodec" => "aac", "abr" => 48, "vcodec" => "h264"},
 | 
			
		||||
  "93"  => {"ext" => "mp4", "height" => 360, "format" => "HLS", "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
  "94"  => {"ext" => "mp4", "height" => 480, "format" => "HLS", "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
  "95"  => {"ext" => "mp4", "height" => 720, "format" => "HLS", "acodec" => "aac", "abr" => 256, "vcodec" => "h264"},
 | 
			
		||||
  "96"  => {"ext" => "mp4", "height" => 1080, "format" => "HLS", "acodec" => "aac", "abr" => 256, "vcodec" => "h264"},
 | 
			
		||||
  "132" => {"ext" => "mp4", "height" => 240, "format" => "HLS", "acodec" => "aac", "abr" => 48, "vcodec" => "h264"},
 | 
			
		||||
  "151" => {"ext" => "mp4", "height" => 72, "format" => "HLS", "acodec" => "aac", "abr" => 24, "vcodec" => "h264"},
 | 
			
		||||
 | 
			
		||||
  # DASH mp4 video
 | 
			
		||||
  "133" => {"ext" => "mp4", "height" => 240, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
  "134" => {"ext" => "mp4", "height" => 360, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
  "135" => {"ext" => "mp4", "height" => 480, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
  "136" => {"ext" => "mp4", "height" => 720, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
  "137" => {"ext" => "mp4", "height" => 1080, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
  "138" => {"ext" => "mp4", "format" => "DASH video", "vcodec" => "h264"}, # Height can vary (https://github.com/ytdl-org/youtube-dl/issues/4559)
 | 
			
		||||
  "160" => {"ext" => "mp4", "height" => 144, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
  "212" => {"ext" => "mp4", "height" => 480, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
  "264" => {"ext" => "mp4", "height" => 1440, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
  "298" => {"ext" => "mp4", "height" => 720, "format" => "DASH video", "vcodec" => "h264", "fps" => 60},
 | 
			
		||||
  "299" => {"ext" => "mp4", "height" => 1080, "format" => "DASH video", "vcodec" => "h264", "fps" => 60},
 | 
			
		||||
  "266" => {"ext" => "mp4", "height" => 2160, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
 | 
			
		||||
  # Dash mp4 audio
 | 
			
		||||
  "139" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "abr" => 48, "container" => "m4a_dash"},
 | 
			
		||||
  "140" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "abr" => 128, "container" => "m4a_dash"},
 | 
			
		||||
  "141" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "abr" => 256, "container" => "m4a_dash"},
 | 
			
		||||
  "256" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "container" => "m4a_dash"},
 | 
			
		||||
  "258" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "container" => "m4a_dash"},
 | 
			
		||||
  "325" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "dtse", "container" => "m4a_dash"},
 | 
			
		||||
  "328" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "ec-3", "container" => "m4a_dash"},
 | 
			
		||||
 | 
			
		||||
  # Dash webm
 | 
			
		||||
  "167" => {"ext" => "webm", "height" => 360, "width" => 640, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
  "168" => {"ext" => "webm", "height" => 480, "width" => 854, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
  "169" => {"ext" => "webm", "height" => 720, "width" => 1280, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
  "170" => {"ext" => "webm", "height" => 1080, "width" => 1920, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
  "218" => {"ext" => "webm", "height" => 480, "width" => 854, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
  "219" => {"ext" => "webm", "height" => 480, "width" => 854, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
  "278" => {"ext" => "webm", "height" => 144, "format" => "DASH video", "container" => "webm", "vcodec" => "vp9"},
 | 
			
		||||
  "242" => {"ext" => "webm", "height" => 240, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  "243" => {"ext" => "webm", "height" => 360, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  "244" => {"ext" => "webm", "height" => 480, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  "245" => {"ext" => "webm", "height" => 480, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  "246" => {"ext" => "webm", "height" => 480, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  "247" => {"ext" => "webm", "height" => 720, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  "248" => {"ext" => "webm", "height" => 1080, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  "271" => {"ext" => "webm", "height" => 1440, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  # itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug)
 | 
			
		||||
  "272" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  "302" => {"ext" => "webm", "height" => 720, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "303" => {"ext" => "webm", "height" => 1080, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "308" => {"ext" => "webm", "height" => 1440, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "313" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
  "315" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "330" => {"ext" => "webm", "height" => 144, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "331" => {"ext" => "webm", "height" => 240, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "332" => {"ext" => "webm", "height" => 360, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "333" => {"ext" => "webm", "height" => 480, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "334" => {"ext" => "webm", "height" => 720, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "335" => {"ext" => "webm", "height" => 1080, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "336" => {"ext" => "webm", "height" => 1440, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
  "337" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
 | 
			
		||||
  # Dash webm audio
 | 
			
		||||
  "171" => {"ext" => "webm", "acodec" => "vorbis", "format" => "DASH audio", "abr" => 128},
 | 
			
		||||
  "172" => {"ext" => "webm", "acodec" => "vorbis", "format" => "DASH audio", "abr" => 256},
 | 
			
		||||
 | 
			
		||||
  # Dash webm audio with opus inside
 | 
			
		||||
  "249" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 50},
 | 
			
		||||
  "250" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 70},
 | 
			
		||||
  "251" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 160},
 | 
			
		||||
 | 
			
		||||
  # av01 video only formats sometimes served with "unknown" codecs
 | 
			
		||||
  "394" => {"ext" => "mp4", "height" => 144, "vcodec" => "av01.0.05M.08"},
 | 
			
		||||
  "395" => {"ext" => "mp4", "height" => 240, "vcodec" => "av01.0.05M.08"},
 | 
			
		||||
  "396" => {"ext" => "mp4", "height" => 360, "vcodec" => "av01.0.05M.08"},
 | 
			
		||||
  "397" => {"ext" => "mp4", "height" => 480, "vcodec" => "av01.0.05M.08"},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct VideoPreferences
 | 
			
		||||
  include JSON::Serializable
 | 
			
		||||
 | 
			
		||||
@@ -390,7 +279,7 @@ struct Video
 | 
			
		||||
              json.field "lmt", fmt["lastModified"]
 | 
			
		||||
              json.field "projectionType", fmt["projectionType"]
 | 
			
		||||
 | 
			
		||||
              if fmt_info = itag_to_metadata?(fmt["itag"])
 | 
			
		||||
              if fmt_info = Invidious::Videos::Formats.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"]
 | 
			
		||||
@@ -437,7 +326,7 @@ struct Video
 | 
			
		||||
              json.field "type", fmt["mimeType"]
 | 
			
		||||
              json.field "quality", fmt["quality"]
 | 
			
		||||
 | 
			
		||||
              fmt_info = itag_to_metadata?(fmt["itag"])
 | 
			
		||||
              fmt_info = Invidious::Videos::Formats.itag_to_metadata?(fmt["itag"])
 | 
			
		||||
              if fmt_info
 | 
			
		||||
                fps = fmt_info["fps"]?.try &.to_i || fmt["fps"]?.try &.as_i || 30
 | 
			
		||||
                json.field "fps", fps
 | 
			
		||||
@@ -1164,10 +1053,6 @@ def fetch_video(id, region)
 | 
			
		||||
  return video
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
def itag_to_metadata?(itag : JSON::Any)
 | 
			
		||||
  return VIDEO_FORMATS[itag.to_s]?
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
def process_continuation(query, plid, id)
 | 
			
		||||
  continuation = nil
 | 
			
		||||
  if plid
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										116
									
								
								src/invidious/videos/formats.cr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								src/invidious/videos/formats.cr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
module Invidious::Videos::Formats
 | 
			
		||||
  def self.itag_to_metadata?(itag : JSON::Any)
 | 
			
		||||
    return FORMATS[itag.to_s]?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # See https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L380-#L476
 | 
			
		||||
  private FORMATS = {
 | 
			
		||||
    "5"  => {"ext" => "flv", "width" => 400, "height" => 240, "acodec" => "mp3", "abr" => 64, "vcodec" => "h263"},
 | 
			
		||||
    "6"  => {"ext" => "flv", "width" => 450, "height" => 270, "acodec" => "mp3", "abr" => 64, "vcodec" => "h263"},
 | 
			
		||||
    "13" => {"ext" => "3gp", "acodec" => "aac", "vcodec" => "mp4v"},
 | 
			
		||||
    "17" => {"ext" => "3gp", "width" => 176, "height" => 144, "acodec" => "aac", "abr" => 24, "vcodec" => "mp4v"},
 | 
			
		||||
    "18" => {"ext" => "mp4", "width" => 640, "height" => 360, "acodec" => "aac", "abr" => 96, "vcodec" => "h264"},
 | 
			
		||||
    "22" => {"ext" => "mp4", "width" => 1280, "height" => 720, "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
    "34" => {"ext" => "flv", "width" => 640, "height" => 360, "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
    "35" => {"ext" => "flv", "width" => 854, "height" => 480, "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
 | 
			
		||||
    "36" => {"ext" => "3gp", "width" => 320, "acodec" => "aac", "vcodec" => "mp4v"},
 | 
			
		||||
    "37" => {"ext" => "mp4", "width" => 1920, "height" => 1080, "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
    "38" => {"ext" => "mp4", "width" => 4096, "height" => 3072, "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
    "43" => {"ext" => "webm", "width" => 640, "height" => 360, "acodec" => "vorbis", "abr" => 128, "vcodec" => "vp8"},
 | 
			
		||||
    "44" => {"ext" => "webm", "width" => 854, "height" => 480, "acodec" => "vorbis", "abr" => 128, "vcodec" => "vp8"},
 | 
			
		||||
    "45" => {"ext" => "webm", "width" => 1280, "height" => 720, "acodec" => "vorbis", "abr" => 192, "vcodec" => "vp8"},
 | 
			
		||||
    "46" => {"ext" => "webm", "width" => 1920, "height" => 1080, "acodec" => "vorbis", "abr" => 192, "vcodec" => "vp8"},
 | 
			
		||||
    "59" => {"ext" => "mp4", "width" => 854, "height" => 480, "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
    "78" => {"ext" => "mp4", "width" => 854, "height" => 480, "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
 | 
			
		||||
    # 3D videos
 | 
			
		||||
    "82"  => {"ext" => "mp4", "height" => 360, "format" => "3D", "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
    "83"  => {"ext" => "mp4", "height" => 480, "format" => "3D", "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
    "84"  => {"ext" => "mp4", "height" => 720, "format" => "3D", "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
    "85"  => {"ext" => "mp4", "height" => 1080, "format" => "3D", "acodec" => "aac", "abr" => 192, "vcodec" => "h264"},
 | 
			
		||||
    "100" => {"ext" => "webm", "height" => 360, "format" => "3D", "acodec" => "vorbis", "abr" => 128, "vcodec" => "vp8"},
 | 
			
		||||
    "101" => {"ext" => "webm", "height" => 480, "format" => "3D", "acodec" => "vorbis", "abr" => 192, "vcodec" => "vp8"},
 | 
			
		||||
    "102" => {"ext" => "webm", "height" => 720, "format" => "3D", "acodec" => "vorbis", "abr" => 192, "vcodec" => "vp8"},
 | 
			
		||||
 | 
			
		||||
    # Apple HTTP Live Streaming
 | 
			
		||||
    "91"  => {"ext" => "mp4", "height" => 144, "format" => "HLS", "acodec" => "aac", "abr" => 48, "vcodec" => "h264"},
 | 
			
		||||
    "92"  => {"ext" => "mp4", "height" => 240, "format" => "HLS", "acodec" => "aac", "abr" => 48, "vcodec" => "h264"},
 | 
			
		||||
    "93"  => {"ext" => "mp4", "height" => 360, "format" => "HLS", "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
    "94"  => {"ext" => "mp4", "height" => 480, "format" => "HLS", "acodec" => "aac", "abr" => 128, "vcodec" => "h264"},
 | 
			
		||||
    "95"  => {"ext" => "mp4", "height" => 720, "format" => "HLS", "acodec" => "aac", "abr" => 256, "vcodec" => "h264"},
 | 
			
		||||
    "96"  => {"ext" => "mp4", "height" => 1080, "format" => "HLS", "acodec" => "aac", "abr" => 256, "vcodec" => "h264"},
 | 
			
		||||
    "132" => {"ext" => "mp4", "height" => 240, "format" => "HLS", "acodec" => "aac", "abr" => 48, "vcodec" => "h264"},
 | 
			
		||||
    "151" => {"ext" => "mp4", "height" => 72, "format" => "HLS", "acodec" => "aac", "abr" => 24, "vcodec" => "h264"},
 | 
			
		||||
 | 
			
		||||
    # DASH mp4 video
 | 
			
		||||
    "133" => {"ext" => "mp4", "height" => 240, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
    "134" => {"ext" => "mp4", "height" => 360, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
    "135" => {"ext" => "mp4", "height" => 480, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
    "136" => {"ext" => "mp4", "height" => 720, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
    "137" => {"ext" => "mp4", "height" => 1080, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
    "138" => {"ext" => "mp4", "format" => "DASH video", "vcodec" => "h264"}, # Height can vary (https://github.com/ytdl-org/youtube-dl/issues/4559)
 | 
			
		||||
    "160" => {"ext" => "mp4", "height" => 144, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
    "212" => {"ext" => "mp4", "height" => 480, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
    "264" => {"ext" => "mp4", "height" => 1440, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
    "298" => {"ext" => "mp4", "height" => 720, "format" => "DASH video", "vcodec" => "h264", "fps" => 60},
 | 
			
		||||
    "299" => {"ext" => "mp4", "height" => 1080, "format" => "DASH video", "vcodec" => "h264", "fps" => 60},
 | 
			
		||||
    "266" => {"ext" => "mp4", "height" => 2160, "format" => "DASH video", "vcodec" => "h264"},
 | 
			
		||||
 | 
			
		||||
    # Dash mp4 audio
 | 
			
		||||
    "139" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "abr" => 48, "container" => "m4a_dash"},
 | 
			
		||||
    "140" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "abr" => 128, "container" => "m4a_dash"},
 | 
			
		||||
    "141" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "abr" => 256, "container" => "m4a_dash"},
 | 
			
		||||
    "256" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "container" => "m4a_dash"},
 | 
			
		||||
    "258" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "aac", "container" => "m4a_dash"},
 | 
			
		||||
    "325" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "dtse", "container" => "m4a_dash"},
 | 
			
		||||
    "328" => {"ext" => "m4a", "format" => "DASH audio", "acodec" => "ec-3", "container" => "m4a_dash"},
 | 
			
		||||
 | 
			
		||||
    # Dash webm
 | 
			
		||||
    "167" => {"ext" => "webm", "height" => 360, "width" => 640, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
    "168" => {"ext" => "webm", "height" => 480, "width" => 854, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
    "169" => {"ext" => "webm", "height" => 720, "width" => 1280, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
    "170" => {"ext" => "webm", "height" => 1080, "width" => 1920, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
    "218" => {"ext" => "webm", "height" => 480, "width" => 854, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
    "219" => {"ext" => "webm", "height" => 480, "width" => 854, "format" => "DASH video", "container" => "webm", "vcodec" => "vp8"},
 | 
			
		||||
    "278" => {"ext" => "webm", "height" => 144, "format" => "DASH video", "container" => "webm", "vcodec" => "vp9"},
 | 
			
		||||
    "242" => {"ext" => "webm", "height" => 240, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    "243" => {"ext" => "webm", "height" => 360, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    "244" => {"ext" => "webm", "height" => 480, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    "245" => {"ext" => "webm", "height" => 480, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    "246" => {"ext" => "webm", "height" => 480, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    "247" => {"ext" => "webm", "height" => 720, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    "248" => {"ext" => "webm", "height" => 1080, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    "271" => {"ext" => "webm", "height" => 1440, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    # itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug)
 | 
			
		||||
    "272" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    "302" => {"ext" => "webm", "height" => 720, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "303" => {"ext" => "webm", "height" => 1080, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "308" => {"ext" => "webm", "height" => 1440, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "313" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9"},
 | 
			
		||||
    "315" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "330" => {"ext" => "webm", "height" => 144, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "331" => {"ext" => "webm", "height" => 240, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "332" => {"ext" => "webm", "height" => 360, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "333" => {"ext" => "webm", "height" => 480, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "334" => {"ext" => "webm", "height" => 720, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "335" => {"ext" => "webm", "height" => 1080, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "336" => {"ext" => "webm", "height" => 1440, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
    "337" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
 | 
			
		||||
 | 
			
		||||
    # Dash webm audio
 | 
			
		||||
    "171" => {"ext" => "webm", "acodec" => "vorbis", "format" => "DASH audio", "abr" => 128},
 | 
			
		||||
    "172" => {"ext" => "webm", "acodec" => "vorbis", "format" => "DASH audio", "abr" => 256},
 | 
			
		||||
 | 
			
		||||
    # Dash webm audio with opus inside
 | 
			
		||||
    "249" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 50},
 | 
			
		||||
    "250" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 70},
 | 
			
		||||
    "251" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 160},
 | 
			
		||||
 | 
			
		||||
    # av01 video only formats sometimes served with "unknown" codecs
 | 
			
		||||
    "394" => {"ext" => "mp4", "height" => 144, "vcodec" => "av01.0.05M.08"},
 | 
			
		||||
    "395" => {"ext" => "mp4", "height" => 240, "vcodec" => "av01.0.05M.08"},
 | 
			
		||||
    "396" => {"ext" => "mp4", "height" => 360, "vcodec" => "av01.0.05M.08"},
 | 
			
		||||
    "397" => {"ext" => "mp4", "height" => 480, "vcodec" => "av01.0.05M.08"},
 | 
			
		||||
  }
 | 
			
		||||
end
 | 
			
		||||
		Reference in New Issue
	
	Block a user