youtube.js: allow _ in video id
[conkeror.git] / modules / media.js
blob407133860983af844823a22adab7d77f480d7b57
1 /**
2  * (C) Copyright 2008 Jeremy Maitin-Shepard
3  *
4  * Use, modification, and distribution are subject to the terms specified in the
5  * COPYING file.
6 **/
8 /**
9  * Default media scraper
10  *
11  * Looks for <embed> and <object> elements, and also uses regular
12  * expresisons to attempt to match strings that look like URIs to
13  * embedded media.
14  **/
16 define_variable("media_scrape_default_regexp",
17                 new RegExp("(?:http://[a-zA-Z0-9.\\-]+/)?(?!://)[^=&<>\"'|\\s]+\\."
18                            + "(?:aiff|au|avi|flv|mid|mov|mp3|ogg|ra|rm|spl|wav|wma|wmv)(?!\\w)", "ig"),
19                 "Regular expression used by the default media scraper to match URIs for "
20                 + "embedded media in the page source code.");
22 function media_scrape_default(buffer, results) {
23     var initial_length = results.length;
24     for_each_frame(buffer.top_frame, function (frame) {
25                        var text = frame.document.documentElement.innerHTML;
26                        var matches = text.match(media_scrape_default_regexp);
27                        //matches = matches.concat(unescape(text).match(media_scrape_default_regexp));
29                        let base_uri = frame.document.documentURIObject;
31                        var uris = new string_hashset();
32                        for each (let x in matches) {
33                            let str = x;
34                            try {
35                                let uri_obj = make_uri(str, null, base_uri);
36                                if (!uris.contains(uri_obj.spec))  {
37                                    uris.add(uri_obj.spec);
38                                    results.push(load_spec({uri: uri_obj.spec, source_frame: frame}));
39                                }
40                            } catch (e) {}
41                        }
43                    });
45     // If there is exactly 1, use the document title as the video title
46     if (initial_length == 0 && results.length == 1 &&
47         buffer.document.title && buffer.document.title.length > 0) {
49         results[0].title = buffer.document.title;
50         results[0].suggest_filename_from_uri = false;
51     }
52     return results;
55 define_variable("media_scrapers", [media_scrape_default],
56                 "Function (or coroutine) to use to scrape the current buffer for embedded media.");
59 function media_scrape(buffer) {
60     var scrapers = buffer.get("media_scrapers");
61     var results = [];
62     if (scrapers)  {
63         for each (let scraper in scrapers) {
64             yield scraper(buffer, results);
65         }
66     }
67     yield co_return(results);
70 function media_setup_local_object_classes(buffer) {
71     buffer.local_variables.default_browser_object_classes = {
72         __proto__: default_browser_object_classes,
73         save: "media",
74         shell_command: "media",
75         shell_command_url: "media"
76     };
79 define_browser_object_class("media", $handler = function (buf, prompt) {
80     let media = yield media_scrape(buf);
81     if (!media || media.length == 0)
82         throw interactive_error("No media found.");
84     if (media.length == 1)
85         yield co_return(media[0]);
87     let completer = all_word_completer(
88         $completions = media,
89         $get_string = function (x) load_spec_uri_string(x),
90         $get_description = function (x) load_spec_title(x) || "");
92     let result = yield buf.window.minibuffer.read(
93         $prompt = prompt,
94         $match_required,
95         $completer = completer,
96         $auto_complete_initial,
97         $auto_complete = "media");
99     yield co_return(result);