Add embedded youtube video scraper (finds embedded youtube videos on other sites)
[conkeror.git] / modules / page-modes / youtube.js
blob7cef5da7eed9cea0aeb2b1aa72af929be8e1dccb
1 require("content-buffer.js");
2 require("media.js");
4 let media_youtube_uri_test_regexp = /^http:\/\/(?:[a-z]+\.)?youtube\.com\/watch\?v=([A-Za-z0-9\-]+)/;
5 let media_youtube_content_key_regexp = /t=[\w-]{10,}/i;
6 let media_youtube_content_title_regexp = new RegExp("&title=([^\"'&]+)");
8 function media_scrape_youtube_document_text(source_frame, code, text, results) {
10     var title_match = media_youtube_content_title_regexp.exec(text);
11     var title = null;
12     if (!title_match)
13         return;
15     let res = media_youtube_content_key_regexp.exec(text);
16     if (!res)
17         return;
18     results.push(load_spec({uri: 'http://youtube.com/get_video?video_id=' + code + '&' + res[0],
19                             suggest_filename_from_uri: false,
20                             title: decodeURIComponent(title_match[1]),
21                             filename_extension: "flv",
22                             source_frame: buffer.top_frame,
23                             mime_type: "video/x-flv"}));
26 function media_scrape_youtube(buffer, results) {
27     try {
28         var uri = buffer.current_URI.spec;
30         var result = media_youtube_uri_test_regexp.exec(uri);
32         if (!result)
33             return;
35         let text = buffer.document.documentElement.innerHTML;
36         let code = result[1];
38         media_scrape_youtube_document_text(buffer.top_frame, code, text, results);
39     } catch (e if !(e instanceof interactive_error)) {}
42 define_page_mode("youtube_mode", "YouTube", $enable = function (buffer) {
43     buffer.local_variables.media_scrapers = [media_scrape_youtube];
44     media_setup_local_object_classes(buffer);
45 });
47 function media_scrape_embedded_youtube(buffer, results) {
49     dumpln("scraping");
50     const embedded_youtube_regexp = /^http:\/\/[a-zA-Z0-9\-.]+\.youtube\.com\/v\/(.*)$/;
52     function helper(frame) {
53         // Look for embedded YouTube videos
54         let obj_els = frame.document.getElementsByTagName("object");
55         for (let i = 0; i < obj_els.length; ++i) {
56             let obj_el = obj_els[i];
57             let param_els = obj_el.getElementsByTagName("param");
58             inner:
59             for (let j = 0; j < param_els.length; ++j) {
60                 let param_el = param_els[j];
61                 let match;
62                 if (param_el.getAttribute("name").toLowerCase() == "movie" &&
63                     (match = embedded_youtube_regexp.exec(param_el.getAttribute("value"))) != null) {
65                     try {
66                         let code = match[1];
67                         let lspec = load_spec({uri: "http://youtube.com/watch?v=" + code});
68                         var result =
69                             yield buffer.window.minibuffer.wait_for(
70                                 "Requesting " + lspec.uri + "...",
71                                 send_http_request(lspec));
72                         let text = result.responseText;
73                         if (text != null && text.length > 0)
74                             media_scrape_youtube_document_text(frame, code, text, results);
75                     } catch (e if !(e instanceof abort)) {
76                         // Allow abort to fall through, so that we don't continue looking
77                         // for embedded youtube.
79                         // An error here means there was some problem with the request.
80                         // We'll just ignore it.
81                     }
82                     break inner;
83                 }
84             }
85         }
86     }
87     try {
88         yield co_for_each_frame(buffer.top_frame, helper);
89     } catch (e if (e instanceof abort)) {
90         dump_error(e);
91         // Still allow other media scrapers to try even if the user aborted an http request.
92     }
96 // Use the embedded youtube scraper by default
97 media_scrapers.unshift(media_scrape_embedded_youtube);
99 auto_mode_list.push([media_youtube_uri_test_regexp, youtube_mode]);