diff options
| author | Chris Wells <chris@mathematicaster.org> | 2024-09-05 19:45:28 -0500 |
|---|---|---|
| committer | Chris Wells <chris@mathematicaster.org> | 2024-09-05 19:45:28 -0500 |
| commit | 373d5246eb53ef1a13166b066248526f33f935db (patch) | |
| tree | 3d5494bb43d951ebf9bfa1358526102a8ac85406 | |
| parent | 1e9e6dbdd6edbfd8ac6249ba0d16e68b336cf093 (diff) | |
| download | kobo-manager-373d5246eb53ef1a13166b066248526f33f935db.tar kobo-manager-373d5246eb53ef1a13166b066248526f33f935db.tar.gz kobo-manager-373d5246eb53ef1a13166b066248526f33f935db.tar.bz2 kobo-manager-373d5246eb53ef1a13166b066248526f33f935db.tar.lz kobo-manager-373d5246eb53ef1a13166b066248526f33f935db.tar.xz kobo-manager-373d5246eb53ef1a13166b066248526f33f935db.tar.zst kobo-manager-373d5246eb53ef1a13166b066248526f33f935db.zip | |
Trying to get the kobo api working for querying firmware
| -rw-r--r-- | data/affiliates.nix | 8 | ||||
| -rw-r--r-- | data/devices.nix | 122 | ||||
| -rw-r--r-- | flake.nix | 2 | ||||
| -rw-r--r-- | modules/device/default.nix | 41 | ||||
| -rw-r--r-- | modules/firmware/default.nix | 12 | ||||
| -rw-r--r-- | modules/kobo/default.nix | 5 | ||||
| -rw-r--r-- | overlays/default.nix | 8 | ||||
| -rw-r--r-- | pkgs/firmware/default.nix | 16 | ||||
| -rw-r--r-- | pkgs/kfwproxy/default.nix | 19 | ||||
| -rwxr-xr-x | pkgs/kobo-manager/script.sh | 24 | ||||
| -rw-r--r-- | pkgs/misc/firmware-check.nix | 12 | ||||
| -rw-r--r-- | pkgs/misc/unlock.nix | 28 | ||||
| -rw-r--r-- | pkgs/plato/default.nix | 19 |
13 files changed, 297 insertions, 19 deletions
diff --git a/data/affiliates.nix b/data/affiliates.nix new file mode 100644 index 0000000..1da8686 --- /dev/null +++ b/data/affiliates.nix @@ -0,0 +1,8 @@ +[ + "kobo" + "rakutenbooks" + "bestbuyca" + "fnac" + "beta" + "walmartca" +] diff --git a/data/devices.nix b/data/devices.nix new file mode 100644 index 0000000..f6df2c6 --- /dev/null +++ b/data/devices.nix @@ -0,0 +1,122 @@ +{ + "Kobo Touch A/B" = { + hardware = "kobo3"; + deviceID = "00000000-0000-0000-0000-000000000310"; + }; + "Kobo Touch C" = { + hardware = "kobo4"; + deviceID = "00000000-0000-0000-0000-000000000320"; + }; + "Kobo Mini" = { + hardware = "kobo4"; + deviceID = "00000000-0000-0000-0000-000000000340"; + }; + "Kobo Glo" = { + hardware = "kobo4"; + deviceID = "00000000-0000-0000-0000-000000000330"; + }; + "Kobo Glo HD" = { + hardware = "kobo6"; + deviceID = "00000000-0000-0000-0000-000000000371"; + }; + "Kobo Touch 2.0" = { + hardware = "kobo6"; + deviceID = "00000000-0000-0000-0000-000000000372"; + }; + "Kobo Aura" = { + hardware = "kobo5"; + deviceID = "00000000-0000-0000-0000-000000000360"; + }; + "Kobo Aura HD" = { + hardware = "kobo4"; + deviceID = "00000000-0000-0000-0000-000000000350"; + }; + "Kobo Aura H2O" = { + hardware = "kobo5"; + deviceID = "00000000-0000-0000-0000-000000000370"; + }; + "Kobo Aura H2O Edition 2 v1" = { + hardware = "kobo6"; + deviceID = "00000000-0000-0000-0000-000000000374"; + }; + "Kobo Aura H2O Edition 2 v2" = { + hardware = "kobo7"; + deviceID = "00000000-0000-0000-0000-000000000378"; + }; + "Kobo Aura ONE" = { + hardware = "kobo6"; + deviceID = "00000000-0000-0000-0000-000000000373"; + }; + "Kobo Aura ONE Limited Edition" = { + hardware = "kobo6"; + deviceID = "00000000-0000-0000-0000-000000000381"; + }; + "Kobo Aura Edition 2 v1" = { + hardware = "kobo6"; + deviceID = "00000000-0000-0000-0000-000000000375"; + }; + "Kobo Aura Edition 2 v2" = { + hardware = "kobo7"; + deviceID = "00000000-0000-0000-0000-000000000379"; + }; + "Kobo Nia" = { + hardware = "kobo7"; + deviceID = "00000000-0000-0000-0000-000000000382"; + }; + "Kobo Clara HD" = { + hardware = "kobo7"; + deviceID = "00000000-0000-0000-0000-000000000376"; + }; + "Kobo Forma" = { + hardware = "kobo7"; + deviceID = "00000000-0000-0000-0000-000000000380"; + }; + "Kobo Libra H2O" = { + hardware = "kobo7"; + deviceID = "00000000-0000-0000-0000-000000000384"; + }; + "Kobo Elipsa" = { + hardware = "kobo8"; + deviceID = "00000000-0000-0000-0000-000000000387"; + }; + "Kobo Sage" = { + hardware = "kobo8"; + deviceID = "00000000-0000-0000-0000-000000000383"; + }; + "Kobo Libra 2" = { + hardware = "kobo9"; + deviceID = "00000000-0000-0000-0000-000000000388"; + }; + "Kobo Clara 2E" = { + hardware = "kobo10"; + deviceID = "00000000-0000-0000-0000-000000000386"; + }; + "Kobo Elipsa 2E" = { + hardware = "kobo11"; + deviceID = "00000000-0000-0000-0000-000000000389"; + }; + "Kobo Libra Colour" = { + hardware = "kobo13"; + deviceID = "00000000-0000-0000-0000-000000000390"; + }; + "Kobo Clara BW" = { + hardware = "kobo12"; + deviceID = "00000000-0000-0000-0000-000000000391"; + }; + "Kobo Clara Colour" = { + hardware = "kobo12"; + deviceID = "00000000-0000-0000-0000-000000000393"; + }; + # "tolino vision colour" = { + # hardware = "kobo11"; + # deviceID = "00000000-0000-0000-0000-000000000690"; + # }; + # "tolino shine" = { + # hardware = "kobo12"; + # deviceID = "00000000-0000-0000-0000-000000000691"; + # }; + # "tolino shine color" = { + # hardware = "kobo12"; + # deviceID = "00000000-0000-0000-0000-000000000693"; + # }; +} @@ -25,7 +25,9 @@ packages = { inherit (pkgs) + kepubify kfmon + kfwproxy kobo-koreader kobo-utils nickel-menu diff --git a/modules/device/default.nix b/modules/device/default.nix new file mode 100644 index 0000000..22cf180 --- /dev/null +++ b/modules/device/default.nix @@ -0,0 +1,41 @@ +{ config, pkgs, lib, ... }: +with builtins // lib; +let + devices = import ../../data/devices.nix; + + hardware = mkOption { + type = types.strMatching ''^kobo\d+$''; + }; + deviceID = mkOption { + type = types.strMatching ''00000000-0000-0000-0000-000000000\d\d\d''; + }; + + deviceInfo = types.submodule { + options = { + inherit hardware deviceID; + }; + }; +in { + options = { + _allDevices = mkOption { + default = devices; + readOnly = true; + internal = true; + type = types.attrsOf deviceInfo; + }; + + device = { + name = mkOption { + type = types.enum (attrNames devices); + }; + + hardware = hardware // { + default = config._allDevices.${config.device.name}.hardware; + }; + + deviceID = deviceID // { + default = config._allDevices.${config.device.name}.deviceID; + }; + }; + }; +} diff --git a/modules/firmware/default.nix b/modules/firmware/default.nix index 609212a..30a0779 100644 --- a/modules/firmware/default.nix +++ b/modules/firmware/default.nix @@ -4,23 +4,21 @@ let cfg = config.firmware; in { options.firmware = { - hardware = mkOption { - type = types.str; - }; date = mkOption { type = types.str; }; version = mkOption { type = types.str; }; - hash = mkOption { - type = types.str; - }; + # hash = mkOption { + # type = types.str; + # }; package = mkOption { type = types.package; default = pkgs.kobo-firmware { - inherit (cfg) hardware date version hash; + inherit (config.device) hardware; + inherit (cfg) date version; }; }; }; diff --git a/modules/kobo/default.nix b/modules/kobo/default.nix index 29ed213..47dfe91 100644 --- a/modules/kobo/default.nix +++ b/modules/kobo/default.nix @@ -44,7 +44,10 @@ in { kobo = { conf = { FeatureSettings.ExcludeSyncFolders = ''(\.(?!kobo|adobe).+|([^.][^/]*/)+\..+)''; - ApplicationPreferences.QuickTourShown = true; + ApplicationPreferences = { + SideloadedMode = true; + QuickTourShown = true; + }; }; file = mkIf (cfg.conf != {}) { diff --git a/overlays/default.nix b/overlays/default.nix index 8f47998..18b3f40 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -2,12 +2,20 @@ final: prev: { kfmon = prev.callPackage ../pkgs/kfmon {}; + kfwproxy = prev.callPackage ../pkgs/kfwproxy {}; + + kobo-check-firmware = prev.callPackage ../pkgs/misc/firmware-check.nix {}; + kobo-firmware = prev.callPackage ../pkgs/firmware {}; kobo-koreader = prev.callPackage ../pkgs/koreader {}; kobo-patch = prev.callPackage ../pkgs/kobo-patch {}; + kobo-unlock = prev.callPackage ../pkgs/misc/unlock.nix { + inherit (final) kobo-utils; + }; + kobo-utils = prev.callPackage ../pkgs/kobo-utils {}; diff --git a/pkgs/firmware/default.nix b/pkgs/firmware/default.nix index 813746a..932ecf1 100644 --- a/pkgs/firmware/default.nix +++ b/pkgs/firmware/default.nix @@ -1,20 +1,29 @@ { stdenvNoCC, fetchzip, lib, ... }: -{ hardware, date, version, hash ? "", sha256 ? "", ... }: +{ hardware, date, version, hash ? "", ... }: stdenvNoCC.mkDerivation (finalAttrs: { pname = "kobo-firmware"; inherit version hardware date; src = fetchzip { url = "https://ereaderfiles.kobo.com/firmwares/${finalAttrs.hardware}/${finalAttrs.date}/kobo-update-${finalAttrs.version}.zip"; - inherit hash sha256; + inherit hash; }; + outputs = [ + "out" + "KoboRoot" + ]; + phases = "installPhase"; installPhase = '' runHook preInstall - cp -r $src $out + mkdir $out + cp -r $src/{manifest.md5sum,upgrade} $out/ + + mkdir $KoboRoot + tar xvzf $src/KoboRoot.tgz --directory=$KoboRoot runHook postInstall ''; @@ -29,5 +38,6 @@ stdenvNoCC.mkDerivation (finalAttrs: { Kobo firmware files. ''; platform = platforms.all; + outputsToInstall = finalAttrs.outputs; }; }) diff --git a/pkgs/kfwproxy/default.nix b/pkgs/kfwproxy/default.nix new file mode 100644 index 0000000..c06eb73 --- /dev/null +++ b/pkgs/kfwproxy/default.nix @@ -0,0 +1,19 @@ +{ fetchFromGitHub, buildGoModule, lib, ... }: +buildGoModule rec { + pname = "kfwproxy"; + version = "unstable"; + + src = fetchFromGitHub { + owner = "pgaskin"; + repo = "kfwproxy"; + rev = "fd068fe"; + hash = "sha256-0d0ovn7omZkDW8Oj8m//hwo9h6R3/COYMSneIDp5nQM="; + }; + + vendorHash = "sha256-Ps5ofzM7S5FyEQ27OT/6MgB3KvOpawEAf/ReKcKE8x4="; + + meta = with lib; { + homepage = "https://github.com/pgaskin/kfwproxy"; + license = licenses.mit; + }; +} diff --git a/pkgs/kobo-manager/script.sh b/pkgs/kobo-manager/script.sh new file mode 100755 index 0000000..16bec7f --- /dev/null +++ b/pkgs/kobo-manager/script.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +set -euo pipefail + +local koboConfigurations="koboConfigurations" + +function setWorkDir() { + if [[ ! -v WORK_DIR ]]; then + WORK_DIR="$(mktemp --tmpdir -d kobo-manager-build.XXXXXXXXX)" + + trap "rm -r '$WORK_DIR'" EXIT + fi +} + +function setFlakeAttribute() { + local flake="${FLAKE_ARG%#*}" + local name="default" + + case $FLAKE_ARG in + *#*) local name="${FLAKE_ARG#*#}" ;; + esac + + export FLAKE_CONFIG_URI="$flake#\"$koboConfigurations\".\"$name\"" +} diff --git a/pkgs/misc/firmware-check.nix b/pkgs/misc/firmware-check.nix new file mode 100644 index 0000000..53cd2c2 --- /dev/null +++ b/pkgs/misc/firmware-check.nix @@ -0,0 +1,12 @@ +{ writeShellApplication, jq, curl, ... }: +{ deviceID, affiliate ? "kobo" }: +writeShellApplication { + name = "kobo-check-firmware"; + runtimeInputs = [ + curl + jq + ]; + text = '' + curl --silent "https://api.kobobooks.com/1.0/UpgradeCheck/Device/${deviceID}/${affiliate}/0.0/N0" | jq '.UpgradeURL' + ''; +} diff --git a/pkgs/misc/unlock.nix b/pkgs/misc/unlock.nix new file mode 100644 index 0000000..dee313a --- /dev/null +++ b/pkgs/misc/unlock.nix @@ -0,0 +1,28 @@ +{ sqlite3, kobo-utils, writeShellApplication, ... }: +writeShellApplication { + name = "kobo-unlock"; + runtimeInputs = [ + sqlite3 + kobo-utils + ]; + text = '' + KOBOMNT="$(kobo-find)" + KOBOSQL="$KOBOMNT/.kobo/KoboReader.sqlite3" + + if [ -z "$KOBOMNT" ]; then + >&2 echo "Cannot find a mounted Kobo ereader..." + exit 1 + elif [ ! -f "$KOBOSQL" ]; then + >&2 echo "Cannot find the file $KOBOSQL" + exit 1 + fi + + echo "Inserting dummy user into $KOBOSQL" + + sqlite3 "$KOBOSQL" \ + 'INSERT INTO user(UserID,UserKey) VALUES("1","");' \ + '.exit' + + echo "Success!" + ''; +} diff --git a/pkgs/plato/default.nix b/pkgs/plato/default.nix index 2c7b5df..548363b 100644 --- a/pkgs/plato/default.nix +++ b/pkgs/plato/default.nix @@ -1,9 +1,7 @@ -{ stdenvNoCC, fetchzip, lib, ... }: -let - version = "0.9.43"; -in stdenvNoCC.mkDerivation (finalAttrs: { +{ stdenvNoCC, fetchzip, fetchFromGitHub, lib, ... }: +stdenvNoCC.mkDerivation (finalAttrs: { pname = "plato"; - inherit version; + version = "0.9.43"; src = fetchzip { url = "https://github.com/baskerville/plato/releases/download/${finalAttrs.version}/plato-${finalAttrs.version}.zip"; @@ -11,9 +9,14 @@ in stdenvNoCC.mkDerivation (finalAttrs: { hash = "sha256-1E9trfAF3w0+ix8JVDJwYjWQ/dfsLjLPmkCLJAYXkZU="; }; - picSrc = fetchzip { - url = "https://github.com/baskerville/plato/archive/refs/tags/${version}.zip"; - hash = "sha256-u9d/8C9rRb0glZR07tqz/d8EXO0bRddXlCFDje7ow2Y="; + picSrc = fetchFromGitHub { + owner = "baskerville"; + repo = "plato"; + rev = "${finalAttrs.version}"; + sparseCheckout = [ + "artworks/plato.png" + ]; + hash = "sha256-aZiEzZFeqUUMcBU7dg6xO6RF01lBlSmGsxNni/2pciY="; }; outputs = [ |
