source: titan/mediathek/javaparser/youtube.src/src/gs/youtube/Client.java.save @ 38391

Last change on this file since 38391 was 38391, checked in by obi, 4 years ago

add java server parser youtube / filmon

File size: 11.7 KB
Line 
1package gs.youtube;
2
3import com.google.api.client.http.HttpRequest;
4import com.google.api.client.http.HttpRequestInitializer;
5import com.google.api.client.http.HttpTransport;
6import com.google.api.client.http.javanet.NetHttpTransport;
7import com.google.api.client.json.JsonFactory;
8import com.google.api.client.json.jackson2.JacksonFactory;
9import com.google.api.client.util.Joiner;
10import com.google.api.services.youtube.YouTube;
11import com.google.api.services.youtube.model.*;
12
13import javax.net.ssl.HttpsURLConnection;
14import java.io.*;
15import java.net.URL;
16import java.util.ArrayList;
17import java.util.Iterator;
18import java.util.List;
19
20/**
21 * Created by swiatek on 17.08.2015.
22 */
23public class Client {
24        static class VideoInfo {
25                String id;
26                String title;
27                String thumbnail;
28                String streamUrl;
29                String category;
30        }
31
32        private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
33        private static final JsonFactory JSON_FACTORY = new JacksonFactory();
34        private static final String API_KEY = "AIzaSyDxUusIumLmhHCzDZbKPJMK_5pas8WDD_4";
35        private static final long MAX_RESULTS = 50;
36
37        private static void guideCategories(String region, String lang) throws IOException {
38                YouTube youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpRequestInitializer() {
39                        public void initialize(HttpRequest request) throws IOException {
40                        }
41                }).setApplicationName("titan").build();
42
43                YouTube.GuideCategories.List categories = youtube.guideCategories().list("id,snippet");
44                categories.setKey(API_KEY);
45                categories.setRegionCode(region);
46                categories.setHl(lang);
47
48                GuideCategoryListResponse response = categories.execute();
49
50                for (GuideCategory cat : response.getItems()) {
51                        System.out.println("id=" + cat.getId() + ", kind=" + cat.getKind() + ", snippet=" + cat.getSnippet());
52                }
53        }
54
55        private static List<VideoInfo> mostPopularByCategory(String region, String lang) throws IOException {
56                YouTube youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpRequestInitializer() {
57                        public void initialize(HttpRequest request) throws IOException {
58                        }
59                }).setApplicationName("titan").build();
60
61                YouTube.VideoCategories.List categories = youtube.videoCategories().list("id,snippet");
62                categories.setKey(API_KEY);
63                categories.setRegionCode(region);
64                categories.setHl(lang);
65
66                VideoCategoryListResponse response = categories.execute();
67
68                List<VideoInfo> videos = new ArrayList<>();
69
70                String category;
71
72                for (VideoCategory cat : response.getItems()) {
73
74                        System.out.println("id=" + cat.getId() + ", kind=" + cat.getKind() + ", snippet=" + cat.getSnippet());
75
76                        if (Boolean.FALSE.equals(cat.getSnippet().getAssignable())) {
77                                //continue;
78                        }
79
80                        category = cat.getSnippet().getTitle();
81
82                        YouTube.Videos.List listVideosRequest = youtube.videos().list("id,snippet");
83                        listVideosRequest.setKey(API_KEY);
84                        listVideosRequest.setRegionCode(region).setChart("mostPopular").setVideoCategoryId(cat.getId());
85                        listVideosRequest.setMaxResults(MAX_RESULTS);
86                        VideoListResponse listResponse = listVideosRequest.execute();
87
88                        for (Video v: listResponse.getItems()) {
89
90                                VideoInfo info = new VideoInfo();
91                                info.category = category;
92                                info.id = v.getId();
93
94                                info.title = v.getSnippet().getTitle();
95
96                                videos.add(info);
97
98                                ThumbnailDetails thumbnails = v.getSnippet().getThumbnails();
99
100                                if (thumbnails != null) {
101                                        Thumbnail thumbnail = thumbnails.getHigh();
102
103                                        if (thumbnail == null) {
104                                                thumbnail = thumbnails.getMedium();
105
106                                                if (thumbnail == null) {
107                                                        thumbnail = thumbnails.getStandard();
108                                                }
109                                        }
110
111                                        if (thumbnail != null) {
112                                                info.thumbnail = thumbnail.getUrl();
113                                        }
114                                }
115                        }
116                }
117
118                System.out.println("Total: " + videos.size());
119
120                long t = System.currentTimeMillis();
121
122                for (VideoInfo info : videos) {
123                        try {
124                                info.streamUrl = getStreamUrlFromVideoId(info.id);
125                        } catch (IOException e) {
126                                e.printStackTrace();
127                        }
128                }
129
130                long t2 = System.currentTimeMillis();
131                System.out.println("Process time (ms): " + (t2 - t));
132
133                return videos;
134        }
135
136        private static String getStreamUrlFromContent(String line) {
137
138                String res = null;
139
140                if (line == null) {
141                        return res;
142                }
143
144                String token =  "url_encoded_fmt_stream_map\":\"";
145
146                int pos = line.indexOf(token);
147
148                if (pos != -1) {
149                        line = line.substring(pos + token.length());
150
151                        pos = line.indexOf('"');
152
153                        if (pos != -1) {
154                                line = line.substring(0, pos);
155                        }
156                }
157
158                List<String> parts = new ArrayList<>();
159
160                String delim = "\\u0026";
161
162                pos = line.indexOf(delim);
163
164                while (pos != -1) {
165                        parts.add(line.substring(0, pos));
166                        line = line.substring(pos + delim.length());
167                        pos = line.indexOf(delim);
168                }
169
170                parts.add(line);
171
172                String urlToken = "url=";
173
174                for (String s : parts) {
175                        if (s.startsWith(urlToken)) {
176                                res = s.substring(urlToken.length());
177                                break;
178                        }
179                }
180
181                if (res != null) {
182                        res = res.replaceAll("%3A", ":").replaceAll("%2F", "/").replaceAll("%3F", "?").replaceAll("%26", "&").replaceAll("%3D", "=").replaceAll("%25", "%");
183                }
184
185                return res;
186        }
187
188        private static String getStreamUrlFromVideoId(String id) throws IOException {
189
190                String streamUrl;
191                String streamLine = null;
192
193                try {
194                        URL url = new URL("https://www.youtube.com/watch?v=" + id);
195                        HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
196
197
198                        try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
199                                String line = br.readLine();
200
201                                while (line != null) {
202
203                                        if (line.contains("videoplayback")) {
204                                                streamLine = line;
205                                                break;
206                                        }
207
208                                        line = br.readLine();
209                                }
210                        }
211                } finally {
212
213                }
214
215                streamUrl = getStreamUrlFromContent(streamLine);
216
217                return streamUrl;
218        }
219
220        private static void search(String query) throws IOException {
221                YouTube youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpRequestInitializer() {
222                        public void initialize(HttpRequest request) throws IOException {
223                        }
224                }).setApplicationName("test").build();
225
226                // Prompt the user to enter a query term.
227                String queryTerm = query;
228
229                // Define the API request for retrieving search results.
230                YouTube.Search.List search = youtube.search().list("id,snippet");
231
232                // Set your developer key from the {{ Google Cloud Console }} for
233                // non-authenticated requests. See:
234                // {{ https://cloud.google.com/console }}
235                search.setKey(API_KEY);
236                search.setQ(queryTerm);
237
238                // Restrict the search results to only include videos. See:
239                // https://developers.google.com/youtube/v3/docs/search/list#type
240                search.setType("video");
241
242                // To increase efficiency, only retrieve the fields that the
243                // application uses.
244                search.setFields("items(id/kind,id/videoId,snippet/title,snippet/thumbnails/default/url)");
245                search.setMaxResults(MAX_RESULTS);
246
247                // Call the API and print results.
248                SearchListResponse searchResponse = search.execute();
249                List<SearchResult> searchResultList = searchResponse.getItems();
250                List<String> videoIds = new ArrayList<String>();
251
252                if (searchResultList != null) {
253                        prettyXPrint(searchResultList.iterator(), queryTerm);
254
255                        Joiner stringJoiner = Joiner.on(',');
256                        String videoId = stringJoiner.join(videoIds);
257
258                        // Call the YouTube Data API's youtube.videos.list method to
259                        // retrieve the resources that represent the specified videos.
260                        YouTube.Videos.List listVideosRequest = youtube.videos().list("snippet, recordingDetails").setId(videoId);
261                        listVideosRequest.setKey(API_KEY);
262                        VideoListResponse listResponse = listVideosRequest.execute();
263
264                        List<Video> videoList = listResponse.getItems();
265
266                        if (videoList != null && !videoList.isEmpty()) {
267                                prettyPrint(videoList.iterator(), queryTerm);
268                        }
269
270
271                }
272
273        }
274
275        private static void store(List<VideoInfo> videos, String fileName) throws IOException {
276
277                try (BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "utf-8"))) {
278                        w.write("<!DOCTYPE html>");
279                        w.newLine();
280                        w.write("<html>");
281                        w.newLine();
282                        w.write("<head><title>Youtube</title><meta charset=\"utf-8\"></head>");
283                        w.newLine();
284                        w.write("<body>");
285                        w.newLine();
286
287                        String lastCategory = "";
288
289                        for (VideoInfo v : videos) {
290                                if (!lastCategory.equals(v.category)) {
291                                        w.write("<h1>");
292                                        w.write(v.category);
293                                        w.write("</h1>");
294                                        w.newLine();
295
296                                        lastCategory = v.category;
297                                }
298
299                                if (v.streamUrl != null && v.thumbnail != null) {
300                                        w.write("<div>");
301                                        w.write("<a href=\"");
302                                        w.write(v.streamUrl);
303                                        w.write("\">");
304                                        w.write("<figure>");
305                                        w.write("<img src=\"");
306                                        w.write(v.thumbnail);
307                                        w.write("\">");
308
309                                        if (v.title != null) {
310                                                w.write("<figcaption>");
311                                                w.write(v.title);
312                                                w.write("</figcaption>");
313                                        }
314
315                                        w.write("</figure>");
316                                        w.write("</a>");
317                                        w.write("</div>");
318                                        w.newLine();
319                                }
320                        }
321
322                        w.write("</body>");
323                        w.newLine();
324                        w.write("</html>");
325
326                        w.flush();
327                }
328        }
329
330        public static void main(String[] args) {
331                try {
332                        //search(args.length > 0 ? args[0] : "Madonna");
333                        //System.out.println("Guide categories");
334                        //guideCategories("de", "de");
335
336                        System.out.println("Video categories");
337                        List<VideoInfo> videos = mostPopularByCategory("us", "en");
338                        store(videos, "youtube.html");
339                        //getStreamUrlFromVideoId("TjsI5EkDZCU");
340
341                } catch (Throwable e) {
342                        e.printStackTrace();
343                }
344        }
345
346        private static void prettyXPrint(Iterator<SearchResult> iteratorSearchResults, String query) {
347
348                System.out.println("\n=============================================================");
349                System.out.println(
350                                "   First " + 50 + " videos for search on \"" + query + "\".");
351                System.out.println("=============================================================\n");
352
353                if (!iteratorSearchResults.hasNext()) {
354                        System.out.println(" There aren't any results for your query.");
355                }
356
357                while (iteratorSearchResults.hasNext()) {
358
359                        SearchResult singleVideo = iteratorSearchResults.next();
360                        ResourceId rId = singleVideo.getId();
361
362                        // Confirm that the result represents a video. Otherwise, the
363                        // item will not contain a video ID.
364                        if (rId.getKind().equals("youtube#video")) {
365                                Thumbnail thumbnail = singleVideo.getSnippet().getThumbnails().getDefault();
366
367                                System.out.println(" Video Id" + rId.getVideoId());
368                                System.out.println(" Title: " + singleVideo.getSnippet().getTitle());
369                                System.out.println(" Thumbnail: " + thumbnail.getUrl());
370                                System.out.println("\n-------------------------------------------------------------\n");
371                        }
372                }
373        }
374
375        private static void prettyPrint(Iterator<Video> iteratorVideoResults, String query) {
376
377                System.out.println("\n=============================================================");
378                System.out.println(
379                                "   First " + 50 + " videos for search on \"" + query + "\".");
380                System.out.println("=============================================================\n");
381
382                if (!iteratorVideoResults.hasNext()) {
383                        System.out.println(" There aren't any results for your query.");
384                }
385
386                while (iteratorVideoResults.hasNext()) {
387
388                        Video singleVideo = iteratorVideoResults.next();
389
390                        Thumbnail thumbnail = singleVideo.getSnippet().getThumbnails().getDefault();
391                        GeoPoint location = singleVideo.getRecordingDetails().getLocation();
392
393                        System.out.println(" Video Id" + singleVideo.getId());
394                        System.out.println(" Title: " + singleVideo.getSnippet().getTitle());
395                        System.out.println(" Location: " + location.getLatitude() + ", " + location.getLongitude());
396                        System.out.println(" Thumbnail: " + thumbnail.getUrl());
397                        System.out.println("\n-------------------------------------------------------------\n");
398                }
399        }
400
401}
Note: See TracBrowser for help on using the repository browser.