youtube-player.js: add support for changing playback speed
[conkeror.git] / modules / page-modes / youtube-player.js
blobf47ae53b7d6583214a4c30f501ae0eb9fe946f66
1 /**
2  * (C) Copyright 2012 Scott Jaderholm
3  * (C) Copyright 2013 Joren Van Onder
4  *
5  * Use, modification, and distribution are subject to the terms specified in the
6  * COPYING file.
7 **/
9 require("content-buffer.js");
11 define_keymap("youtube_player_keymap", $display_name = "youtube-player");
13 function youtube_player_display_error_message (I, error_message) {
14     I.minibuffer.message(error_message + ", ensure html5 is enabled for youtube by visiting http://youtube.com/html5");
17 function youtube_player_change_speed (slower) {
18     return function (I) {
19         var buf = I.buffer;
21         // get settings control rows
22         var settings_control_rows = buf.document.querySelectorAll(".ytp-menu-row");
24         var speed_buttons = null;
25         // find speed buttons
26         for (var i = 0, n = settings_control_rows.length; i < n && ! speed_buttons; ++i) {
27             if (settings_control_rows[i].innerHTML.indexOf("Speed") != -1) {
28                 speed_buttons = settings_control_rows[i].querySelectorAll(
29                     ".ytp-drop-down-menu-content .ytp-drop-down-menu-button");
30             }
31         }
33         if (! speed_buttons) {
34             youtube_player_display_error_message(I, "No speed buttons found");
35             return;
36         }
38         var current_speed_found = false;
39         for (var i = 0, n = speed_buttons.length; i < n; ++i) {
40             if (speed_buttons[i].className.indexOf("ytp-drop-down-menu-button-checked") != -1) {
41                 // current speed
42                 current_speed_found = true;
44                 if (slower && i != 0) {
45                     dom_node_click(speed_buttons[i - 1], 1, 1);
46                 } else if (! slower && i != speed_buttons.length - 1) {
47                     dom_node_click(speed_buttons[i + 1], 1, 1);
48                 }
50                 break;
51             }
52         }
54         if (! current_speed_found) {
55             youtube_player_display_error_message(I, "Current speed button not found");
56         }
57     }
60 function youtube_player_click_command (selector, error_message) {
61     return function (I) {
62         var buf = I.buffer;
63         var elem = buf.document.querySelector(selector);
64         if (elem)
65             dom_node_click(elem, 1, 1);
66         else
67             youtube_player_display_error_message(I, error_message);
68     };
71 interactive("youtube-player-play-or-pause",
72     "Click the Youtube html5 player play/pause button.",
73     youtube_player_click_command(".ytp-button-pause, .ytp-button-play",
74                                  "No play or pause button found"));
76 interactive("youtube-player-mute",
77     "Click the Youtube html5 player mute button.",
78     youtube_player_click_command("button.html5-volume-button",
79                                  "No mute button found"));
81 interactive("youtube-player-fullscreen",
82     "Click the Youtube html5 player fullscreen button.",
83     youtube_player_click_command(".ytp-button-fullscreen-enter, .ytp-button-fullscreen-exit",
84                                  "No fullscreen button found"));
86 interactive("youtube-player-speed-down",
87     "Slow down the Youtube html5 player.",
88     youtube_player_change_speed(true));
90 interactive("youtube-player-speed-up",
91     "Speed up the Youtube html5 player.",
92     youtube_player_change_speed(false));
94 define_key(youtube_player_keymap, "C-c return", "youtube-player-play-or-pause");
95 define_key(youtube_player_keymap, "C-c C-m", "youtube-player-mute");
96 define_key(youtube_player_keymap, "C-c C-f", "youtube-player-fullscreen");
97 define_key(youtube_player_keymap, "C-c C-[", "youtube-player-speed-down");
98 define_key(youtube_player_keymap, "C-c C-]", "youtube-player-speed-up");
100 define_keymaps_page_mode("youtube-player-mode",
101     build_url_regexp($domain = "youtube", $allow_www = true),
102     { normal: youtube_player_keymap },
103     $display_name = "Youtube-Player");
105 page_mode_activate(youtube_player_mode);
107 provide("youtube-player");