Libraryless. Click here for Pure Java version (2035L/15K/47K).
1 | !752 |
2 | |
3 | p { |
4 | S url = getIt("https://www.youtube.com/watch?v=4GuqB1BQVr4"); |
5 | print("URL: " + url); |
6 | print("Size: " + getURLSizeByHEAD(url)); |
7 | } |
8 | |
9 | sclass Meta { |
10 | public String num; |
11 | public String type; |
12 | public String ext; |
13 | |
14 | Meta(String num, String ext, String type) { |
15 | this.num = num; |
16 | this.ext = ext; |
17 | this.type = type; |
18 | } |
19 | } |
20 | |
21 | sclass Video { |
22 | public String ext = ""; |
23 | public String type = ""; |
24 | public String url = ""; |
25 | |
26 | Video(String ext, String type, String url) { |
27 | this.ext = ext; |
28 | this.type = type; |
29 | this.url = url; |
30 | } |
31 | } |
32 | |
33 | static L<Video> getStreamingUrisFromYouTubePage(String ytUrl) |
34 | throws IOException { |
35 | if (ytUrl == null) { |
36 | return null; |
37 | } |
38 | |
39 | // Remove any query params in query string after the watch?v=<vid> in |
40 | // e.g. |
41 | // http://www.youtube.com/watch?v=0RUPACpf8Vs&feature=youtube_gdata_player |
42 | int andIdx = ytUrl.indexOf('&'); |
43 | if (andIdx >= 0) { |
44 | ytUrl = ytUrl.substring(0, andIdx); |
45 | } |
46 | |
47 | // Get the HTML response |
48 | String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1)"; |
49 | URL tURL = new URL(ytUrl); |
50 | URLConnection conn = tURL.openConnection(); |
51 | conn.setRequestProperty("User-Agent", userAgent); |
52 | loadPage_anonymous = true; |
53 | S html = loadPage(conn, tURL); |
54 | html = html.replace("\\u0026", "&"); |
55 | |
56 | print("[[\n" + html + "\n]]\n"); |
57 | |
58 | // Parse the HTML response and extract the streaming URIs |
59 | if (html.contains("verify-age-thumb")) { |
60 | print("YouTube is asking for age verification. We can't handle that sorry."); |
61 | return null; |
62 | } |
63 | |
64 | if (html.contains("das_captcha")) { |
65 | print("Captcha found, please try with different IP address."); |
66 | return null; |
67 | } |
68 | |
69 | Pattern p = Pattern.compile("stream_map\": ?\"(.*?)?\""); |
70 | // Pattern p = Pattern.compile("/stream_map=(.[^&]*?)\"/"); |
71 | Matcher m = p.matcher(html); |
72 | List<String> matches = new ArrayList<String>(); |
73 | while (m.find()) { |
74 | matches.add(m.group()); |
75 | } |
76 | |
77 | if (matches.size() != 1) { |
78 | print("Found zero or too many stream maps (" + l(matches) + ")"); |
79 | return null; |
80 | } |
81 | |
82 | String urls[] = matches.get(0).split(","); |
83 | print("urls found: " + l(urls)); |
84 | psl(urls); |
85 | HashMap<String, String> foundArray = new HashMap<String, String>(); |
86 | for (String ppUrl : urls) { |
87 | Map<S, S> map = decodeHQuery(ppUrl); |
88 | print("Map: " + structure(map)); |
89 | |
90 | S itag = map.get("itag"); |
91 | S um = map.get("url"); |
92 | |
93 | if (itag != null && um != null) { |
94 | foundArray.put(itag, um); |
95 | } |
96 | } |
97 | |
98 | if (foundArray.size() == 0) { |
99 | print("Couldn't find any URLs and corresponding signatures"); |
100 | return null; |
101 | } |
102 | |
103 | HashMap<String, Meta> typeMap = new HashMap<String, Meta>(); |
104 | typeMap.put("13", new Meta("13", "3GP", "Low Quality - 176x144")); |
105 | typeMap.put("17", new Meta("17", "3GP", "Medium Quality - 176x144")); |
106 | typeMap.put("36", new Meta("36", "3GP", "High Quality - 320x240")); |
107 | typeMap.put("5", new Meta("5", "FLV", "Low Quality - 400x226")); |
108 | typeMap.put("6", new Meta("6", "FLV", "Medium Quality - 640x360")); |
109 | typeMap.put("34", new Meta("34", "FLV", "Medium Quality - 640x360")); |
110 | typeMap.put("35", new Meta("35", "FLV", "High Quality - 854x480")); |
111 | typeMap.put("43", new Meta("43", "WEBM", "Low Quality - 640x360")); |
112 | typeMap.put("44", new Meta("44", "WEBM", "Medium Quality - 854x480")); |
113 | typeMap.put("45", new Meta("45", "WEBM", "High Quality - 1280x720")); |
114 | typeMap.put("18", new Meta("18", "MP4", "Medium Quality - 480x360")); |
115 | typeMap.put("22", new Meta("22", "MP4", "High Quality - 1280x720")); |
116 | typeMap.put("37", new Meta("37", "MP4", "High Quality - 1920x1080")); |
117 | typeMap.put("33", new Meta("38", "MP4", "High Quality - 4096x230")); |
118 | |
119 | new L<Video> videos; |
120 | |
121 | for (String format : typeMap.keySet()) { |
122 | Meta meta = typeMap.get(format); |
123 | |
124 | if (foundArray.containsKey(format)) { |
125 | Video newVideo = new Video(meta.ext, meta.type, |
126 | foundArray.get(format)); |
127 | videos.add(newVideo); |
128 | print("YouTube Video streaming details: ext:" + newVideo.ext |
129 | + ", type:" + newVideo.type + ", url:" + newVideo.url); |
130 | } |
131 | } |
132 | |
133 | return videos; |
134 | } |
135 | |
136 | static S getIt(S url) { |
137 | try { |
138 | L<Video> videos = getStreamingUrisFromYouTubePage(url); |
139 | if (videos != null && !videos.isEmpty()) { |
140 | String retVidUrl = null; |
141 | for (Video video : videos) { |
142 | if (video.ext.toLowerCase().contains("mp4") |
143 | && video.type.toLowerCase().contains("medium")) { |
144 | retVidUrl = video.url; |
145 | break; |
146 | } |
147 | } |
148 | if (retVidUrl == null) { |
149 | for (Video video : videos) { |
150 | if (video.ext.toLowerCase().contains("3gp") |
151 | && video.type.toLowerCase().contains( |
152 | "medium")) { |
153 | retVidUrl = video.url; |
154 | break; |
155 | |
156 | } |
157 | } |
158 | } |
159 | if (retVidUrl == null) { |
160 | |
161 | for (Video video : videos) { |
162 | if (video.ext.toLowerCase().contains("mp4") |
163 | && video.type.toLowerCase().contains("low")) { |
164 | retVidUrl = video.url; |
165 | break; |
166 | |
167 | } |
168 | } |
169 | } |
170 | if (retVidUrl == null) { |
171 | for (Video video : videos) { |
172 | if (video.ext.toLowerCase().contains("3gp") |
173 | && video.type.toLowerCase().contains("low")) { |
174 | retVidUrl = video.url; |
175 | break; |
176 | } |
177 | } |
178 | } |
179 | |
180 | return retVidUrl; |
181 | } |
182 | } catch (Exception e) { |
183 | fail("Couldn't get YouTube streaming URL", e); |
184 | } |
185 | fail("Couldn't get stream URI for " + url); |
186 | } |
From: http://stackoverflow.com/questions/15240011/get-the-download-url-for-youtube-video-android-java
download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, ddnzoavkxhuk, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
ID | Author/Program | Comment | Date |
---|---|---|---|
1265 | stefan | Gets an URL, but that can't be downloaded | 2016-07-26 14:42:50 |
Snippet ID: | #1003713 |
Snippet name: | Try getting YouTube MP4 URL [possibly not working] |
Eternal ID of this version: | #1003713/2 |
Text MD5: | 91df8fc47141179f7fcde0db8c1f5ad7 |
Transpilation MD5: | 01d3d017cee80f14b4479ce2a8db8adc |
Author: | stefan |
Category: | javax / networking |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2017-02-03 01:22:10 |
Source code size: | 6442 bytes / 186 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 950 / 1001 |
Version history: | 1 change(s) |
Referenced in: | [show references] |