1 require("content-buffer.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);
15 let res = media_youtube_content_key_regexp.exec(text);
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) {
28 var uri = buffer.current_URI.spec;
30 var result = media_youtube_uri_test_regexp.exec(uri);
35 let text = buffer.document.documentElement.innerHTML;
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);
47 function media_scrape_embedded_youtube(buffer, results) {
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");
59 for (let j = 0; j < param_els.length; ++j) {
60 let param_el = param_els[j];
62 if (param_el.getAttribute("name").toLowerCase() == "movie" &&
63 (match = embedded_youtube_regexp.exec(param_el.getAttribute("value"))) != null) {
67 let lspec = load_spec({uri: "http://youtube.com/watch?v=" + code});
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.
88 yield co_for_each_frame(buffer.top_frame, helper);
89 } catch (e if (e instanceof abort)) {
91 // Still allow other media scrapers to try even if the user aborted an http request.
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]);