appleFonts: Add fonts from MobileAssets

This commit is contained in:
Artemis Tosini 2023-12-20 07:13:37 +00:00
parent 03880ef039
commit 0fa9c60778
Signed by: artemist
GPG key ID: ADFFE553DCBB831E
4 changed files with 103 additions and 1 deletions

1
apple/assets.json Normal file

File diff suppressed because one or more lines are too long

36
apple/default.nix Normal file
View file

@ -0,0 +1,36 @@
{ lib, fetchurl, stdenvNoCC, unzip }:
let
root = lib.importJSON ./assets.json;
mkExtraFont = family: data: {
name = lib.replaceStrings [ " " ] [ "-" ] family;
value = stdenvNoCC.mkDerivation {
name = family;
srcs = map fetchurl data.assets;
dontUnpack = true;
installPhase = ''
mkdir -p $out/share/fonts/apple
i=0
for src in $srcs; do
mkdir $i
${unzip}/bin/unzip -d $i $src
cp -v -t $out/share/fonts/apple $i/AssetData/*.{ttc,ttf,otf}
i=$((i+1))
done
'';
meta = with lib; {
license = licenses.unfree;
platforms = platforms.all;
description = "${family} fonts as downloadable from macOS";
};
};
};
in {
extra = lib.mapAttrs' mkExtraFont root.extra;
allExtra = (mkExtraFont "All Extra" root.all_extra).value;
}

58
apple/update.py Executable file
View file

@ -0,0 +1,58 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p python3Packages.requests
import base64
import json
import plistlib
import requests
from typing import Dict, Any, List
assets = plistlib.loads(
requests.get(
"https://mesu.apple.com/assets/com_apple_MobileAsset_Font7/com_apple_MobileAsset_Font7.xml"
).content
)["Assets"]
families: Dict[str, Any] = dict()
all_assets: List[Dict[str, str]] = []
for asset in assets:
# Period used for extra PUA font
names = set(
[
info["FontFamilyName"]
for info in asset["FontInfo4"]
if not info["FontFamilyName"].startswith(".")
]
)
name = names.pop()
# There seems to be some support for things other than SHA-1 but I haven't seen it
hsh = "sha1-" + base64.b64encode(asset["_Measurement"]).decode("utf-8")
url = asset["__BaseURL"] + asset["__RelativePath"]
asset_obj = {
"url": url,
"hash": hsh,
}
all_assets.append(asset_obj)
version = asset["_CompatibilityVersion"]
if len(names) > 1:
print("Multiple family names found in asset:", ", ".join(names))
if name in families:
other_version = families[name]["version"]
if version == other_version:
families[name]["assets"].append(asset_obj)
continue
elif int(version) < int(other_version):
print(f"Duplicate asset found for family {name}, skipping")
continue
families[name] = {
"assets": [asset_obj],
"version": version,
}
with open("assets.json", "w") as f:
json.dump(
{"extra": families, "all_extra": {"assets": all_assets, "version": "mixed"}}, f
)

View file

@ -127,6 +127,7 @@
name = replaceStrings [ " " ] [ "-" ] (toLower font.name);
value = buildLocalFont font;
}) localFonts);
appleFonts = final.callPackage ./apple { };
});
} // flake-utils.lib.eachDefaultSystem (system:
let
@ -136,7 +137,13 @@
config.allowUnfree = true;
};
in {
packages = pkgs.extraFonts;
packages = builtins.listToAttrs (map (name: {
inherit name;
value = pkgs.${name} // {
type = "derivation";
name = "dummy-attrset";
};
}) [ "extraFonts" "appleFonts" ]);
formatter = pkgs.nixfmt;
});
}