@@ -89,63 +89,105 @@ public abstract class YouTubeExtractor extends AsyncTask<String, Void, SparseArr
89
89
90
90
static {
91
91
// http://en.wikipedia.org/wiki/YouTube#Quality_and_formats
92
-
92
+ // https://github.com/rg3/youtube-dl/blob/40a051fa9f48000f311f243c40e3cae588420738/youtube_dl/extractor/youtube.py#L379
93
+ // https://github.com/jdf76/plugin.video.youtube/blob/bf9a361d44f4841192233ef8a4411dc74a538ec0/resources/lib/youtube_plugin/youtube/helper/video_info.py#L22
93
94
// Video and Audio
94
- FORMAT_MAP .put (17 , new Format (17 , "3gp" , 144 , Format .VCodec .MPEG4 , Format .ACodec .AAC , 24 , false ));
95
- FORMAT_MAP .put (36 , new Format (36 , "3gp" , 240 , Format .VCodec .MPEG4 , Format .ACodec .AAC , 32 , false ));
96
95
FORMAT_MAP .put (5 , new Format (5 , "flv" , 240 , Format .VCodec .H263 , Format .ACodec .MP3 , 64 , false ));
97
- FORMAT_MAP .put (43 , new Format (43 , "webm" , 360 , Format .VCodec .VP8 , Format .ACodec .VORBIS , 128 , false ));
96
+ FORMAT_MAP .put (6 , new Format (6 , "flv" , 270 , Format .VCodec .H263 , Format .ACodec .MP3 , 64 , false ));
97
+ FORMAT_MAP .put (17 , new Format (17 , "3gp" , 144 , Format .VCodec .MPEG4 , Format .ACodec .AAC , 24 , false ));
98
98
FORMAT_MAP .put (18 , new Format (18 , "mp4" , 360 , Format .VCodec .H264 , Format .ACodec .AAC , 96 , false ));
99
99
FORMAT_MAP .put (22 , new Format (22 , "mp4" , 720 , Format .VCodec .H264 , Format .ACodec .AAC , 192 , false ));
100
+ FORMAT_MAP .put (34 , new Format (34 , "3gp" , 360 , Format .VCodec .H264 , Format .ACodec .AAC , 128 , false ));
101
+ FORMAT_MAP .put (35 , new Format (35 , "flv" , 480 , Format .VCodec .H264 , Format .ACodec .AAC , 128 , false ));
102
+ FORMAT_MAP .put (36 , new Format (36 , "3gp" , 240 , Format .VCodec .MPEG4 , Format .ACodec .AAC , 32 , false ));
103
+ FORMAT_MAP .put (37 , new Format (37 , "mp4" , 1080 , Format .VCodec .H264 , Format .ACodec .AAC , 192 , false ));
104
+ FORMAT_MAP .put (38 , new Format (38 , "mp4" , 3072 , Format .VCodec .H264 , Format .ACodec .AAC , 192 , false ));
105
+ FORMAT_MAP .put (43 , new Format (43 , "webm" , 360 , Format .VCodec .VP8 , Format .ACodec .VORBIS , 128 , false ));
106
+ FORMAT_MAP .put (44 , new Format (44 , "webm" , 480 , Format .VCodec .VP8 , Format .ACodec .VORBIS , 128 , false ));
107
+ FORMAT_MAP .put (45 , new Format (45 , "webm" , 720 , Format .VCodec .VP8 , Format .ACodec .VORBIS , 192 , false ));
108
+ FORMAT_MAP .put (46 , new Format (46 , "webm" , 1080 , Format .VCodec .VP8 , Format .ACodec .VORBIS , 192 , false ));
109
+ FORMAT_MAP .put (59 , new Format (59 , "mp4" , 480 , Format .VCodec .H264 , Format .ACodec .AAC , 128 , false ));
110
+ FORMAT_MAP .put (78 , new Format (78 , "mp4" , 480 , Format .VCodec .H264 , Format .ACodec .AAC , 128 , false ));
111
+
112
+ // 3D Videos
113
+ FORMAT_MAP .put (82 , new Format (82 , "mp4" , 360 , Format .VCodec .H264 , Format .ACodec .AAC , 128 , false ));
114
+ FORMAT_MAP .put (83 , new Format (83 , "mp4" , 480 , Format .VCodec .H264 , Format .ACodec .AAC , 128 , false ));
115
+ FORMAT_MAP .put (84 , new Format (84 , "mp4" , 720 , Format .VCodec .H264 , Format .ACodec .AAC , 192 , false ));
116
+ FORMAT_MAP .put (85 , new Format (85 , "mp4" , 1080 , Format .VCodec .H264 , Format .ACodec .AAC , 192 , false ));
117
+ FORMAT_MAP .put (100 , new Format (100 , "webm" , 360 , Format .VCodec .VP8 , Format .ACodec .VORBIS , 128 , false ));
118
+ FORMAT_MAP .put (101 , new Format (101 , "webm" , 480 , Format .VCodec .VP8 , Format .ACodec .VORBIS , 128 , false ));
119
+ FORMAT_MAP .put (102 , new Format (102 , "webm" , 720 , Format .VCodec .VP8 , Format .ACodec .VORBIS , 128 , false ));
120
+
121
+ // HLS Live Stream
122
+ FORMAT_MAP .put (91 , new Format (91 , "mp4" , 144 ,Format .VCodec .H264 , Format .ACodec .AAC , 48 , false , true ));
123
+ FORMAT_MAP .put (92 , new Format (92 , "mp4" , 240 ,Format .VCodec .H264 , Format .ACodec .AAC , 48 , false , true ));
124
+ FORMAT_MAP .put (93 , new Format (93 , "mp4" , 360 ,Format .VCodec .H264 , Format .ACodec .AAC , 128 , false , true ));
125
+ FORMAT_MAP .put (94 , new Format (94 , "mp4" , 480 ,Format .VCodec .H264 , Format .ACodec .AAC , 128 , false , true ));
126
+ FORMAT_MAP .put (95 , new Format (95 , "mp4" , 720 ,Format .VCodec .H264 , Format .ACodec .AAC , 256 , false , true ));
127
+ FORMAT_MAP .put (96 , new Format (96 , "mp4" , 1080 ,Format .VCodec .H264 , Format .ACodec .AAC , 256 , false , true ));
128
+ FORMAT_MAP .put (120 , new Format (120 , "flv" , 720 ,Format .VCodec .H264 , Format .ACodec .AAC , 128 , false , true ));
129
+ FORMAT_MAP .put (127 , new Format (127 , "ts" , 0 ,Format .VCodec .NONE , Format .ACodec .AAC , 96 , false , true ));
130
+ FORMAT_MAP .put (128 , new Format (128 , "ts" , 0 ,Format .VCodec .NONE , Format .ACodec .AAC , 96 , false , true ));
131
+ FORMAT_MAP .put (132 , new Format (132 , "mp4" , 240 ,Format .VCodec .H264 , Format .ACodec .AAC , 256 , false , true ));
132
+ FORMAT_MAP .put (151 , new Format (151 , "mp4" , 72 ,Format .VCodec .H264 , Format .ACodec .AAC , 256 , false , true ));
133
+ FORMAT_MAP .put (300 , new Format (300 , "ts" , 720 ,Format .VCodec .H264 , Format .ACodec .AAC , 128 , false , true ));
134
+ FORMAT_MAP .put (301 , new Format (301 , "ts" , 1080 ,Format .VCodec .H264 , Format .ACodec .AAC , 128 , false , true ));
100
135
101
136
// Dash Video
102
- FORMAT_MAP .put (160 , new Format (160 , "mp4" , 144 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
103
137
FORMAT_MAP .put (133 , new Format (133 , "mp4" , 240 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
104
138
FORMAT_MAP .put (134 , new Format (134 , "mp4" , 360 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
105
139
FORMAT_MAP .put (135 , new Format (135 , "mp4" , 480 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
106
140
FORMAT_MAP .put (136 , new Format (136 , "mp4" , 720 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
107
141
FORMAT_MAP .put (137 , new Format (137 , "mp4" , 1080 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
142
+ FORMAT_MAP .put (138 , new Format (138 , "mp4" , 0 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
143
+ FORMAT_MAP .put (160 , new Format (160 , "mp4" , 144 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
144
+ FORMAT_MAP .put (212 , new Format (212 , "mp4" , 480 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
108
145
FORMAT_MAP .put (264 , new Format (264 , "mp4" , 1440 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
109
146
FORMAT_MAP .put (266 , new Format (266 , "mp4" , 2160 , Format .VCodec .H264 , Format .ACodec .NONE , true ));
110
147
111
148
FORMAT_MAP .put (298 , new Format (298 , "mp4" , 720 , Format .VCodec .H264 , 60 , Format .ACodec .NONE , true ));
112
149
FORMAT_MAP .put (299 , new Format (299 , "mp4" , 1080 , Format .VCodec .H264 , 60 , Format .ACodec .NONE , true ));
113
150
114
151
// Dash Audio
152
+ FORMAT_MAP .put (139 , new Format (139 , "m4a" , Format .VCodec .NONE , Format .ACodec .AAC , 48 , true ));
115
153
FORMAT_MAP .put (140 , new Format (140 , "m4a" , Format .VCodec .NONE , Format .ACodec .AAC , 128 , true ));
116
154
FORMAT_MAP .put (141 , new Format (141 , "m4a" , Format .VCodec .NONE , Format .ACodec .AAC , 256 , true ));
117
- FORMAT_MAP .put (256 , new Format (256 , "m4a" , Format .VCodec .NONE , Format .ACodec .AAC , 192 , true ));
118
- FORMAT_MAP .put (258 , new Format (258 , "m4a" , Format .VCodec .NONE , Format .ACodec .AAC , 384 , true ));
155
+ FORMAT_MAP .put (256 , new Format (256 , "m4a" , Format .VCodec .NONE , Format .ACodec .AAC , 0 , true ));
156
+ FORMAT_MAP .put (258 , new Format (258 , "m4a" , Format .VCodec .NONE , Format .ACodec .AAC , 0 , true ));
119
157
120
158
// WEBM Dash Video
159
+ FORMAT_MAP .put (167 , new Format (167 , "webm" , 360 , Format .VCodec .VP8 , Format .ACodec .NONE , true ));
160
+ FORMAT_MAP .put (168 , new Format (168 , "webm" , 480 , Format .VCodec .VP8 , Format .ACodec .NONE , true ));
161
+ FORMAT_MAP .put (169 , new Format (169 , "webm" , 720 , Format .VCodec .VP8 , Format .ACodec .NONE , true ));
162
+ FORMAT_MAP .put (170 , new Format (170 , "webm" , 1080 , Format .VCodec .VP8 , Format .ACodec .NONE , true ));
163
+ FORMAT_MAP .put (218 , new Format (218 , "webm" , 480 , Format .VCodec .VP8 , Format .ACodec .NONE , true ));
164
+ FORMAT_MAP .put (219 , new Format (219 , "webm" , 480 , Format .VCodec .VP8 , Format .ACodec .NONE , true ));
121
165
FORMAT_MAP .put (278 , new Format (278 , "webm" , 144 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
122
166
FORMAT_MAP .put (242 , new Format (242 , "webm" , 240 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
123
167
FORMAT_MAP .put (243 , new Format (243 , "webm" , 360 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
124
168
FORMAT_MAP .put (244 , new Format (244 , "webm" , 480 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
169
+ FORMAT_MAP .put (245 , new Format (245 , "webm" , 480 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
170
+ FORMAT_MAP .put (246 , new Format (246 , "webm" , 480 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
125
171
FORMAT_MAP .put (247 , new Format (247 , "webm" , 720 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
126
172
FORMAT_MAP .put (248 , new Format (248 , "webm" , 1080 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
127
173
FORMAT_MAP .put (271 , new Format (271 , "webm" , 1440 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
174
+
175
+ // itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug)
176
+ FORMAT_MAP .put (272 , new Format (272 , "webm" , 2160 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
128
177
FORMAT_MAP .put (313 , new Format (313 , "webm" , 2160 , Format .VCodec .VP9 , Format .ACodec .NONE , true ));
129
178
130
179
FORMAT_MAP .put (302 , new Format (302 , "webm" , 720 , Format .VCodec .VP9 , 60 , Format .ACodec .NONE , true ));
131
- FORMAT_MAP .put (308 , new Format (308 , "webm" , 1440 , Format .VCodec .VP9 , 60 , Format .ACodec .NONE , true ));
132
180
FORMAT_MAP .put (303 , new Format (303 , "webm" , 1080 , Format .VCodec .VP9 , 60 , Format .ACodec .NONE , true ));
181
+ FORMAT_MAP .put (308 , new Format (308 , "webm" , 1440 , Format .VCodec .VP9 , 60 , Format .ACodec .NONE , true ));
133
182
FORMAT_MAP .put (315 , new Format (315 , "webm" , 2160 , Format .VCodec .VP9 , 60 , Format .ACodec .NONE , true ));
134
183
135
184
// WEBM Dash Audio
136
185
FORMAT_MAP .put (171 , new Format (171 , "webm" , Format .VCodec .NONE , Format .ACodec .VORBIS , 128 , true ));
186
+ FORMAT_MAP .put (172 , new Format (172 , "webm" , Format .VCodec .NONE , Format .ACodec .VORBIS , 256 , true ));
137
187
138
188
FORMAT_MAP .put (249 , new Format (249 , "webm" , Format .VCodec .NONE , Format .ACodec .OPUS , 48 , true ));
139
189
FORMAT_MAP .put (250 , new Format (250 , "webm" , Format .VCodec .NONE , Format .ACodec .OPUS , 64 , true ));
140
190
FORMAT_MAP .put (251 , new Format (251 , "webm" , Format .VCodec .NONE , Format .ACodec .OPUS , 160 , true ));
141
-
142
- // HLS Live Stream
143
- FORMAT_MAP .put (91 , new Format (91 , "mp4" , 144 ,Format .VCodec .H264 , Format .ACodec .AAC , 48 , false , true ));
144
- FORMAT_MAP .put (92 , new Format (92 , "mp4" , 240 ,Format .VCodec .H264 , Format .ACodec .AAC , 48 , false , true ));
145
- FORMAT_MAP .put (93 , new Format (93 , "mp4" , 360 ,Format .VCodec .H264 , Format .ACodec .AAC , 128 , false , true ));
146
- FORMAT_MAP .put (94 , new Format (94 , "mp4" , 480 ,Format .VCodec .H264 , Format .ACodec .AAC , 128 , false , true ));
147
- FORMAT_MAP .put (95 , new Format (95 , "mp4" , 720 ,Format .VCodec .H264 , Format .ACodec .AAC , 256 , false , true ));
148
- FORMAT_MAP .put (96 , new Format (96 , "mp4" , 1080 ,Format .VCodec .H264 , Format .ACodec .AAC , 256 , false , true ));
149
191
}
150
192
151
193
public YouTubeExtractor (@ NonNull Context con ) {
@@ -341,7 +383,7 @@ private SparseArray<YtFile> getStreamUrls() throws IOException, InterruptedExcep
341
383
if (mat2 .find ()) {
342
384
url = URLDecoder .decode (mat2 .group (1 ), "UTF-8" );
343
385
mat2 = patEncSig .matcher (cipher );
344
- if (mat2 .find ()) {
386
+ if (mat2 .find ()) {
345
387
sig = URLDecoder .decode (mat2 .group (1 ), "UTF-8" );
346
388
// fix issue #165
347
389
sig = sig .replace ("\\ u0026" , "&" );
0 commit comments