aboutsummaryrefslogtreecommitdiff
path: root/dotfiles/scripts/ff2mpv.py
blob: acc5d4ae2878e283a1096b378e1b705e1d6563f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python3

import sys
import struct
import json
from subprocess import Popen, DEVNULL


def main():
    message = get_message()
    url = message.get("url")

    # Need to install playerctl [1] and mpv-mpris [2]
    # [1] https://github.com/altdesktop/playerctl
    # [2] https://github.com/hoyon/mpv-mpris
    # To use with https://addons.mozilla.org/fr/firefox/addon/ff2mpv/
    # Tips: to have mpv in "deamon mode" use mpv --idle

    args = ["playerctl", "--player=mpv", "open", url]
    Popen(args, stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL)

    args = ["playerctl", "--player=mpv", "play"]
    Popen(args, stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL)

    # Need to respond something to avoid "Error: An unexpected error occurred"
    # in Browser Console.
    send_message("ok")


# https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Native_messaging#App_side
def get_message():
    raw_length = sys.stdin.buffer.read(4)
    if not raw_length:
        return {}
    length = struct.unpack("@I", raw_length)[0]
    message = sys.stdin.buffer.read(length).decode("utf-8")
    return json.loads(message)


def send_message(message):
    content = json.dumps(message).encode("utf-8")
    length = struct.pack("@I", len(content))
    sys.stdout.buffer.write(length)
    sys.stdout.buffer.write(content)
    sys.stdout.buffer.flush()


if __name__ == "__main__":
    main()