mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-10-31 12:42:09 +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/helpers/*" | ||||||
| require "./invidious/yt_backend/*" | require "./invidious/yt_backend/*" | ||||||
| require "./invidious/frontend/*" | require "./invidious/frontend/*" | ||||||
|  | require "./invidious/videos/*" | ||||||
|  |  | ||||||
| require "./invidious/*" | require "./invidious/*" | ||||||
| require "./invidious/channels/*" | require "./invidious/channels/*" | ||||||
|   | |||||||
| @@ -50,7 +50,7 @@ module Invidious::Frontend::WatchPage | |||||||
|       video_assets.full_videos.each do |option| |       video_assets.full_videos.each do |option| | ||||||
|         mimetype = option["mimeType"].as_s.split(";")[0] |         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 |         value = {"itag": option["itag"], "ext": mimetype.split("/")[1]}.to_json | ||||||
|  |  | ||||||
|   | |||||||
| @@ -131,117 +131,6 @@ CAPTION_LANGUAGES = { | |||||||
|   "Zulu", |   "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 | struct VideoPreferences | ||||||
|   include JSON::Serializable |   include JSON::Serializable | ||||||
|  |  | ||||||
| @@ -390,7 +279,7 @@ struct Video | |||||||
|               json.field "lmt", fmt["lastModified"] |               json.field "lmt", fmt["lastModified"] | ||||||
|               json.field "projectionType", fmt["projectionType"] |               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 |                 fps = fmt_info["fps"]?.try &.to_i || fmt["fps"]?.try &.as_i || 30 | ||||||
|                 json.field "fps", fps |                 json.field "fps", fps | ||||||
|                 json.field "container", fmt_info["ext"] |                 json.field "container", fmt_info["ext"] | ||||||
| @@ -437,7 +326,7 @@ struct Video | |||||||
|               json.field "type", fmt["mimeType"] |               json.field "type", fmt["mimeType"] | ||||||
|               json.field "quality", fmt["quality"] |               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 |               if fmt_info | ||||||
|                 fps = fmt_info["fps"]?.try &.to_i || fmt["fps"]?.try &.as_i || 30 |                 fps = fmt_info["fps"]?.try &.to_i || fmt["fps"]?.try &.as_i || 30 | ||||||
|                 json.field "fps", fps |                 json.field "fps", fps | ||||||
| @@ -1164,10 +1053,6 @@ def fetch_video(id, region) | |||||||
|   return video |   return video | ||||||
| end | end | ||||||
|  |  | ||||||
| def itag_to_metadata?(itag : JSON::Any) |  | ||||||
|   return VIDEO_FORMATS[itag.to_s]? |  | ||||||
| end |  | ||||||
|  |  | ||||||
| def process_continuation(query, plid, id) | def process_continuation(query, plid, id) | ||||||
|   continuation = nil |   continuation = nil | ||||||
|   if plid |   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
	 Samantaz Fox
					Samantaz Fox