111 lines
3.4 KiB
Python
111 lines
3.4 KiB
Python
|
#!/usr/bin/env python3
|
||
|
from __future__ import print_function
|
||
|
|
||
|
import os
|
||
|
import sys
|
||
|
import json
|
||
|
import struct
|
||
|
import subprocess
|
||
|
|
||
|
VERSION = '0.0.1'
|
||
|
|
||
|
try:
|
||
|
sys.stdin.buffer
|
||
|
|
||
|
# Python 3.x version
|
||
|
# Read a message from stdin and decode it.
|
||
|
def getMessage():
|
||
|
rawLength = sys.stdin.buffer.read(4)
|
||
|
if len(rawLength) == 0:
|
||
|
sys.exit(0)
|
||
|
messageLength = struct.unpack('@I', rawLength)[0]
|
||
|
message = sys.stdin.buffer.read(messageLength).decode('utf-8')
|
||
|
return json.loads(message)
|
||
|
|
||
|
# Send an encoded message to stdout
|
||
|
def sendMessage(messageContent):
|
||
|
encodedContent = json.dumps(messageContent).encode('utf-8')
|
||
|
encodedLength = struct.pack('@I', len(encodedContent))
|
||
|
|
||
|
sys.stdout.buffer.write(encodedLength)
|
||
|
sys.stdout.buffer.write(encodedContent)
|
||
|
sys.stdout.buffer.flush()
|
||
|
|
||
|
except AttributeError:
|
||
|
# Python 2.x version (if sys.stdin.buffer is not defined)
|
||
|
print('Python 3.2 or newer is required.')
|
||
|
sys.exit(-1)
|
||
|
|
||
|
|
||
|
def install():
|
||
|
home_path = os.getenv('HOME')
|
||
|
|
||
|
manifest = {
|
||
|
'name': 'download_with',
|
||
|
'description': 'Download With native host',
|
||
|
'path': os.path.realpath(__file__),
|
||
|
'type': 'stdio',
|
||
|
}
|
||
|
locations = {
|
||
|
'chrome': os.path.join(home_path, '.config', 'google-chrome', 'NativeMessagingHosts'),
|
||
|
'chrome-beta': os.path.join(home_path, '.config', 'google-chrome-beta', 'NativeMessagingHosts'),
|
||
|
'chrome-unstable': os.path.join(home_path, '.config', 'google-chrome-unstable', 'NativeMessagingHosts'),
|
||
|
'chromium': os.path.join(home_path, '.config', 'chromium', 'NativeMessagingHosts'),
|
||
|
'firefox': os.path.join(home_path, '.mozilla', 'native-messaging-hosts'),
|
||
|
'librewolf': os.path.join(home_path, '.librewolf', 'native-messaging-hosts'),
|
||
|
'waterfox': os.path.join(home_path, '.waterfox', 'native-messaging-hosts'),
|
||
|
'waterfox-g4': os.path.join(home_path, '.waterfox', 'native-messaging-hosts'),
|
||
|
'thunderbird': os.path.join(home_path, '.thunderbird', 'native-messaging-hosts'),
|
||
|
}
|
||
|
filename = 'download_with.json'
|
||
|
|
||
|
for browser, location in locations.items():
|
||
|
if os.path.exists(os.path.dirname(location)):
|
||
|
if not os.path.exists(location):
|
||
|
os.mkdir(location)
|
||
|
|
||
|
browser_manifest = manifest.copy()
|
||
|
if browser in ['firefox', 'thunderbird', 'librewolf', 'waterfox', 'waterfox-g4']:
|
||
|
browser_manifest['allowed_extensions'] = ['downloadwith@wirlaburla.github.io']
|
||
|
else:
|
||
|
browser_manifest['allowed_origins'] = [
|
||
|
'chrome-extension://cogjlncmljjnjpbgppagklanlcbchlno/', # Chrome
|
||
|
'chrome-extension://fbmcaggceafhobjkhnaakhgfmdaadhhg/', # Opera
|
||
|
]
|
||
|
|
||
|
with open(os.path.join(location, filename), 'w') as file:
|
||
|
file.write(
|
||
|
json.dumps(browser_manifest, indent=2, separators=(',', ': '), sort_keys=True).replace(' ', '\t') + '\n'
|
||
|
)
|
||
|
|
||
|
def listen():
|
||
|
receivedMessage = getMessage()
|
||
|
if receivedMessage == 'ping':
|
||
|
sendMessage({
|
||
|
'version': VERSION,
|
||
|
'file': os.path.realpath(__file__)
|
||
|
})
|
||
|
else:
|
||
|
devnull = open(os.devnull, 'w')
|
||
|
subprocess.Popen(receivedMessage, stdout=devnull, stderr=devnull)
|
||
|
sendMessage(None)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
if len(sys.argv) == 2:
|
||
|
if sys.argv[1] == 'install':
|
||
|
install()
|
||
|
sys.exit(0)
|
||
|
allowed_extensions = [
|
||
|
'downloadwith@wirlaburla.github.io',
|
||
|
'chrome-extension://cogjlncmljjnjpbgppagklanlcbchlno/',
|
||
|
'chrome-extension://fbmcaggceafhobjkhnaakhgfmdaadhhg/',
|
||
|
]
|
||
|
for ae in allowed_extensions:
|
||
|
if ae in sys.argv:
|
||
|
listen()
|
||
|
sys.exit(0)
|
||
|
|
||
|
print('This is the Download With native helper, version %s.' % VERSION)
|
||
|
print('Run this script again with the word "install" after the file name to install.')
|