Skip to content

Instantly share code, notes, and snippets.

@zhuqling
Forked from omz/FontInstaller.py
Created December 20, 2018 05:08
Show Gist options
  • Save zhuqling/fb76a40d110a3e29d417870a0627b077 to your computer and use it in GitHub Desktop.
Save zhuqling/fb76a40d110a3e29d417870a0627b077 to your computer and use it in GitHub Desktop.
FontInstaller
# FontInstaller (by @olemoritz)
# This script installs a custom TTF font on iOS (system-wide).
# It can be used in one of two ways:
# 1. Simply run it in Pythonista, you'll be prompted for the URL of the font
# you'd like to install (if there's a URL in the clipboard, it'll be used by default)
# 2. Use it as an 'Open in...' handler, i.e. select this file in Pythonista's 'Open in...
# menu' setting. This way, you can simply download a ttf file in Safari and open it in
# Pythonista. The script will then automatically install the downloaded font.
# The script is inspired by the AnyFont app (https://itunes.apple.com/us/app/anyfont/id821560738)
# and the iOS integration of MyFonts (http://meta.myfonts.com/post/80802984786/install-fonts-from-myfonts-on-ios-7-devices)
import plistlib
import BaseHTTPServer
import webbrowser
import uuid
import urllib
import sys
import console
import clipboard
import os
# Request handler for serving the config profile:
class ConfigProfileHandler (BaseHTTPServer.BaseHTTPRequestHandler):
config = None
def do_GET(s):
s.send_response(200)
s.send_header('Content-Type', 'application/x-apple-aspen-config')
s.end_headers()
plist_string = plistlib.writePlistToString(ConfigProfileHandler.config)
s.wfile.write(plist_string)
def log_message(self, format, *args):
pass
def run_server(config):
ConfigProfileHandler.config = config
server_address = ('', 0)
httpd = BaseHTTPServer.HTTPServer(server_address, ConfigProfileHandler)
sa = httpd.socket.getsockname()
# Point Safari to the local http server:
webbrowser.open('safari-http://localhost:' + str(sa[1]))
# Handle a single request, then stop the server:
httpd.handle_request()
def main():
label = 'Custom Font'
if len(sys.argv) < 2:
# No command-line argument, use an input dialog for entering a URL:
default_url = 'http://'
clip = clipboard.get()
if clip and clip.startswith('http'):
default_url = clip
font_url = console.input_alert('Font URL', 'Please enter the full URL of the TTF file.', default_url)
font_data = urllib.urlopen(font_url).read()
label = font_url.split('/')[-1].split('.')[0]
else:
# The script was triggered by the 'Open in...' menu:
font_path = sys.argv[1]
label = os.path.split(font_path)[1]
if os.path.splitext(font_path)[1].lower() != '.ttf':
print 'Not a ttf file.'
return
with open(font_path, 'r') as f:
font_data = f.read()
# Create the configuration profile:
unique_id = uuid.uuid4().urn[9:].upper()
config = {'PayloadContent': [{
'Font': plistlib.Data(font_data),
'PayloadIdentifier': 'com.omz-software.font.' + unique_id,
'PayloadOrganization': 'omz:software',
'PayloadType': 'com.apple.font',
'PayloadUUID': unique_id, 'PayloadVersion': 1}],
'PayloadDescription': label,
'PayloadDisplayName': label,
'PayloadIdentifier': 'com.omz-software.font.' + unique_id,
'PayloadOrganization': 'omz:software',
'PayloadRemovalDisallowed': False,
'PayloadType': 'Configuration',
'PayloadUUID': unique_id,
'PayloadVersion': 1}
run_server(config)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment