carlin-q-scott / browser-media-keys Goto Github PK
View Code? Open in Web Editor NEWLets you control many web players using the media keys on your keyboard.
License: Mozilla Public License 2.0
Lets you control many web players using the media keys on your keyboard.
License: Mozilla Public License 2.0
The website actually has hotkeys but they aren't the media keys.
<button tabindex="100" id="previous-control" class="icon-previous control-button" title="Previous (<)" data-reactid="26"></button>
<button tabindex="100" id="play-control" class="control-button icon-pause" title="Pause (Spacebar)" data-reactid="27"></button>
<button tabindex="100" id="play-control" class="control-button icon-play" title="Play (Spacebar)" data-reactid="27"></button>
<button tabindex="100" id="next-control" class="icon-next control-button" title="Next (>)" data-reactid="28"></button>
I'm interested to see whether it's possible to make Firefox act like other applications on Linux that respond to global multimedia key presses. Before I start getting into this, have you looked into this at all? It'd be helpful to know straight up if the answer is that it's impossible.
Essentially, Linux applications respond to global key presses by, at least in GNOME-based environments, listening to specific DBus signals. There's a Python-based example at https://gist.github.com/davidjb/e6cee3a040b1532e728d (from https://stackoverflow.com/questions/5744041/cant-get-dbus-signal-listener-to-work-in-c-with-gnome-multimedia-keys) that works, but obviously this would need to be made compatible with Firefox in JavaScript (if accessing dbus is possible). C examples exist also, but I don't know how feasible this would be in an add-on. I see that accessing the win32api was possible via ctypes for Windows, so presumably it's possible.
I'm interested in making this happen but wanted to see if you had any input first.
Firefox will be rolling out their multi-process architecture in a couple weeks and this add-on uses some APIs that may be broken by the changes.
play.spotify.com
I'm not sure how useful this one is because they have a pretty good desktop client.
I'm trying to use the extension on Windows 7 Enterprise, on a Thinkpad with external Microsoft comfort curve keyboard v1.0 and I cannot get youtube to pause when hitting Play / pause. I tried the key with widows media player to confirm the key is working and... it is working.
I restarted firefox, reloaded youtube, focused on the page, focused on different tabs, on different applications but nothing at all.
Any information I can provide you with just let me know.
Update for a new VK design please. Doesn't work with it.
As mentioned in #7, there's a caveat for Linux DBus support that another DBus application (eg Rhythmbox) opens after Media Keys starts listening to DBus, that application takes over listening and Media Keys won't get any signals until that application exits.
Normally, other DBus applications (the ones I've seen, like Rhythmbox) take DBus precedence back (eg they restart listening) if/when they re-gain focus. So, what Media Keys should do is restart listening (eg DetachEventListeners
and AttachEventListeners
in the DBus module) upon Firefox regaining focus to one of its windows.
This isn't a huge issue for me as quitting the other application is just as easy to do (or disable/re-enable Media Keys), but it's worth mentioning in case a fix is simple. It might be too much overhead to worry about.
AMO reviewer made this suggestion:
The idea was to only send an event from the content script to execute the function directly in the page script, instead of accessing potentially unsafe page content from the content script of your add-on. See also https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Accessing_the_DOM?redirect=no#Adding_Event_Listeners and https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/Interacting_with_page_scripts
So the idea is to inject the orchestrator functions into the page and then relay the media key events to them through the content script.
I'm using Windows 10 and a Microsoft SideWinder X4 keyboard, but the add-on seems to do nothing.
Firefox is up to date.
Also support for Napster would be great.
Would be great to be able to use those media keys in Firefox.
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/32177089-can-t-get-it-to-work-and-add-supoort-for-napster?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).The media keys are being held while the youtube subscription page or other non video page is open.
Hey there man!
I was trying to hook up one of my addons with a global hotkey for the Print Screen button. Does your dbus method work for that key? Or was it just media keys?
Edit:
Im pretty sure its media keys only after further thought.
So I am going different ways but if you could help that would be awesome:
I tried gdk_add_window_filter
but it only detects the button from within firefox:
(in comments below I am going with xcb method - i like that method because we can run from chromeworker if we can just get it to work)
Cu.import('resource://gre/modules/ctypes.jsm');
var GdkXEvent = ctypes.StructType('XKeyEvent', [ // https://tronche.com/gui/x/xlib/events/keyboard-pointer/keyboard-pointer.html#XKeyEvent
{ type: ctypes.int },
{ serial: ctypes.unsigned_long },
{ send_event: ctypes.bool },
{ display: ctypes.voidptr_t },
{ window: ctypes.unsigned_long },
{ root: ctypes.unsigned_long },
{ subwindow: ctypes.unsigned_long },
{ time: ctypes.unsigned_long },
{ x: ctypes.int },
{ y: ctypes.int },
{ x_root: ctypes.int },
{ y_root: ctypes.int },
{ state: ctypes.unsigned_int },
{ keycode: ctypes.unsigned_int },
{ same_screen: ctypes.bool }
]);
var GdkFilterFunc = ctypes.FunctionType(ctypes.default_abi, ctypes.int, [GdkXEvent.ptr, ctypes.voidptr_t, ctypes.voidptr_t]).ptr;
var lib = ctypes.open(parseInt(Services.appinfo.version) <= 45 ? 'libgdk-x11-2.0.so.0' : 'libgdk-3.so.0');
var gdk_window_remove_filter = lib.declare('gdk_window_remove_filter', ctypes.default_abi, ctypes.void_t, ctypes.voidptr_t, GdkFilterFunc, ctypes.voidptr_t);
var gdk_window_add_filter = lib.declare('gdk_window_add_filter', ctypes.default_abi, ctypes.void_t, ctypes.voidptr_t, GdkFilterFunc, ctypes.voidptr_t);
var OSStuff = {};
OSStuff.hotkeyCallback = GdkFilterFunc(function(xeventPtr, eventPtr, data) {
// console.error('type:', xeventPtr.contents.type);
if (xeventPtr.contents.type == 2) { // KeyPress
console.error('keycode:', xeventPtr.contents.keycode);
}
// return 2; // block it
return 0; // dont block
});
gdk_window_add_filter(null, OSStuff.hotkeyCallback, null);
I noticed this months ago but was too lazy to look into it but then one of our users reported the issue as well. Turns out we weren't assigning the hotkeyWorker to the variable for tracking the active one.
After #7, can the description and "about this addon" at https://addons.mozilla.org/en-US/firefox/addon/media-keys/ be updated to reflect the changes in the add-on (eg Google Play support & Linux support via DBus)?
Thanks.
Consider adding following labels:
When Pandora is open for a long time it sometimes experiences an error or update which blocks the player from playing music. This plugin should automatically click the reload button in order to complete the play operation.
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/7935161-handle-pandora-reload-dialog-after-play-event?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).Would be nice to add Plex support. Trick is that you can view your Plex library from "plex.tv" domain, or from localhost.
Pandora have updated their site a few days ago.
If pandora is playing in another tab and I hit pause on my keyboard, the song very slowly lowers its volume until it stops after about 10 seconds.
If during this "slow pause" process I switch to the tab, then it pauses instantly.
Trying to start audio is a bit hit and miss, sometimes it starts, sometimes it doesn't.
I wanted to create a hotkey global hotkey for my addon. Would it be easy for you to make a distributable of the workers so other addon devs could easily setup global hotkeys in their addons? :)
This would be a huge one up on firefox addons versus chrome addons, as google chrome addons can only do numpad for global hotkeys. :d
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/28242774-possible-drop-in-for-other-addons?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).I want to be able to use the media keys without having the browser window active.
One of our users has reported that the add-on doesn't work on Fedora 22. Can someone confirm this issue?
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/28972105-add-support-for-fedora-22?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).soundcloud.com
Would be a nice feature. Dunno if and how this could be made though.
Use case: Ability to have a separate tab with music which could be controlled independently of other undesirable tabs that may also have media sources.
We don't want media that we manually paused or never even started playing to start automatically after playback finishes for some other media.
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/33890134-only-resume-automatically-paused-media?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).Everytime I launch Firefox this addon does not work and I have to disable it and reenable it again for it to work but if I close Firefox anc load it up the media keys won't work again.
Currently the automatic pause/resume feature only works within the context of a single window which makes its behavior unpredictable and therefore not reliable.
People using Microsoft's Sidewinder keyboard application or Logitech's SetPoint application are unable to use this add-on because these applications assume control of the media keys from Windows. We should detect if one of these apps are running and fall back to Firefox hotkeys if one is. Optimally we should alert the user as to why this has happened.
It would be cool if I was notified about the currently playing track when it starts playing. It would be even better if I was also notified at the end of the track as well.
The youtube page worker is supposed to remove itself when there's no player but for some reason it's still reacting to tab.activate, if not other things as well.
Hi there,
There is no link to the github repository (and/or issues page) from the AMO listing. This may not be an issue, but i just spent a while digging on github to find this repo :P
This is an excellent addon. It works perfectly for me, except in the following scenario:
So their seems to be a bug that breaks things specifically with localhost tabs, but not on 127.0.0.1 tabs. I had a quick look at the code, but couldn't find any obvious causes.
I'm running the addon in Firefox 44.0.2 on Ubuntu 15.10
On Linux and Firefox 43.0.1 with the version 0.6.5 of this plugin there seems to be no support for the built-in HTML5 media player.
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/29678922-add-support-for-html5-built-in-player?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).This might be more challenging than is worthwhile because they don't use a subdomain for their player and people will obviously be doing other things on Amazon.com than listening to music.
A user reported problems with the latest Firefox update (v39) on Windows 10. They said an older version worked fine.
From what I can tell, the add-on currently doesn't support media keys within Mac OS X (I tested it with Youtube on Firefox 39.0, running OS X 10.8.5).
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/25342256-add-support-for-mac-os-x?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).This is really easy except for dealing with player overlap, such as having both Pandora.com and YouTube.com open at the same time. I think the last active media tab should be controlled except if another tab is currently playing something and play/pause is pressed; in this situation, the other player should be paused and the current player should play if it isn't already.
When I change a preference for the add-on it stops working and Firefox must be restarted to get it working again.
After using this addon for an extended period of time, my media keys stop working. Reloading the page does not resolve the issue and I am forced to restart Firefox to continue using my media keys.
On Windows 7
With JPM of version 1.0.4
When jpm test
is invoked, following output is produced and process does not terminate (in minutes).
JPM [info] Starting jpm test on Media Keys
Creating XPI
JPM [info] XPI created at C:\Users\basil\AppData\Local\Temp\[email protected] (159ms)
Created XPI at C:\Users\basil\AppData\Local\Temp\[email protected]
JPM [info] Creating a new profile
Running tests on Firefox 45.0a2/Gecko 45.0a2 (Build 20151221004011) ({ec8030f7-c20a-464f-9b0e-13a3a9e97384}) under winnt/x86.
...JPM [error] *************************
A coding exception was thrown in a Promise resolution callback.
See https://developer.mozilla.org/Mozilla/JavaScript_code_modules/Promise.jsm/Promise
Full message: TypeError: tab is null
Full stack: getTabId@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/tabs/utils.js:206:1
done/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:335:22
Handler.prototype.process@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:933:23
this.PromiseWalker.walkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:812:7
Promise*this.PromiseWalker.scheduleWalkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:743:11
this.PromiseWalker.schedulePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:775:7
this.PromiseWalker.completePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:710:7
checkForCompletion@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:567:9
Promise.all/</resolver@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:574:29
promise callback*Promise.all/<@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:577:9
Promise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:384:5
Promise.all@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:554:1
done@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:332:12
@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test.js:68:15
TestMediaEvent/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:50:9
KeyEventHandler@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/lib/firefoxHotkeys.js:66:1
TestMediaEvent@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:52:5
exports["test media next track"]/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:20:9
TestMediaEvent/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:50:9
KeyEventHandler@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/lib/firefoxHotkeys.js:66:1
TestMediaEvent@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:52:5
exports["test media next track"]@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:19:5
@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test.js:67:13
start@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:576:7
startMany/runNextTest/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:538:11
Handler.prototype.process@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:933:23
this.PromiseWalker.walkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:812:7
Promise*this.PromiseWalker.scheduleWalkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:743:11
this.PromiseWalker.schedulePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:775:7
this.PromiseWalker.completePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:710:7
promise callback*this.PromiseWalker.completePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:701:1
Handler.prototype.process@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:969:5
Promise*this.PromiseWalker.scheduleWalkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:743:11
this.PromiseWalker.schedulePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:775:7
Promise.prototype.then@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:450:5
this.XPIDatabase.getAddon@resource://gre/modules/addons/XPIProvider.jsm -> resource://gre/modules/addons/XPIProviderUtils.js:1101:12
this.XPIDatabase.getVisibleAddonForID@resource://gre/modules/addons/XPIProvider.jsm -> resource://gre/modules/addons/XPIProviderUtils.js:1150:1
this.XPIProvider.getAddonByID@resource://gre/modules/addons/XPIProvider.jsm:3936:5
callProviderAsync@resource://gre/modules/AddonManager.jsm:254:12
promiseCallProvider/<@resource://gre/modules/AddonManager.jsm:279:53
Promise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:384:5
promiseCallProvider@resource://gre/modules/AddonManager.jsm:278:1
AddonManagerInternal.getAddonByID/promises<@resource://gre/modules/AddonManager.jsm:2421:12
AddonManagerInternal.getAddonByID@resource://gre/modules/AddonManager.jsm:2420:20
this.AddonManager.getAddonByID@resource://gre/modules/AddonManager.jsm:3162:5
getAddon@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/addon/installer.js:118:3
getSuites@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test-finder.js:56:10
findTests@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test-finder.js:143:12
findAndRunTests@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:26:3
findAndRunTests@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/runner.js:83:1
checkForEnd@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/harness.js:406:5
nextIteration@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/harness.js:397:5
runTests@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/harness.js:618:5
runTests/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/runner.js:42:1
notify@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/timers.js:40:9
JPM [error] *************************
console.error: browsermediakeys:
JPM [error] Message: TypeError: tab is null
Stack:
getTabId@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/tabs/utils.js:206:1
done/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:335:22
Handler.prototype.process@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:933:23
this.PromiseWalker.walkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:812:7
Promise*this.PromiseWalker.scheduleWalkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:743:11
this.PromiseWalker.schedulePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:775:7
this.PromiseWalker.completePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:710:7
checkForCompletion@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:567:9
Promise.all/</resolver@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:574:29
promise callback*Promise.all/<@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:577:9
Promise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:384:5
Promise.all@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:554:1
done@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:332:12
@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test.js:68:15
TestMediaEvent/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:50:9
KeyEventHandler@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/lib/firefoxHotkeys.js:66:1
TestMediaEvent@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:52:5
exports["test media next track"]/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:20:9
TestMediaEvent/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:50:9
KeyEventHandler@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/lib/firefoxHotkeys.js:66:1
TestMediaEvent@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:52:5
exports["test media next track"]@resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-4gp7z3tkud3tzg-at-jetpack/tests/test-firefoxHotkeys.js:19:5
@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test.js:67:13
start@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:576:7
startMany/runNextTest/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:538:11
Handler.prototype.process@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:933:23
this.PromiseWalker.walkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:812:7
Promise*this.PromiseWalker.scheduleWalkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:743:11
this.PromiseWalker.schedulePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:775:7
this.PromiseWalker.completePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:710:7
promise callback*this.PromiseWalker.completePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:701:1
Handler.prototype.process@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:969:5
Promise*this.PromiseWalker.scheduleWalkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:743:11
this.PromiseWalker.schedulePromise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:775:7
Promise.prototype.then@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:450:5
this.XPIDatabase.getAddon@resource://gre/modules/addons/XPIProvider.jsm -> resource://gre/modules/addons/XPIProviderUtils.js:1101:12
this.XPIDatabase.getVisibleAddonForID@resource://gre/modules/addons/XPIProvider.jsm -> resource://gre/modules/addons/XPIProviderUtils.js:1150:1
this.XPIProvider.getAddonByID@resource://gre/modules/addons/XPIProvider.jsm:3936:5
callProviderAsync@resource://gre/modules/AddonManager.jsm:254:12
promiseCallProvider/<@resource://gre/modules/AddonManager.jsm:279:53
Promise@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:384:5
promiseCallProvider@resource://gre/modules/AddonManager.jsm:278:1
AddonManagerInternal.getAddonByID/promises<@resource://gre/modules/AddonManager.jsm:2421:12
AddonManagerInternal.getAddonByID@resource://gre/modules/AddonManager.jsm:2420:20
this.AddonManager.getAddonByID@resource://gre/modules/AddonManager.jsm:3162:5
getAddon@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/addon/installer.js:118:3
getSuites@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test-finder.js:56:10
findTests@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test-finder.js:143:12
findAndRunTests@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/deprecated/unit-test.js:26:3
findAndRunTests@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/runner.js:83:1
checkForEnd@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/harness.js:406:5
nextIteration@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/harness.js:397:5
runTests@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/harness.js:618:5
runTests/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/test/runner.js:42:1
notify@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/timers.js:40:9
console.log: browsermediakeys: [JavaScript Warning: "TypeError: useless expression" {file: "resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/util/sequence.js" line: 333}]
Please add support to control the Bandcamp media player. I'd also request YouTube, but I've noticed it is already in your plans. Thanks for your work!
Running Debian testing, Iceweasel 44.0.2. Pretty minimal install, startx with no display manager running awesomewm.
I've installed the latest version from the Firefox addon site and tried using both my keyboard and bluetooth headset next/previous buttons on youtube and jamstash. No combinations seem to do anything.
xev shows events for XF86Audio{Prev,Next,Play,Pause}.
I don't believe there are any other applications grabbing media keys (I had awesomewm binds, but I've removed them).
Any way I can debug this further?
The README states that this addon requires DBUS/glib, but neglects to mention that it is using this to interact with the GnomeSettingsDaemon, which is usually only available when using Gnome.
I was at first really excited when I found this addon, then kind of disappointed when I couldn't make it work in my KDE desktop, then I got excited again when I realized that it was using DBUS.
Is there any chance I could convince you to switch from using GSD to instead exposing an MPRIS service?
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/26935823-dependency-on-gnomesettingsdaemon-mpris-support?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).When the plugin attaches to the youtube player a second audio track for the video begins playing and it's slightly offset from the visible video. It can be worked around by reloading the page and doesn't happen every time. It even applies to the ad.
I think it would be nice to have the option to switch previous and next to act like pressing left or right arrow keys. I have a headset with customizable media keys I like to use to control youtube but the profile system can only detect programs, not webpages, so whenever I have firefox in focus I can't use them to control media players.
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/27598110-options-for-previous-and-next-actions?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).Debugger shows the file persisting after closing youtube.
Hi,
I using Logitech MK520 with SetPoint application on windows 7. I quit the SetPoint, "Media Keys" is working good. What can I do ,work with the SetPoint.
I did changes in "players.ini" file for AIMP to work with Setpoint. Like this: http://blog.nickdamoulakis.com/2013/03/make-logitech-keyboard-media-keys-work.html
For "Media Keys" is such a thing possible?
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/32082924-logitech-setpoint-issue?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).The caption speaks for itself
OS: Ubuntu 15.04 Desktop
Desktop Environment: i3 (gaps fork), 4.11
Firefox: 43.0, 64-bit
I use playerctl to control my music on my computer. After downloading and installing this extension, it doesn't appear to work at all. I restarted Firefox, and even if the window is focused, it doesn't work.
Sites tested: Youtube, Google Play Music, Spotify.
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/29384979-linux-doesn-t-work-with-playerctl-for-media-control?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F7600490&utm_medium=issues&utm_source=github).As per #40:
Plex can be hosted on any arbitrary domain (eg self-hosted or using a different port). As such, a "Plex domains" preference (like Jamstash) would avoid the restriction on the host needing to be
plex.tv
orlocalhost
. In addition, this would make page loads more efficient as the current PR applies pagemod scripts to all oflocalhost
.As Plex defaults to being run on port
:32400
, a "Plex domains" preference for this addon could default to:32400 plex.tv
(which gets split on whitespace, if following Jamstash's existing example). A quick search looks to indicate that Plex is the only known app for:32400
. For others using different ports or domains, the preference is easily adjustable.
This may require extra changes to the preference system (as per @carlin-q-scott's comments), but just noting this as an issue so it's on the radar.
When a browser session is restored, there could be a tab with a supported music site loaded. This will cause everything to run that needs to except that the tab isn't made active in the add-on which is required to route the media events to it.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.