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