1package ytdl 2 3// Itag is a youtube is a static youtube video format 4type Itag struct { 5 Number int 6 Extension string 7 Resolution string 8 VideoEncoding string 9 AudioEncoding string 10 AudioBitrate int 11 FPS int // FPS are frames per second 12} 13 14func getItag(itag int) *Itag { 15 if itag < len(ITAGS) { 16 return ITAGS[itag] 17 } 18 return nil 19} 20 21// ITAGS is a map of all itags and their attributes 22var ITAGS = generateItags() 23 24func generateItags() (list []*Itag) { 25 list = make([]*Itag, 403) 26 27 add := func(itag Itag) { 28 list[itag.Number] = &itag 29 } 30 31 add(Itag{ 32 Number: 5, 33 Extension: "flv", 34 Resolution: "240p", 35 VideoEncoding: "Sorenson H.283", 36 AudioEncoding: "mp3", 37 AudioBitrate: 64, 38 }) 39 add(Itag{ 40 Number: 6, 41 Extension: "flv", 42 Resolution: "270p", 43 VideoEncoding: "Sorenson H.263", 44 AudioEncoding: "mp3", 45 AudioBitrate: 64, 46 }) 47 add(Itag{ 48 Number: 13, 49 Extension: "3gp", 50 VideoEncoding: "MPEG-4 Visual", 51 AudioEncoding: "aac", 52 }) 53 add(Itag{ 54 Number: 17, 55 Extension: "3gp", 56 Resolution: "144p", 57 VideoEncoding: "MPEG-4 Visual", 58 AudioEncoding: "aac", 59 AudioBitrate: 24, 60 }) 61 add(Itag{ 62 Number: 18, 63 Extension: "mp4", 64 Resolution: "360p", 65 VideoEncoding: "H.264", 66 AudioEncoding: "aac", 67 AudioBitrate: 96, 68 }) 69 add(Itag{ 70 Number: 22, 71 Extension: "mp4", 72 Resolution: "720p", 73 VideoEncoding: "H.264", 74 AudioEncoding: "aac", 75 AudioBitrate: 192, 76 }) 77 add(Itag{ 78 Number: 34, 79 Extension: "flv", 80 Resolution: "480p", 81 VideoEncoding: "H.264", 82 AudioEncoding: "aac", 83 AudioBitrate: 128, 84 }) 85 add(Itag{ 86 Number: 35, 87 Extension: "flv", 88 Resolution: "360p", 89 VideoEncoding: "H.264", 90 AudioEncoding: "aac", 91 AudioBitrate: 128, 92 }) 93 add(Itag{ 94 Number: 36, 95 Extension: "3gp", 96 Resolution: "240p", 97 VideoEncoding: "MPEG-4 Visual", 98 AudioEncoding: "aac", 99 AudioBitrate: 36, 100 }) 101 add(Itag{ 102 Number: 37, 103 Extension: "mp4", 104 Resolution: "1080p", 105 VideoEncoding: "H.264", 106 AudioEncoding: "aac", 107 AudioBitrate: 192, 108 }) 109 add(Itag{ 110 Number: 38, 111 Extension: "mp4", 112 Resolution: "3072p", 113 VideoEncoding: "H.264", 114 AudioEncoding: "aac", 115 AudioBitrate: 192, 116 }) 117 add(Itag{ 118 Number: 43, 119 Extension: "webm", 120 Resolution: "360p", 121 VideoEncoding: "VP8", 122 AudioEncoding: "vorbis", 123 AudioBitrate: 128, 124 }) 125 add(Itag{ 126 Number: 44, 127 Extension: "webm", 128 Resolution: "480p", 129 VideoEncoding: "VP8", 130 AudioEncoding: "vorbis", 131 AudioBitrate: 128, 132 }) 133 add(Itag{ 134 Number: 45, 135 Extension: "webm", 136 Resolution: "720p", 137 VideoEncoding: "VP8", 138 AudioEncoding: "vorbis", 139 AudioBitrate: 192, 140 }) 141 add(Itag{ 142 Number: 46, 143 Extension: "webm", 144 Resolution: "1080p", 145 VideoEncoding: "VP8", 146 AudioEncoding: "vorbis", 147 AudioBitrate: 192, 148 }) 149 add(Itag{ 150 Number: 82, 151 Extension: "mp4", 152 Resolution: "360p", 153 VideoEncoding: "H.264", 154 AudioBitrate: 96, 155 }) 156 add(Itag{ 157 Number: 83, 158 Extension: "mp4", 159 Resolution: "240p", 160 VideoEncoding: "H.264", 161 AudioEncoding: "aac", 162 AudioBitrate: 96, 163 }) 164 add(Itag{ 165 Number: 84, 166 Extension: "mp4", 167 Resolution: "720p", 168 VideoEncoding: "H.264", 169 AudioEncoding: "aac", 170 AudioBitrate: 192, 171 }) 172 add(Itag{ 173 Number: 85, 174 Extension: "mp4", 175 Resolution: "1080p", 176 VideoEncoding: "H.264", 177 AudioEncoding: "aac", 178 AudioBitrate: 192, 179 }) 180 add(Itag{ 181 Number: 100, 182 Extension: "webm", 183 Resolution: "360p", 184 VideoEncoding: "VP8", 185 AudioEncoding: "vorbis", 186 AudioBitrate: 128, 187 }) 188 add(Itag{ 189 Number: 101, 190 Extension: "webm", 191 Resolution: "360p", 192 VideoEncoding: "VP8", 193 AudioEncoding: "vorbis", 194 AudioBitrate: 192, 195 }) 196 add(Itag{ 197 Number: 102, 198 Extension: "webm", 199 Resolution: "720p", 200 VideoEncoding: "VP8", 201 AudioEncoding: "vorbis", 202 AudioBitrate: 192, 203 }) 204 205 // DASH (video only) 206 add(Itag{ 207 Number: 133, 208 Extension: "mp4", 209 Resolution: "240p", 210 VideoEncoding: "H.264", 211 }) 212 add(Itag{ 213 Number: 134, 214 Extension: "mp4", 215 Resolution: "360p", 216 VideoEncoding: "H.264", 217 }) 218 add(Itag{ 219 Number: 135, 220 Extension: "mp4", 221 Resolution: "480p", 222 VideoEncoding: "H.264", 223 }) 224 add(Itag{ 225 Number: 136, 226 Extension: "mp4", 227 Resolution: "720p", 228 VideoEncoding: "H.264", 229 }) 230 add(Itag{ 231 Number: 137, 232 Extension: "mp4", 233 Resolution: "1080p", 234 VideoEncoding: "H.264", 235 }) 236 add(Itag{ 237 Number: 138, 238 Extension: "mp4", 239 Resolution: "2160p", 240 VideoEncoding: "H.264", 241 }) 242 add(Itag{ 243 Number: 160, 244 Extension: "mp4", 245 Resolution: "144p", 246 VideoEncoding: "H.264", 247 }) 248 add(Itag{ 249 Number: 242, 250 Extension: "webm", 251 Resolution: "240p", 252 VideoEncoding: "VP9", 253 }) 254 add(Itag{ 255 Number: 243, 256 Extension: "webm", 257 Resolution: "360p", 258 VideoEncoding: "VP9", 259 }) 260 add(Itag{ 261 Number: 244, 262 Extension: "webm", 263 Resolution: "480p", 264 VideoEncoding: "VP9", 265 }) 266 add(Itag{ 267 Number: 247, 268 Extension: "webm", 269 Resolution: "720p", 270 VideoEncoding: "VP9", 271 }) 272 add(Itag{ 273 Number: 248, 274 Extension: "webm", 275 Resolution: "1080p", 276 VideoEncoding: "VP9", 277 AudioBitrate: 9, 278 }) 279 add(Itag{ 280 Number: 264, 281 Extension: "mp4", 282 Resolution: "1440p", 283 VideoEncoding: "H.264", 284 }) 285 add(Itag{ 286 Number: 266, 287 Extension: "mp4", 288 Resolution: "2160p", 289 VideoEncoding: "H.264", 290 }) 291 add(Itag{ 292 Number: 271, 293 Extension: "webm", 294 Resolution: "1440p", 295 VideoEncoding: "VP9", 296 }) 297 add(Itag{ 298 Number: 272, 299 Extension: "webm", 300 Resolution: "2160p", 301 VideoEncoding: "VP9", 302 }) 303 add(Itag{ 304 Number: 278, 305 Extension: "webm", 306 Resolution: "144p", 307 VideoEncoding: "VP9", 308 }) 309 add(Itag{ 310 Number: 298, 311 Extension: "mp4", 312 Resolution: "720p", 313 VideoEncoding: "H.264", 314 FPS: 60, 315 }) 316 add(Itag{ 317 Number: 299, 318 Extension: "mp4", 319 Resolution: "1080p", 320 VideoEncoding: "H.264", 321 FPS: 60, 322 }) 323 add(Itag{ 324 Number: 302, 325 Extension: "webm", 326 Resolution: "720p", 327 VideoEncoding: "VP9", 328 FPS: 60, 329 }) 330 add(Itag{ 331 Number: 303, 332 Extension: "webm", 333 Resolution: "1080p", 334 VideoEncoding: "VP9", 335 FPS: 60, 336 }) 337 add(Itag{ 338 Number: 308, 339 Extension: "webm", 340 Resolution: "1440p", 341 VideoEncoding: "VP9", 342 FPS: 60, 343 }) 344 add(Itag{ 345 Number: 313, 346 Extension: "webm", 347 Resolution: "2160p", 348 VideoEncoding: "VP9", 349 }) 350 add(Itag{ 351 Number: 315, 352 Extension: "webm", 353 Resolution: "2160p", 354 VideoEncoding: "VP9", 355 FPS: 60, 356 }) 357 358 // DASH (audio only) 359 add(Itag{ 360 Number: 139, 361 Extension: "mp4", 362 AudioEncoding: "aac", 363 AudioBitrate: 48, 364 }) 365 add(Itag{ 366 Number: 140, 367 Extension: "mp4", 368 AudioEncoding: "aac", 369 AudioBitrate: 128, 370 }) 371 add(Itag{ 372 Number: 141, 373 Extension: "mp4", 374 AudioEncoding: "aac", 375 AudioBitrate: 256, 376 }) 377 add(Itag{ 378 Number: 171, 379 Extension: "webm", 380 AudioEncoding: "vorbis", 381 AudioBitrate: 128, 382 }) 383 add(Itag{ 384 Number: 172, 385 Extension: "webm", 386 AudioEncoding: "vorbis", 387 AudioBitrate: 192, 388 }) 389 add(Itag{ 390 Number: 249, 391 Extension: "webm", 392 AudioEncoding: "opus", 393 AudioBitrate: 50, 394 }) 395 add(Itag{ 396 Number: 250, 397 Extension: "webm", 398 AudioEncoding: "opus", 399 AudioBitrate: 70, 400 }) 401 add(Itag{ 402 Number: 251, 403 Extension: "webm", 404 AudioEncoding: "opus", 405 AudioBitrate: 160, 406 }) 407 408 // Live streaming 409 add(Itag{ 410 Number: 92, 411 Extension: "ts", 412 Resolution: "240p", 413 VideoEncoding: "H.264", 414 AudioEncoding: "aac", 415 AudioBitrate: 48, 416 }) 417 add(Itag{ 418 Number: 93, 419 Extension: "ts", 420 Resolution: "480p", 421 VideoEncoding: "H.264", 422 AudioEncoding: "aac", 423 AudioBitrate: 128, 424 }) 425 add(Itag{ 426 Number: 94, 427 Extension: "ts", 428 Resolution: "720p", 429 VideoEncoding: "H.264", 430 AudioEncoding: "aac", 431 AudioBitrate: 128, 432 }) 433 add(Itag{ 434 Number: 95, 435 Extension: "ts", 436 Resolution: "1080p", 437 VideoEncoding: "H.264", 438 AudioEncoding: "aac", 439 AudioBitrate: 256, 440 }) 441 add(Itag{ 442 Number: 96, 443 Extension: "ts", 444 Resolution: "720p", 445 VideoEncoding: "H.264", 446 AudioEncoding: "aac", 447 AudioBitrate: 256, 448 }) 449 add(Itag{ 450 Number: 120, 451 Extension: "flv", 452 Resolution: "720p", 453 VideoEncoding: "H.264", 454 AudioEncoding: "aac", 455 AudioBitrate: 128, 456 }) 457 add(Itag{ 458 Number: 127, 459 Extension: "ts", 460 AudioEncoding: "aac", 461 AudioBitrate: 96, 462 }) 463 add(Itag{ 464 Number: 128, 465 Extension: "ts", 466 AudioEncoding: "aac", 467 AudioBitrate: 96, 468 }) 469 add(Itag{ 470 Number: 132, 471 Extension: "ts", 472 Resolution: "240p", 473 VideoEncoding: "H.264", 474 AudioEncoding: "aac", 475 AudioBitrate: 48, 476 }) 477 add(Itag{ 478 Number: 151, 479 Extension: "ts", 480 Resolution: "720p", 481 VideoEncoding: "H.264", 482 AudioEncoding: "aac", 483 AudioBitrate: 24, 484 }) 485 486 add(Itag{ 487 Number: 394, 488 Extension: "mp4", 489 Resolution: "144p", 490 VideoEncoding: "AV1", 491 }) 492 add(Itag{ 493 Number: 395, 494 Extension: "mp4", 495 Resolution: "240p", 496 VideoEncoding: "AV1", 497 }) 498 add(Itag{ 499 Number: 396, 500 Extension: "mp4", 501 Resolution: "360p", 502 VideoEncoding: "AV1", 503 }) 504 add(Itag{ 505 Number: 397, 506 Extension: "mp4", 507 Resolution: "480p", 508 VideoEncoding: "AV1", 509 }) 510 add(Itag{ 511 Number: 398, 512 Extension: "mp4", 513 Resolution: "720p", 514 VideoEncoding: "AV1", 515 }) 516 add(Itag{ 517 Number: 399, 518 Extension: "mp4", 519 Resolution: "1080p", 520 VideoEncoding: "AV1", 521 }) 522 add(Itag{ 523 Number: 400, 524 Extension: "mp4", 525 Resolution: "1440p", 526 VideoEncoding: "AV1", 527 }) 528 add(Itag{ 529 Number: 401, 530 Extension: "mp4", 531 Resolution: "2160p", 532 VideoEncoding: "AV1", 533 }) 534 add(Itag{ 535 Number: 402, 536 Extension: "mp4", 537 Resolution: "2880p", 538 VideoEncoding: "AV1", 539 }) 540 541 return 542} 543