4 * Default media scraper
6 * Looks for <embed> and <object> elements, and also uses regular
7 * expresisons to attempt to match strings that look like URIs to
11 define_variable("media_scrape_default_regexp",
12 new RegExp("(?:http://[a-zA-Z0-9.\\-]+/)?(?!://)[^=&<>\"'|\\s]+\\."
13 + "(?:aiff|au|avi|flv|mid|mov|mp3|ogg|ra|rm|spl|wav|wma|wmv)(?!\\w)", "ig"),
14 "Regular expression used by the default media scraper to match URIs for "
15 + "embedded media in the page source code.");
17 function media_scrape_default(buffer, results) {
18 var initial_length = results.length;
19 for_each_frame(buffer.top_frame, function (frame) {
20 var text = frame.document.documentElement.innerHTML;
21 var matches = text.match(media_scrape_default_regexp);
22 //matches = matches.concat(unescape(text).match(media_scrape_default_regexp));
24 let base_uri = frame.document.documentURIObject;
26 var uris = new string_hashset();
27 for each (let x in matches) {
30 let uri_obj = make_uri(str, null, base_uri);
31 if (!uris.contains(uri_obj.spec)) {
32 uris.add(uri_obj.spec);
33 results.push(load_spec({uri: uri_obj.spec, source_frame: frame}));
40 // If there is exactly 1, use the document title as the video title
41 if (initial_length == 0 && results.length == 1 &&
42 buffer.document.title && buffer.document.title.length > 0) {
44 results[0].title = buffer.document.title;
45 results[0].suggest_filename_from_uri = false;
50 define_variable("media_scrapers", [media_scrape_default],
51 "Function (or coroutine) to use to scrape the current buffer for embedded media.");
54 function media_scrape(buffer) {
55 var scrapers = buffer.get("media_scrapers");
58 for each (let scraper in scrapers) {
59 yield scraper(buffer, results);
62 yield co_return(results);
65 function media_setup_local_object_classes(buffer) {
66 buffer.local_variables.default_browser_object_classes = {
67 __proto__: default_browser_object_classes,
69 shell_command: "media",
70 shell_command_url: "media"
74 define_browser_object_class("media", $handler = function (buf, prompt) {
75 let media = yield media_scrape(buf);
76 if (!media || media.length == 0)
77 throw interactive_error("No media found.");
79 if (media.length == 1)
80 yield co_return(media[0]);
82 let completer = all_word_completer(
84 $get_string = function (x) load_spec_uri_string(x),
85 $get_description = function (x) load_spec_title(x) || "");
87 let result = yield buf.window.minibuffer.read(
90 $completer = completer,
91 $auto_complete_initial,
92 $auto_complete = "media");
94 yield co_return(result);