aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/affiliates.nix8
-rw-r--r--data/devices.nix122
-rw-r--r--flake.nix2
-rw-r--r--modules/device/default.nix41
-rw-r--r--modules/firmware/default.nix12
-rw-r--r--modules/kobo/default.nix5
-rw-r--r--overlays/default.nix8
-rw-r--r--pkgs/firmware/default.nix16
-rw-r--r--pkgs/kfwproxy/default.nix19
-rwxr-xr-xpkgs/kobo-manager/script.sh24
-rw-r--r--pkgs/misc/firmware-check.nix12
-rw-r--r--pkgs/misc/unlock.nix28
-rw-r--r--pkgs/plato/default.nix19
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";
+ # };
+}
diff --git a/flake.nix b/flake.nix
index 9649bc3..8827dab 100644
--- a/flake.nix
+++ b/flake.nix
@@ -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 = [